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}