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",
|
/// "account": "admin",
|
||||||
/// "displayName": "租户管理员",
|
/// "displayName": "租户管理员",
|
||||||
/// "tenantId": "100000000000000001",
|
/// "tenantId": "100000000000000001",
|
||||||
|
/// "packageName": "标准版",
|
||||||
/// "roles": ["tenant-admin"],
|
/// "roles": ["tenant-admin"],
|
||||||
/// "permissions": ["identity:profile:read", "merchant:read"]
|
/// "permissions": ["identity:profile:read", "merchant:read"]
|
||||||
/// }
|
/// }
|
||||||
|
|||||||
@@ -44,4 +44,9 @@ public sealed class CurrentUserProfile
|
|||||||
/// 头像地址(可选)。
|
/// 头像地址(可选)。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public string? Avatar { get; init; }
|
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.Entities;
|
||||||
using TakeoutSaaS.Domain.Identity.Enums;
|
using TakeoutSaaS.Domain.Identity.Enums;
|
||||||
using TakeoutSaaS.Domain.Identity.Repositories;
|
using TakeoutSaaS.Domain.Identity.Repositories;
|
||||||
|
using TakeoutSaaS.Domain.Tenants.Repositories;
|
||||||
using TakeoutSaaS.Shared.Abstractions.Constants;
|
using TakeoutSaaS.Shared.Abstractions.Constants;
|
||||||
using TakeoutSaaS.Shared.Abstractions.Exceptions;
|
using TakeoutSaaS.Shared.Abstractions.Exceptions;
|
||||||
using TakeoutSaaS.Shared.Abstractions.Results;
|
using TakeoutSaaS.Shared.Abstractions.Results;
|
||||||
@@ -21,6 +22,8 @@ public sealed class AdminAuthService(
|
|||||||
IPermissionRepository permissionRepository,
|
IPermissionRepository permissionRepository,
|
||||||
IRolePermissionRepository rolePermissionRepository,
|
IRolePermissionRepository rolePermissionRepository,
|
||||||
IMenuRepository menuRepository,
|
IMenuRepository menuRepository,
|
||||||
|
ITenantRepository tenantRepository,
|
||||||
|
ITenantPackageRepository tenantPackageRepository,
|
||||||
IPasswordHasher<IdentityUser> passwordHasher,
|
IPasswordHasher<IdentityUser> passwordHasher,
|
||||||
IJwtTokenService jwtTokenService,
|
IJwtTokenService jwtTokenService,
|
||||||
IRefreshTokenStore refreshTokenStore,
|
IRefreshTokenStore refreshTokenStore,
|
||||||
@@ -229,12 +232,20 @@ public sealed class AdminAuthService(
|
|||||||
|
|
||||||
private async Task<CurrentUserProfile> BuildProfileAsync(IdentityUser user, CancellationToken cancellationToken)
|
private async Task<CurrentUserProfile> BuildProfileAsync(IdentityUser user, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
|
// 1. 读取用户角色
|
||||||
var tenantId = user.TenantId;
|
var tenantId = user.TenantId;
|
||||||
var roles = await ResolveUserRolesAsync(tenantId, user.Id, cancellationToken);
|
var roles = await ResolveUserRolesAsync(tenantId, user.Id, cancellationToken);
|
||||||
// 1. 强制仅允许租户管理员登录(不支持超级管理员)
|
|
||||||
|
// 2. 强制仅允许租户管理员登录(不支持超级管理员)
|
||||||
EnsureTenantAdmin(tenantId, roles);
|
EnsureTenantAdmin(tenantId, roles);
|
||||||
// 2. 加载权限并返回档案
|
|
||||||
|
// 3. 加载权限
|
||||||
var permissions = await ResolveUserPermissionsAsync(tenantId, user.Id, cancellationToken);
|
var permissions = await ResolveUserPermissionsAsync(tenantId, user.Id, cancellationToken);
|
||||||
|
|
||||||
|
// 4. 读取当前套餐名称(严格以数据库为准)
|
||||||
|
var packageName = await ResolveTenantPackageNameAsync(tenantId, cancellationToken);
|
||||||
|
|
||||||
|
// 5. 返回用户档案
|
||||||
return new CurrentUserProfile
|
return new CurrentUserProfile
|
||||||
{
|
{
|
||||||
UserId = user.Id,
|
UserId = user.Id,
|
||||||
@@ -244,10 +255,31 @@ public sealed class AdminAuthService(
|
|||||||
MerchantId = user.MerchantId,
|
MerchantId = user.MerchantId,
|
||||||
Roles = roles,
|
Roles = roles,
|
||||||
Permissions = permissions,
|
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)
|
private void EnsureTenantMatched(long userTenantId)
|
||||||
{
|
{
|
||||||
// 1. 读取当前租户
|
// 1. 读取当前租户
|
||||||
|
|||||||
Reference in New Issue
Block a user