using SqlSugar;
using Volo.Abp.Users;
using Yi.Framework.Rbac.Domain.Entities;
using Yi.Framework.Rbac.Domain.Shared.Consts;
namespace FoodLabeling.Application.Helpers;
///
/// Team Member 角色识别(Company Admin / Partner Admin 等)。
///
public static class TeamMemberRoleHelper
{
///
/// UI 展示为 Company Admin,库内常见为 Partner Admin 或 RoleCode 含 partner / CompanyAdmin。
///
public static bool IsCompanyAdminRoleName(string? roleName)
{
if (string.IsNullOrWhiteSpace(roleName))
{
return false;
}
if (IsCompanyAdminRoleToken(roleName))
{
return true;
}
var name = roleName.Trim();
if (string.Equals(name, "Company Admin", StringComparison.OrdinalIgnoreCase))
{
return true;
}
if (string.Equals(name, "Partner Admin", StringComparison.OrdinalIgnoreCase))
{
return true;
}
return name.Contains("partner", StringComparison.OrdinalIgnoreCase) &&
name.Contains("admin", StringComparison.OrdinalIgnoreCase);
}
///
/// 当前登录用户是否为 Company Admin 类角色(JWT 声明 + 库内 Role)。
///
public static async Task IsCompanyAdminUserAsync(ISqlSugarClient db, ICurrentUser currentUser)
{
if (IsCompanyAdminFromClaims(currentUser))
{
return true;
}
if (currentUser.Id is null)
{
return false;
}
var roleId = await db.Queryable()
.Where(ur => ur.UserId == currentUser.Id.Value)
.Select(ur => (Guid?)ur.RoleId)
.FirstAsync();
return await IsCompanyAdminRoleAsync(db, roleId);
}
///
/// 是否 Company Admin 类角色(按 RoleId 查库)。
///
public static async Task IsCompanyAdminRoleAsync(ISqlSugarClient db, Guid? roleId)
{
if (roleId is null)
{
return false;
}
var role = await db.Queryable()
.FirstAsync(x => !x.IsDeleted && x.Id == roleId.Value);
if (role is null)
{
return false;
}
return IsCompanyAdminRoleName(role.RoleName) || IsCompanyAdminRoleToken(role.RoleCode);
}
///
/// 列表/详情出参:Partner Admin → Company Admin(与 Web UI 一致)。
///
public static string? FormatDisplayRoleName(string? roleName)
{
if (IsCompanyAdminRoleName(roleName) &&
!string.Equals(roleName?.Trim(), "Company Admin", StringComparison.OrdinalIgnoreCase))
{
return "Company Admin";
}
return roleName;
}
///
/// JWT / RoleCode / RoleName 中的 Company Admin 标识(含 CompanyAdmin)。
///
public static bool IsCompanyAdminRoleToken(string? value)
{
if (string.IsNullOrWhiteSpace(value))
{
return false;
}
var key = NormalizeRoleKey(value);
if (key == "companyadmin" || key.Contains("companyadmin", StringComparison.Ordinal))
{
return true;
}
return value.Trim().Contains("partner", StringComparison.OrdinalIgnoreCase);
}
private static bool IsCompanyAdminFromClaims(ICurrentUser currentUser)
{
if (currentUser.Roles is not null)
{
foreach (var r in currentUser.Roles)
{
if (IsCompanyAdminRoleToken(r))
{
return true;
}
}
}
var rolesClaim = currentUser.FindClaims(TokenTypeConst.Roles).Select(x => x.Value).FirstOrDefault();
if (string.IsNullOrWhiteSpace(rolesClaim))
{
return false;
}
foreach (var part in rolesClaim.Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries))
{
if (IsCompanyAdminRoleToken(part))
{
return true;
}
}
return false;
}
private static string NormalizeRoleKey(string value) =>
new string(value.Trim().ToLowerInvariant().Where(c => char.IsLetterOrDigit(c)).ToArray());
}