use axum::{extract::State, http::StatusCode, response::IntoResponse, Json}; use api_types::{requests::{LoginRequest, RegisterRequest}, responses::{AuthResponse, UserResponse}}; use application::use_cases::auth::{login, register, LoginInput, RegisterInput}; use crate::{errors::ApiError, state::AppState}; pub fn to_user_response(u: &domain::models::user::User) -> UserResponse { UserResponse { id: u.id.as_uuid(), username: u.username.to_string(), display_name: u.display_name.clone(), bio: u.bio.clone(), avatar_url: u.avatar_url.clone(), header_url: u.header_url.clone(), local: u.local, created_at: u.created_at, } } pub async fn post_register(State(s): State, Json(body): Json) -> Result { let out = register(&*s.users, &*s.hasher, &*s.auth, &*s.events, RegisterInput { username: body.username, email: body.email, password: body.password, }).await?; let resp = AuthResponse { token: out.token, user: to_user_response(&out.user) }; Ok((StatusCode::CREATED, Json(resp))) } pub async fn post_login(State(s): State, Json(body): Json) -> Result { let out = login(&*s.users, &*s.hasher, &*s.auth, LoginInput { email: body.email, password: body.password, }).await?; Ok(Json(AuthResponse { token: out.token, user: to_user_response(&out.user) })) }