56 lines
1.6 KiB
Rust
56 lines
1.6 KiB
Rust
|
|
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),
|
||
|
|
)),
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|