using SqlSugar;
using Volo.Abp.Users;
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;
}
return await IsCompanyAdminUserAsync(db, currentUser.Id.Value);
}
///
/// 指定用户是否为 Company Admin 类角色(按库内 Role 判定,用于登录等无 JWT 声明场景)。
///
public static async Task IsCompanyAdminUserAsync(ISqlSugarClient db, Guid userId)
{
var roleRows = await LoadUserRoleRowsAsync(db, userId);
return roleRows.Any(r =>
IsCompanyAdminRoleName(r.RoleName) || IsCompanyAdminRoleToken(r.RoleCode));
}
///
/// 是否 Company Admin 类角色(按 RoleId 查库)。
///
public static async Task IsCompanyAdminRoleAsync(ISqlSugarClient db, Guid? roleId)
{
if (roleId is null)
{
return false;
}
var roleRows = await db.Ado.SqlQueryAsync(
"""
SELECT RoleCode, RoleName
FROM Role
WHERE IsDeleted = 0 AND Id = @RoleId
LIMIT 1
""",
new { RoleId = roleId.Value });
var role = roleRows.FirstOrDefault();
if (role is null)
{
return false;
}
return IsCompanyAdminRoleName(role.RoleName) || IsCompanyAdminRoleToken(role.RoleCode);
}
///
/// 读取用户角色(raw SQL,避免 RBAC 数据权限过滤器中 Select 表达式导致 SqlSugar 解析失败)。
///
private static Task> LoadUserRoleRowsAsync(ISqlSugarClient db, Guid userId) =>
db.Ado.SqlQueryAsync(
"""
SELECT r.RoleCode, r.RoleName
FROM UserRole ur
INNER JOIN Role r ON ur.RoleId = r.Id
WHERE ur.UserId = @UserId AND r.IsDeleted = 0 AND r.State = 1
""",
new { UserId = userId });
///
/// 列表/详情出参: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());
private sealed class UserRoleNameRow
{
public string? RoleCode { get; set; }
public string? RoleName { get; set; }
}
}