feat: profile 返回当前套餐名称
All checks were successful
Build and Deploy TenantApi / build-and-deploy (push) Successful in 38s

在认证档案中增加 packageName 字段,并基于租户当前有效订阅从套餐表读取名称返回给前端,便于头像下拉直接展示真实套餐信息。
This commit is contained in:
2026-02-06 13:03:41 +08:00
parent ec5293d892
commit a0e0848af7
3 changed files with 41 additions and 3 deletions

View File

@@ -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"]
/// }

View File

@@ -44,4 +44,9 @@ public sealed class CurrentUserProfile
/// 头像地址(可选)。
/// </summary>
public string? Avatar { get; init; }
/// <summary>
/// 当前订阅套餐名称(可选)。
/// </summary>
public string? PackageName { get; init; }
}

View File

@@ -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<IdentityUser> passwordHasher,
IJwtTokenService jwtTokenService,
IRefreshTokenStore refreshTokenStore,
@@ -229,12 +232,20 @@ public sealed class AdminAuthService(
private async Task<CurrentUserProfile> 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<string?> 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. 读取当前租户