64 lines
1.6 KiB
Rust
64 lines
1.6 KiB
Rust
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<AppState>,
|
|
Json(payload): Json<RegisterRequest>,
|
|
) -> Result<(StatusCode, Json<UserResponse>), 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<AppState>,
|
|
Json(payload): Json<LoginRequest>,
|
|
) -> Result<Json<LoginResponse>, 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<AppState> {
|
|
axum::Router::new()
|
|
.route("/register", axum::routing::post(register))
|
|
.route("/login", axum::routing::post(login))
|
|
}
|