using Application.Abstractions.Identity; using Application.Abstractions.Identity.Models; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; namespace Infrastructure.Persistence.Identity { public sealed class IdentityUserWriter(UserManager userManager) : IIdentityUserWriter { public async Task UpdateUserAsync(ApplicationUserDto a, CancellationToken ct) { if (string.IsNullOrWhiteSpace(a.ID)) { throw new InvalidOperationException("ID´Â ÇʼöÀÔ´Ï´Ù."); } var user = await userManager.FindByIdAsync(a.ID); if (user is null) { throw new InvalidOperationException("»ç¿ëÀÚ Á¤º¸¸¦ ãÀ» ¼ö ¾ø½À´Ï´Ù."); } // À̸ÞÀÏ Áߺ¹ È®ÀÎ(º»ÀÎ Á¦¿Ü) if (!string.IsNullOrWhiteSpace(a.Email)) { var exists = await userManager.Users.AsNoTracking().AnyAsync(u => u.Email == a.Email && u.Id != a.ID, ct); if (exists) { throw new InvalidOperationException("ÀÌ¹Ì Á¸ÀçÇÏ´Â À̸ÞÀÏ ÁÖ¼ÒÀÔ´Ï´Ù."); } } user.SetFullName(a.Name); user.SetEmail(a.Email); user.SetPhoneNumber(a.Phone); user.SetDeleted(a.IsDeleted); user.SetEmailConfirmed(a.EmailConfirmed); user.SetLockoutEnd(a.LockoutEnd); // ºñ¹Ð¹øÈ£ º¯°æ(ÀԷµǾúÀ» ¶§¸¸) if (!string.IsNullOrWhiteSpace(a.NewPassword)) { if (a.NewPassword != a.ConfirmPassword) { throw new InvalidOperationException("µÎ ºñ¹Ð¹øÈ£°¡ ¼­·Î ÀÏÄ¡ÇÏÁö ¾Ê½À´Ï´Ù."); } var token = await userManager.GeneratePasswordResetTokenAsync(user); var reset = await userManager.ResetPasswordAsync(user, token, a.NewPassword); if (!reset.Succeeded) { throw new InvalidOperationException(string.Join(Environment.NewLine, reset.Errors.Select(x => x.Description))); } } var updated = await userManager.UpdateAsync(user); if (!updated.Succeeded) { throw new InvalidOperationException(string.Join(Environment.NewLine, updated.Errors.Select(x => x.Description))); } } public async Task UpdateUserRolesAsync(string userID, UserRolesDto? b, CancellationToken ct) { if (string.IsNullOrWhiteSpace(userID)) { throw new InvalidOperationException("ID´Â ÇʼöÀÔ´Ï´Ù."); } var user = await userManager.FindByIdAsync(userID); if (user is null) { throw new InvalidOperationException("»ç¿ëÀÚ Á¤º¸¸¦ ãÀ» ¼ö ¾ø½À´Ï´Ù."); } var userRoles = await userManager.GetRolesAsync(user); foreach (var role in b?.Roles ?? Enumerable.Empty()) { var roleName = role.DisplayValue?.Trim(); if (string.IsNullOrWhiteSpace(roleName)) { continue; } // ÇöÀç »ç¿ëÀÚÀÇ ¿ªÇÒ¿¡ Æ÷ÇԵǾî ÀÖÀ¸³ª ¼±ÅõÇÁö ¾ÊÀº °æ¿ì Á¦°Å if (userRoles.Contains(roleName, StringComparer.OrdinalIgnoreCase) && !role.IsSelected) { var removed = await userManager.RemoveFromRoleAsync(user, roleName); if (!removed.Succeeded) { throw new InvalidOperationException(string.Join(Environment.NewLine, removed.Errors.Select(e => e.Description))); } } // ÇöÀç »ç¿ëÀÚÀÇ ¿ªÇÒ¿¡ Æ÷ÇÔµÇÁö ¾Ê¾ÒÀ¸³ª ¼±ÅÃµÈ °æ¿ì Ãß°¡ if (!userRoles.Contains(roleName, StringComparer.OrdinalIgnoreCase) && role.IsSelected) { var added = await userManager.AddToRoleAsync(user, roleName); if (!added.Succeeded) { throw new InvalidOperationException(string.Join(Environment.NewLine, added.Errors.Select(e => e.Description))); } } } } } }