Skip to main content

tdm_server_rust/service/
login_service.rs

1//! 登录/注册业务服务 (Login Service)
2//!
3//! 轻量代理层,实际逻辑委托给 [`MemberService`]。
4
5use crate::{
6    app::AppState,
7    entity::member::{MemberLoginRequest, Reg},
8    error::ApiResult,
9    service::member_service::MemberService,
10};
11
12/// 登录服务
13///
14/// 对外暴露 `POST /api/login` 和 `POST /api/reg` 两个端点的业务逻辑。
15/// 实际实现委托给 [`MemberService`]。
16pub struct LoginService;
17
18impl LoginService {
19    /// 组员登录。
20    ///
21    /// 验证用户名/密码,成功时签发 JWT Token。
22    ///
23    /// # 返回值
24    ///
25    /// - `Ok(Some(token))` — 登录成功,返回 JWT 字符串
26    /// - `Ok(None)` — 用户名不存在或密码错误
27    /// - `Err(AppError::LoginExpired)` — 组员已退组
28    ///
29    /// # Errors
30    ///
31    /// 数据库查询失败时返回 `AppError::Database`。
32    #[tracing::instrument(skip_all, level = "debug")]
33    pub async fn login(state: &AppState, req: MemberLoginRequest) -> ApiResult<Option<String>> {
34        MemberService::login(state, req).await
35    }
36
37    /// 组员注册。
38    ///
39    /// 验证邀请码有效性,检查用户名/邮箱唯一性,bcrypt 加密密码。
40    ///
41    /// # 返回值
42    ///
43    /// - `Ok(())` — 注册成功
44    ///
45    /// # Errors
46    ///
47    /// - `AppError::business("邀请码无效喵!")` — 邀请码不存在或已被使用
48    /// - `AppError::unique("用户名")` — 用户名重复
49    /// - `AppError::unique("邮箱")` — 邮箱已被注册
50    #[tracing::instrument(skip_all, level = "debug")]
51    pub async fn register(state: &AppState, reg: Reg) -> ApiResult<()> {
52        MemberService::register_member(state, reg).await
53    }
54}