Handler.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. using Application.Abstractions.Data;
  2. using SharedKernel.Storage;
  3. using MediatR;
  4. using Microsoft.EntityFrameworkCore;
  5. namespace Application.Features.MemberGrade.Update
  6. {
  7. public sealed class Handler(IAppDbContext db, IFileStorage fileStorage) : IRequestHandler<Command>
  8. {
  9. public async Task Handle(Command request, CancellationToken ct)
  10. {
  11. var memberGrade = await db.MemberGrade.FirstOrDefaultAsync(x => x.ID == request.ID, ct);
  12. if (memberGrade is null)
  13. {
  14. throw new KeyNotFoundException("회원등급을 찾을 수 없습니다.");
  15. }
  16. if (memberGrade.KorName != request.KorName && await db.MemberGrade.AnyAsync(x => x.KorName == request.KorName, ct))
  17. {
  18. throw new InvalidOperationException($"'{request.KorName}'은(는) 이미 등록된 한글 명입니다.");
  19. }
  20. if (memberGrade.EngName != request.EngName && await db.MemberGrade.AnyAsync(x => x.EngName == request.EngName, ct))
  21. {
  22. throw new InvalidOperationException($"'{request.EngName}'은(는) 이미 등록된 영문 명입니다.");
  23. }
  24. FileStoragePath uploadPath = new(UploadTarget.Upload, UploadFolder.MemberGrade, memberGrade.ID);
  25. string[] allowedFileExtensions = [".jpg", ".jpeg", ".png", ".gif", ".webp"];
  26. string? imagePath = memberGrade.Image;
  27. if (request.IsImageRemove && !string.IsNullOrEmpty(memberGrade.Image))
  28. {
  29. fileStorage.DeleteByUrl(memberGrade.Image);
  30. imagePath = null;
  31. }
  32. if (request.ImageFile is not null)
  33. {
  34. if (!string.IsNullOrEmpty(memberGrade.Image))
  35. {
  36. fileStorage.DeleteByUrl(memberGrade.Image);
  37. }
  38. imagePath = (await fileStorage.SaveFileAsync(request.ImageFile, uploadPath, allowedFileExtensions, ct))?.Url;
  39. }
  40. memberGrade.Update(
  41. request.KorName,
  42. request.EngName,
  43. request.Description,
  44. request.Order,
  45. imagePath,
  46. request.TextColor,
  47. request.RequiredExp,
  48. request.RequiredAttendance,
  49. request.IsActive
  50. );
  51. await db.SaveChangesAsync(ct);
  52. }
  53. }
  54. }