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 入参(英文逗号分隔,忽略大小写)。 /// public static List ParseAccessPermissionCodes(string accessPermissions) { return accessPermissions .Split(new[] { ',', ';', '\n', '\r' }, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) .Where(c => !string.IsNullOrWhiteSpace(c)) .Select(c => c.Trim()) .Distinct(StringComparer.OrdinalIgnoreCase) .ToList(); } }