Skip to main content

tdm_server_rust/web/
login_controller.rs

1//! 登录/注册接口 (Login Controller)
2//!
3//! 用户登录、注册、邀请码管理。
4//! 对应 Java LoginController。
5
6use crate::{
7    app::AppState,
8    common::AppJson,
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(
26            "/invitationCodes",
27            get(get_invitation_codes).post(add_invitation_code),
28        )
29        .route("/invitationCodes/:id", delete(delete_invitation_code))
30}
31
32/// 用户登录
33#[tracing::instrument(skip_all, level = "info")]
34pub async fn login(
35    State(state): State<AppState>,
36    AppJson(req): AppJson<MemberLoginRequest>,
37) -> ApiResult<ResultBody<String>> {
38    match LoginService::login(&state, req).await? {
39        Some(jwt) => Ok(ResultBody::success_data(jwt)),
40        None => Ok(ResultBody {
41            code: ErrorCode::SYSTEM_ERROR,
42            msg: "用户名(或者QQ号)与密码不匹配喵……".into(),
43            data: None,
44        }),
45    }
46}
47
48/// 用户注册
49#[tracing::instrument(skip_all, level = "info")]
50pub async fn reg(
51    State(state): State<AppState>,
52    AppJson(body): AppJson<Reg>,
53) -> ApiResult<ResultBody<()>> {
54    LoginService::register(&state, body).await?;
55    Ok(ResultBody::success())
56}
57
58/// 邀请码列表
59#[tracing::instrument(skip_all, level = "info")]
60pub async fn get_invitation_codes(
61    State(state): State<AppState>,
62) -> ApiResult<ResultBody<Vec<InvitationCode>>> {
63    let data = MemberService::get_invitation_codes(&state).await?;
64    Ok(ResultBody::success_data(data))
65}
66
67/// 删除邀请码
68#[tracing::instrument(skip_all, level = "info")]
69pub async fn delete_invitation_code(
70    State(state): State<AppState>,
71    Path(id): Path<i32>,
72) -> ApiResult<ResultBody<()>> {
73    MemberService::delete_invitation_code(&state, id).await?;
74    Ok(ResultBody::success())
75}
76
77/// 新增邀请码
78#[tracing::instrument(skip_all, level = "info")]
79pub async fn add_invitation_code(
80    State(state): State<AppState>,
81    AppJson(body): AppJson<InvitationCode>,
82) -> ApiResult<ResultBody<()>> {
83    MemberService::add_invitation_code(&state, body).await?;
84    Ok(ResultBody::success())
85}