diff --git a/src/Api/TakeoutSaaS.TenantApi/Controllers/AuthController.cs b/src/Api/TakeoutSaaS.TenantApi/Controllers/AuthController.cs index 4bc572b..223e8d7 100644 --- a/src/Api/TakeoutSaaS.TenantApi/Controllers/AuthController.cs +++ b/src/Api/TakeoutSaaS.TenantApi/Controllers/AuthController.cs @@ -2,15 +2,17 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using TakeoutSaaS.Application.Identity.Abstractions; using TakeoutSaaS.Application.Identity.Contracts; +using TakeoutSaaS.Shared.Abstractions.Constants; using TakeoutSaaS.Shared.Abstractions.Results; using TakeoutSaaS.Shared.Web.Api; +using TakeoutSaaS.Shared.Web.Security; namespace TakeoutSaaS.TenantApi.Controllers; /// /// 租户管理端登录认证。 /// -/// 仅允许租户管理员登录获取 Token。 +/// 提供登录、刷新 Token、获取用户信息及菜单等能力。 [ApiVersion("1.0")] [Authorize] [Route("api/tenant/v{version:apiVersion}/auth")] @@ -51,4 +53,87 @@ public sealed class AuthController(IAdminAuthService authService) : BaseApiContr // 2. 返回新的令牌 return ApiResponse.Ok(response); } + + /// + /// 获取当前用户信息。 + /// + /// + /// 示例响应: + /// + /// { + /// "success": true, + /// "code": 200, + /// "data": { + /// "userId": "900123456789012345", + /// "account": "admin", + /// "displayName": "租户管理员", + /// "tenantId": "100000000000000001", + /// "roles": ["tenant-admin"], + /// "permissions": ["identity:profile:read", "merchant:read"] + /// } + /// } + /// + /// + /// 取消标记。 + /// 当前用户档案信息。 + [HttpGet("profile")] + [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status401Unauthorized)] + public async Task> GetProfile(CancellationToken cancellationToken) + { + // 1. 从 JWT 中获取当前用户标识 + var userId = User.GetUserId(); + if (userId == 0) + { + return ApiResponse.Error(ErrorCodes.Unauthorized, "Token 缺少有效的用户标识"); + } + + // 2. 读取用户档案并返回 + var profile = await authService.GetProfileAsync(userId, cancellationToken); + return ApiResponse.Ok(profile); + } + + /// + /// 获取当前用户的权限码列表。 + /// + /// 取消标记。 + /// 权限码数组。 + [HttpGet("permissions")] + [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status401Unauthorized)] + public async Task> GetPermissions(CancellationToken cancellationToken) + { + // 1. 从 JWT 中获取当前用户标识 + var userId = User.GetUserId(); + if (userId == 0) + { + return ApiResponse.Error(ErrorCodes.Unauthorized, "Token 缺少有效的用户标识"); + } + + // 2. 读取用户档案获取权限 + var profile = await authService.GetProfileAsync(userId, cancellationToken); + return ApiResponse.Ok(profile.Permissions); + } + + /// + /// 获取当前用户的菜单树(按权限过滤)。 + /// + /// 取消标记。 + /// 当前用户可见的菜单树。 + [HttpGet("menu")] + [ProducesResponseType(typeof(ApiResponse>), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ApiResponse>), StatusCodes.Status401Unauthorized)] + public async Task>> GetMenuTree(CancellationToken cancellationToken) + { + // 1. 获取当前用户标识 + var userId = User.GetUserId(); + if (userId == 0) + { + return ApiResponse>.Error(ErrorCodes.Unauthorized, "Token 缺少有效的用户标识"); + } + + // 2. 生成菜单树 + var menu = await authService.GetMenuTreeAsync(userId, cancellationToken); + return ApiResponse>.Ok(menu); + } } diff --git a/src/Api/TakeoutSaaS.TenantApi/Controllers/MeController.cs b/src/Api/TakeoutSaaS.TenantApi/Controllers/MeController.cs deleted file mode 100644 index dc06827..0000000 --- a/src/Api/TakeoutSaaS.TenantApi/Controllers/MeController.cs +++ /dev/null @@ -1,41 +0,0 @@ -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Mvc; -using TakeoutSaaS.Application.Identity.Abstractions; -using TakeoutSaaS.Application.Identity.Contracts; -using TakeoutSaaS.Shared.Abstractions.Constants; -using TakeoutSaaS.Shared.Abstractions.Results; -using TakeoutSaaS.Shared.Web.Api; -using TakeoutSaaS.Shared.Web.Security; - -namespace TakeoutSaaS.TenantApi.Controllers; - -/// -/// 当前租户管理员信息。 -/// -[ApiVersion("1.0")] -[Authorize(Roles = "tenant-admin")] -[Route("api/tenant/v{version:apiVersion}/me")] -public sealed class MeController(IAdminAuthService authService) : BaseApiController -{ - /// - /// 获取当前用户档案。 - /// - /// 取消标记。 - /// 当前用户档案信息。 - [HttpGet] - [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)] - [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status401Unauthorized)] - public async Task> Get(CancellationToken cancellationToken) - { - // 1. 从 JWT 中解析用户标识 - var userId = User.GetUserId(); - if (userId == 0) - { - return ApiResponse.Error(ErrorCodes.Unauthorized, "Token 缺少有效的用户标识"); - } - - // 2. 查询用户档案并返回 - var profile = await authService.GetProfileAsync(userId, cancellationToken); - return ApiResponse.Ok(profile); - } -}