Skip to main content

tdm_server_rust/web/
login_controller.rs

1//! 登录/注册接口 (Login Controller)
2//!
3//! 用户登录、注册、邀请码管理。
4//! 对应 Java LoginController。
5
6use crate::{
7    common::AppJson,
8    app::AppState,
9    common::{error_code::ErrorCode, result::ResultBody},
10    entity::member::{InvitationCode, MemberLoginRequest, Reg},
11    error::ApiResult,
12    service::{login_service::LoginService, member_service::MemberService},
13};
14use axum::{
15    extract::{Path, State},
16    routing::{delete, get, post},
17    Router,
18};
19
20/// 登录相关路由(挂载于 `/api`)
21pub fn routes() -> Router<AppState> {
22    Router::new()
23        .route("/login", post(login))
24        .route("/reg", post(reg))
25        .route("/invitationCodes", get(get_invitation_codes).post(add_invitation_code))
26        .route("/invitationCodes/:id", delete(delete_invitation_code))
27}
28
29/// 用户登录
30#[tracing::instrument(skip_all, level = "info")]
31pub async fn login(
32    State(state): State<AppState>,
33    AppJson(req): AppJson<MemberLoginRequest>,
34) -> ApiResult<ResultBody<String>> {
35    match LoginService::login(&state, req).await? {
36        Some(jwt) => Ok(ResultBody::success_data(jwt)),
37        None => Ok(ResultBody {
38            code: ErrorCode::SYSTEM_ERROR,
39            msg: "用户名(或者QQ号)与密码不匹配喵……".into(),
40            data: None,
41        }),
42    }
43}
44
45/// 用户注册
46#[tracing::instrument(skip_all, level = "info")]
47pub async fn reg(
48    State(state): State<AppState>,
49    AppJson(body): AppJson<Reg>,
50) -> ApiResult<ResultBody<()>> {
51    LoginService::register(&state, body).await?;
52    Ok(ResultBody::success())
53}
54
55/// 邀请码列表
56#[tracing::instrument(skip_all, level = "info")]
57pub async fn get_invitation_codes(
58    State(state): State<AppState>,
59) -> ApiResult<ResultBody<Vec<InvitationCode>>> {
60    let data = MemberService::get_invitation_codes(&state).await?;
61    Ok(ResultBody::success_data(data))
62}
63
64/// 删除邀请码
65#[tracing::instrument(skip_all, level = "info")]
66pub async fn delete_invitation_code(
67    State(state): State<AppState>,
68    Path(id): Path<i32>,
69) -> ApiResult<ResultBody<()>> {
70    MemberService::delete_invitation_code(&state, id).await?;
71    Ok(ResultBody::success())
72}
73
74/// 新增邀请码
75#[tracing::instrument(skip_all, level = "info")]
76pub async fn add_invitation_code(
77    State(state): State<AppState>,
78    AppJson(body): AppJson<InvitationCode>,
79) -> ApiResult<ResultBody<()>> {
80    MemberService::add_invitation_code(&state, body).await?;
81    Ok(ResultBody::success())
82}