You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

40 lines
1.0 KiB

use axum::{Json, Router, extract::State, routing::post};
use serde::{Deserialize, Serialize};
use std::sync::Arc;
use crate::error::ErrorResponse;
use crate::state::AppState;
#[derive(Debug, Deserialize)]
pub struct LoginRequest {
pub token: Option<String>,
}
#[derive(Debug, Serialize)]
pub struct LoginResponse {
pub user_id: String,
pub email: Option<String>,
pub roles: Vec<String>,
}
pub async fn login_handler(
State(state): State<Arc<AppState>>,
Json(req): Json<LoginRequest>,
) -> Result<Json<LoginResponse>, ErrorResponse> {
let token = req.token.ok_or_else(|| ErrorResponse {
error: "Invalid input".to_string(),
message: Some("Token field is required".to_string()),
})?;
let claims = state.dependencies.auth_service.authenticate(&token).await?;
Ok(Json(LoginResponse {
user_id: claims.user_id,
email: claims.email,
roles: claims.roles,
}))
}
pub fn routes() -> Router<Arc<AppState>> {
Router::new().route("/login", post(login_handler))
}