use crate::errors::ApiError; use crate::services::me::MeResponse; use api::http::State; use api::middleware::RequestId; use api::rest::{AppResponseData, NoData}; use session::Session; #[utoipa::path( get, path = "/auth/me", tag = "auth", operation_id = "auth_me", summary = "当前登录用户", description = "通过会话 Cookie 返回用户自述信息。结果在服务端缓存 300 秒,每第 5 次访问回源刷新;登出与改密会主动失效该缓存。", responses( (status = 200, description = "当前登录用户", body = AppResponseData, example = json!({"code":200,"message":"success","data":{"user_id":1024,"username":"ada","displayname":"Ada","email":"ada@example.com","is_admin":false,"avatar_url":"https://cdn.example.com/avatar/ada.png","email_verified_at":"2026-01-05T08:30:00Z","created_at":"2025-11-20T02:15:00Z","version":3}})), (status = 401, description = "会话未绑定用户,或账号已被删除(`unauthenticated`)", body = AppResponseData, example = json!({"code": "unauthenticated", "message": "authentication required"})), (status = 500, description = "服务端故障(`internal`、`database`、`cache`、`session`、`serialization`)", body = AppResponseData, example = json!({"code": "internal", "message": "internal server error"})) ) )] pub async fn me( State(svc): State, session: Session, request_id: RequestId, ) -> Result, ApiError> { let response = svc.me(session, request_id.0).await?; Ok(AppResponseData::ok(response)) }