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
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)) |
|
}
|
|
|