use axum::{
extract::{State, Path},
Json,
Extension,
};
use lmrc_http_common::{HttpResult, SuccessResponse, EmptyResponse};
use crate::state::AppState;
use super::{service::AuthService, models::*};
pub async fn get_current_user(
State(state): State<AppState>,
Extension(user): Extension<CurrentUser>,
) -> HttpResult<Json<SuccessResponse<UserResponse>>> {
tracing::info!("Getting user info for user: {}", user.id);
let service = AuthService::new(state.db.clone(), state.config.jwt_secret.clone());
let user_info = service.get_user(user.id).await?;
Ok(Json(SuccessResponse::new(user_info)))
}
pub async fn create_api_token(
State(state): State<AppState>,
Extension(user): Extension<CurrentUser>,
Json(request): Json<CreateTokenRequest>,
) -> HttpResult<Json<SuccessResponse<CreateTokenResponse>>> {
tracing::info!("Creating API token '{}' for user: {}", request.name, user.id);
let service = AuthService::new(state.db.clone(), state.config.jwt_secret.clone());
let token = service.create_api_token(
user.id,
request.name,
request.scopes,
request.expires_in_days,
).await?;
Ok(Json(SuccessResponse::new(token)))
}
pub async fn list_api_tokens(
State(state): State<AppState>,
Extension(user): Extension<CurrentUser>,
) -> HttpResult<Json<SuccessResponse<ApiTokensListResponse>>> {
tracing::info!("Listing API tokens for user: {}", user.id);
let service = AuthService::new(state.db.clone(), state.config.jwt_secret.clone());
let tokens = service.list_api_tokens(user.id).await?;
Ok(Json(SuccessResponse::new(tokens)))
}
pub async fn revoke_api_token(
State(state): State<AppState>,
Extension(user): Extension<CurrentUser>,
Path(token_id): Path<String>,
) -> HttpResult<Json<EmptyResponse>> {
tracing::info!("Revoking API token {} for user: {}", token_id, user.id);
let service = AuthService::new(state.db.clone(), state.config.jwt_secret.clone());
service.revoke_api_token(user.id, &token_id).await?;
Ok(Json(EmptyResponse::new()))
}