lmrc-cli 0.3.16

CLI tool for scaffolding LMRC Stack infrastructure projects
Documentation
//! HTTP handlers for authentication endpoints

use axum::{
    extract::{State, Path},
    Json,
    Extension,
};
use lmrc_http_common::{HttpResult, SuccessResponse, EmptyResponse};
use crate::state::AppState;
use super::{service::AuthService, models::*};

/// GET /api/auth/me
/// Get current user information
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)))
}

/// POST /api/auth/tokens
/// Create a new API token
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)))
}

/// GET /api/auth/tokens
/// List user's API tokens
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)))
}

/// DELETE /api/auth/tokens/:id
/// Revoke an API token
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()))
}