using Application.Abstractions.Identity; using Application.Abstractions.Identity.Models; using Microsoft.AspNetCore.Identity; using System.Security.Claims; namespace Infrastructure.Persistence.Identity { public sealed class IdentityRoleWriter(RoleManager roleManager) : IIdentityRoleWriter { public async Task CreateRoleAsync(string roleName, CancellationToken ct) { var name = roleName?.Trim(); if (string.IsNullOrWhiteSpace(name)) { throw new InvalidOperationException("¿ªÇÒ À̸§Àº ÇʼöÀÔ´Ï´Ù."); } if (name.Length > 256) { throw new InvalidOperationException("¿ªÇÒ À̸§Àº 256ÀÚ¸¦ ÃʰúÇÒ ¼ö ¾ø½À´Ï´Ù."); } if (await roleManager.RoleExistsAsync(name)) { throw new InvalidOperationException($"{name} Àº ÀÌ¹Ì Á¸ÀçÇÕ´Ï´Ù."); } var result = await roleManager.CreateAsync(new IdentityRole(name)); if (!result.Succeeded) { throw new InvalidOperationException(string.Join(Environment.NewLine, result.Errors.Select(e => e.Description))); } } public async Task DeleteRoleAsync(string roleID, CancellationToken ct) { if (string.IsNullOrWhiteSpace(roleID)) { throw new InvalidOperationException("Role ID´Â ÇʼöÀÔ´Ï´Ù."); } var role = await roleManager.FindByIdAsync(roleID); if (role is null) { throw new InvalidOperationException("¿ªÇÒÀ» ãÀ» ¼ö ¾ø½À´Ï´Ù."); } var result = await roleManager.DeleteAsync(role); if (!result.Succeeded) { throw new InvalidOperationException(string.Join(Environment.NewLine, result.Errors.Select(e => e.Description))); } } public async Task UpdateRoleAsync(string roleID, PermissionDto permission, CancellationToken ct) { if (string.IsNullOrWhiteSpace(roleID)) { throw new InvalidOperationException("Role ID´Â ÇʼöÀÔ´Ï´Ù."); } var role = await roleManager.FindByIdAsync(roleID); if (role == null) { throw new InvalidOperationException("¿ªÇÒÀ» ãÀ» ¼ö ¾ø½À´Ï´Ù."); } // ±âÁ¸ ±ÇÇÑ Á¦°Å var existingRoleClaims = await roleManager.GetClaimsAsync(role); foreach (var claim in existingRoleClaims.Where(c => c.Type == "Permission")) { var removed = await roleManager.RemoveClaimAsync(role, claim); if (!removed.Succeeded) { throw new InvalidOperationException(string.Join(Environment.NewLine, removed.Errors.Select(e => e.Description))); } } // ¼±ÅÃµÈ ±ÇÇÑ ÃßÃâ var selectedClaims = permission.RoleClaims.SelectMany(c => c.Permissions).Where(c => c.IsSelected).Select(c => c.DisplayValue).Where(v => !string.IsNullOrWhiteSpace(v)).ToList(); if (selectedClaims is not null) { foreach (var value in selectedClaims) { var added = await roleManager.AddClaimAsync(role, new Claim("Permission", value!)); if (!added.Succeeded) { throw new InvalidOperationException(string.Join(Environment.NewLine, added.Errors.Select(e => e.Description))); } } } } } }