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 { Router::new() .route("/", get(list_roles).post(create_role)) .route("/:key", get(get_role_by_key)) } async fn create_role( State(state): State, Json(payload): Json, ) -> Result { 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, ) -> Result { 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, Path(key): Path, ) -> Result { 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), )), } }