diff --git a/src/Api/TakeoutSaaS.TenantApi/Controllers/AuthController.cs b/src/Api/TakeoutSaaS.TenantApi/Controllers/AuthController.cs index 223e8d7..7560b56 100644 --- a/src/Api/TakeoutSaaS.TenantApi/Controllers/AuthController.cs +++ b/src/Api/TakeoutSaaS.TenantApi/Controllers/AuthController.cs @@ -68,6 +68,7 @@ public sealed class AuthController(IAdminAuthService authService) : BaseApiContr /// "account": "admin", /// "displayName": "租户管理员", /// "tenantId": "100000000000000001", + /// "packageName": "标准版", /// "roles": ["tenant-admin"], /// "permissions": ["identity:profile:read", "merchant:read"] /// } diff --git a/src/Application/TakeoutSaaS.Application/Identity/Contracts/CurrentUserProfile.cs b/src/Application/TakeoutSaaS.Application/Identity/Contracts/CurrentUserProfile.cs index 995efe2..c3d141f 100644 --- a/src/Application/TakeoutSaaS.Application/Identity/Contracts/CurrentUserProfile.cs +++ b/src/Application/TakeoutSaaS.Application/Identity/Contracts/CurrentUserProfile.cs @@ -44,4 +44,9 @@ public sealed class CurrentUserProfile /// 头像地址(可选)。 /// public string? Avatar { get; init; } + + /// + /// 当前订阅套餐名称(可选)。 + /// + public string? PackageName { get; init; } } diff --git a/src/Application/TakeoutSaaS.Application/Identity/Services/AdminAuthService.cs b/src/Application/TakeoutSaaS.Application/Identity/Services/AdminAuthService.cs index b803c4f..3ed508a 100644 --- a/src/Application/TakeoutSaaS.Application/Identity/Services/AdminAuthService.cs +++ b/src/Application/TakeoutSaaS.Application/Identity/Services/AdminAuthService.cs @@ -4,6 +4,7 @@ using TakeoutSaaS.Application.Identity.Contracts; using TakeoutSaaS.Domain.Identity.Entities; using TakeoutSaaS.Domain.Identity.Enums; using TakeoutSaaS.Domain.Identity.Repositories; +using TakeoutSaaS.Domain.Tenants.Repositories; using TakeoutSaaS.Shared.Abstractions.Constants; using TakeoutSaaS.Shared.Abstractions.Exceptions; using TakeoutSaaS.Shared.Abstractions.Results; @@ -21,6 +22,8 @@ public sealed class AdminAuthService( IPermissionRepository permissionRepository, IRolePermissionRepository rolePermissionRepository, IMenuRepository menuRepository, + ITenantRepository tenantRepository, + ITenantPackageRepository tenantPackageRepository, IPasswordHasher passwordHasher, IJwtTokenService jwtTokenService, IRefreshTokenStore refreshTokenStore, @@ -229,12 +232,20 @@ public sealed class AdminAuthService( private async Task BuildProfileAsync(IdentityUser user, CancellationToken cancellationToken) { + // 1. 读取用户角色 var tenantId = user.TenantId; var roles = await ResolveUserRolesAsync(tenantId, user.Id, cancellationToken); - // 1. 强制仅允许租户管理员登录(不支持超级管理员) + + // 2. 强制仅允许租户管理员登录(不支持超级管理员) EnsureTenantAdmin(tenantId, roles); - // 2. 加载权限并返回档案 + + // 3. 加载权限 var permissions = await ResolveUserPermissionsAsync(tenantId, user.Id, cancellationToken); + + // 4. 读取当前套餐名称(严格以数据库为准) + var packageName = await ResolveTenantPackageNameAsync(tenantId, cancellationToken); + + // 5. 返回用户档案 return new CurrentUserProfile { UserId = user.Id, @@ -244,10 +255,31 @@ public sealed class AdminAuthService( MerchantId = user.MerchantId, Roles = roles, Permissions = permissions, - Avatar = user.Avatar + Avatar = user.Avatar, + PackageName = packageName }; } + private async Task ResolveTenantPackageNameAsync(long tenantId, CancellationToken cancellationToken) + { + // 1. 查询当前有效订阅 + var subscription = await tenantRepository.GetActiveSubscriptionAsync(tenantId, cancellationToken); + if (subscription == null) + { + return null; + } + + // 2. 查询订阅关联套餐 + var package = await tenantPackageRepository.FindByIdAsync(subscription.TenantPackageId, cancellationToken); + if (package == null) + { + return null; + } + + // 3. 返回套餐名称 + return package.Name; + } + private void EnsureTenantMatched(long userTenantId) { // 1. 读取当前租户