nxtgauge-backend-rust/apps/users/src/handlers/roles.rs

56 lines
1.6 KiB
Rust
Raw Normal View History

use crate::AppState;
use axum::{
extract::{Path, State},
http::StatusCode,
response::IntoResponse,
routing::{get, post},
Json, Router,
};
use db::models::role::{CreateRolePayload, RoleRepository};
pub fn router() -> Router<AppState> {
Router::new()
.route("/", get(list_roles).post(create_role))
.route("/{key}", get(get_role_by_key))
}
async fn create_role(
State(state): State<AppState>,
Json(payload): Json<CreateRolePayload>,
) -> Result<impl IntoResponse, (StatusCode, String)> {
match RoleRepository::create(&state.pool, payload).await {
Ok(role) => Ok((StatusCode::CREATED, Json(role))),
Err(e) => Err((
StatusCode::INTERNAL_SERVER_ERROR,
format!("Database error: {}", e),
)),
}
}
async fn list_roles(
State(state): State<AppState>,
) -> Result<impl IntoResponse, (StatusCode, String)> {
match RoleRepository::get_all(&state.pool).await {
Ok(roles) => Ok((StatusCode::OK, Json(roles))),
Err(e) => Err((
StatusCode::INTERNAL_SERVER_ERROR,
format!("Database error: {}", e),
)),
}
}
async fn get_role_by_key(
State(state): State<AppState>,
Path(key): Path<String>,
) -> Result<impl IntoResponse, (StatusCode, String)> {
match RoleRepository::get_by_key(&state.pool, &key).await {
Ok(role) => Ok((StatusCode::OK, Json(role))),
Err(sqlx::Error::RowNotFound) => Err((StatusCode::NOT_FOUND, "Role not found".to_string())),
Err(e) => Err((
StatusCode::INTERNAL_SERVER_ERROR,
format!("Database error: {}", e),
)),
}
}