using System.Text.Json; namespace FoodLabeling.Application.Helpers; /// /// accessPermissions 与 Menu.PermissionCode / Router 的解析辅助。 /// public static class RbacAccessPermissionHelper { /// /// 从路由推导权限码:/labels → menu.labels;/account-management → menu.account-management /// public static string? DerivePermissionCodeFromRouter(string? router) { var r = router?.Trim(); if (string.IsNullOrEmpty(r)) { return null; } var path = r.TrimEnd('/'); if (path.Length == 0) { return null; } var segments = path.Split('/', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); if (segments.Length == 0) { return null; } return "menu." + string.Join(".", segments.Select(s => s.ToLowerInvariant())); } /// /// 优先使用 PermissionCode;为空时按 Router 推导(与回填 SQL 规则一致)。 /// public static string? GetEffectivePermissionCode(string? permissionCode, string? router) { if (!string.IsNullOrWhiteSpace(permissionCode)) { return permissionCode.Trim(); } return DerivePermissionCodeFromRouter(router); } /// /// 解析 accessPermissions 入参:支持 JSON 数组字符串(如 ["manage_labels"])、英文逗号分隔。 /// public static List ParseAccessPermissionCodes(string accessPermissions) { var raw = accessPermissions?.Trim(); if (string.IsNullOrWhiteSpace(raw)) { return new List(); } if (raw.StartsWith('[')) { try { var fromJson = JsonSerializer.Deserialize>(raw); if (fromJson is { Count: > 0 }) { return fromJson .Where(c => !string.IsNullOrWhiteSpace(c)) .Select(c => c.Trim()) .Distinct(StringComparer.OrdinalIgnoreCase) .ToList(); } } catch { // fall through to delimiter split } } return raw .Split(new[] { ',', ';', '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) .Where(c => !string.IsNullOrWhiteSpace(c)) .Select(c => c.Trim()) .Distinct(StringComparer.OrdinalIgnoreCase) .ToList(); } }