feat: profile 返回当前套餐名称
All checks were successful
Build and Deploy TenantApi / build-and-deploy (push) Successful in 38s
All checks were successful
Build and Deploy TenantApi / build-and-deploy (push) Successful in 38s
在认证档案中增加 packageName 字段,并基于租户当前有效订阅从套餐表读取名称返回给前端,便于头像下拉直接展示真实套餐信息。
This commit is contained in:
@@ -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"]
|
||||
/// }
|
||||
|
||||
@@ -44,4 +44,9 @@ public sealed class CurrentUserProfile
|
||||
/// 头像地址(可选)。
|
||||
/// </summary>
|
||||
public string? Avatar { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// 当前订阅套餐名称(可选)。
|
||||
/// </summary>
|
||||
public string? PackageName { get; init; }
|
||||
}
|
||||
|
||||
@@ -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. 读取当前租户
|
||||
|
||||
Reference in New Issue
Block a user