Handler.cs 4.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using Application.Abstractions.Messaging;
  2. using Application.Abstractions.Data;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace Application.Features.Admin.Member.List.Update;
  5. public sealed class Handler(IAppDbContext db) : ICommandHandler<Command>
  6. {
  7. public async Task Handle(Command request, CancellationToken ct)
  8. {
  9. var member = await db.Member.AsNoTracking().FirstOrDefaultAsync(x => x.ID == request.ID, ct);
  10. if (member is null)
  11. {
  12. throw new KeyNotFoundException("회원을 찾을 수 없습니다.");
  13. }
  14. // 이메일 중복 체크
  15. if (member.Email != request.Email && await db.Member.AnyAsync(x => x.Email == request.Email && x.ID != request.ID, ct))
  16. {
  17. throw new InvalidOperationException("이미 등록된 이메일입니다.");
  18. }
  19. // 별명 중복 체크
  20. if (request.Name is not null && member.Name != request.Name && await db.Member.AnyAsync(x => x.Name == request.Name && x.ID != request.ID, ct))
  21. {
  22. throw new InvalidOperationException("이미 등록된 별명입니다.");
  23. }
  24. // Thumb 처리
  25. string? thumbPath = request.IsThumbRemove ? null : (request.ThumbUrl ?? member.Thumb);
  26. // Icon 처리
  27. string? iconPath = request.IsIconRemove ? null : (request.IconUrl ?? member.Icon);
  28. // 기본 정보 + 비밀번호 업데이트 (단일 쿼리)
  29. if (!string.IsNullOrWhiteSpace(request.Password))
  30. {
  31. await db.Member.Where(x => x.ID == request.ID).ExecuteUpdateAsync(s => s
  32. .SetProperty(x => x.MemberGradeID, request.MemberGradeID)
  33. .SetProperty(x => x.Email, request.Email)
  34. .SetProperty(x => x.Name, request.Name)
  35. .SetProperty(x => x.FirstName, request.FirstName)
  36. .SetProperty(x => x.LastName, request.LastName)
  37. .SetProperty(x => x.Intro, request.Intro)
  38. .SetProperty(x => x.Summary, request.Summary)
  39. .SetProperty(x => x.Phone, request.Phone)
  40. .SetProperty(x => x.Birthday, request.Birthday)
  41. .SetProperty(x => x.Gender, request.Gender)
  42. .SetProperty(x => x.Thumb, thumbPath)
  43. .SetProperty(x => x.Icon, iconPath)
  44. .SetProperty(x => x.IsEmailVerified, request.IsEmailVerified)
  45. .SetProperty(x => x.IsAuthCertified, request.IsAuthCertified)
  46. .SetProperty(x => x.IsDenied, request.IsDenied)
  47. .SetProperty(x => x.IsAdmin, request.IsAdmin)
  48. .SetProperty(x => x.IsWithdraw, request.IsWithdraw)
  49. .SetProperty(x => x.Password, request.Password)
  50. .SetProperty(x => x.PasswordUpdatedAt, DateTime.UtcNow)
  51. .SetProperty(x => x.UpdatedAt, DateTime.UtcNow),
  52. ct);
  53. }
  54. else
  55. {
  56. await db.Member.Where(x => x.ID == request.ID).ExecuteUpdateAsync(s => s
  57. .SetProperty(x => x.MemberGradeID, request.MemberGradeID)
  58. .SetProperty(x => x.Email, request.Email)
  59. .SetProperty(x => x.Name, request.Name)
  60. .SetProperty(x => x.FirstName, request.FirstName)
  61. .SetProperty(x => x.LastName, request.LastName)
  62. .SetProperty(x => x.Intro, request.Intro)
  63. .SetProperty(x => x.Summary, request.Summary)
  64. .SetProperty(x => x.Phone, request.Phone)
  65. .SetProperty(x => x.Birthday, request.Birthday)
  66. .SetProperty(x => x.Gender, request.Gender)
  67. .SetProperty(x => x.Thumb, thumbPath)
  68. .SetProperty(x => x.Icon, iconPath)
  69. .SetProperty(x => x.IsEmailVerified, request.IsEmailVerified)
  70. .SetProperty(x => x.IsAuthCertified, request.IsAuthCertified)
  71. .SetProperty(x => x.IsDenied, request.IsDenied)
  72. .SetProperty(x => x.IsAdmin, request.IsAdmin)
  73. .SetProperty(x => x.IsWithdraw, request.IsWithdraw)
  74. .SetProperty(x => x.UpdatedAt, DateTime.UtcNow),
  75. ct);
  76. }
  77. }
  78. }