use axum::{Json, extract::State, http::StatusCode}; use libertas_core::schema::{CreateUserData, LoginUserData, UserResponse}; use serde::{Deserialize, Serialize}; use crate::{error::ApiError, state::AppState}; #[derive(Deserialize)] pub struct RegisterRequest { pub username: String, pub email: String, pub password: String, } pub async fn register( State(state): State, Json(payload): Json, ) -> Result<(StatusCode, Json), ApiError> { let user_data = CreateUserData { username: &payload.username, email: &payload.email, password: &payload.password, }; let user = state.user_service.register(user_data).await?; let response = UserResponse { id: user.id, username: user.username, email: user.email, }; Ok((StatusCode::CREATED, Json(response))) } #[derive(Deserialize)] pub struct LoginRequest { pub username_or_email: String, pub password: String, } #[derive(Serialize)] pub struct LoginResponse { token: String, } pub async fn login( State(state): State, Json(payload): Json, ) -> Result, ApiError> { let login_data = LoginUserData { username_or_email: &payload.username_or_email, password: &payload.password, }; let token = state.user_service.login(login_data).await?; Ok(Json(LoginResponse { token })) } pub fn auth_routes() -> axum::Router { axum::Router::new() .route("/register", axum::routing::post(register)) .route("/login", axum::routing::post(login)) }