Handler.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. using Application.Abstractions.Messaging;
  2. using Application.Abstractions.Data;
  3. using SharedKernel.Results;
  4. using SharedKernel.Storage;
  5. using Microsoft.EntityFrameworkCore;
  6. namespace Application.Features.Admin.MemberGrade.Update;
  7. public sealed class Handler(IAppDbContext db, IFileStorage fileStorage) : ICommandHandler<Command, Result>
  8. {
  9. public async Task<Result> 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. return Result.Failure(Error.NotFound("MemberGrade.NotFound", "회원등급을 찾을 수 없습니다."));
  15. }
  16. if (memberGrade.KorName != request.KorName && await db.MemberGrade.AnyAsync(x => x.KorName == request.KorName, ct))
  17. {
  18. return Result.Failure(Error.Conflict("MemberGrade.DuplicateKorName", $"'{request.KorName}'은(는) 이미 등록된 한글 명입니다."));
  19. }
  20. if (memberGrade.EngName != request.EngName && await db.MemberGrade.AnyAsync(x => x.EngName == request.EngName, ct))
  21. {
  22. return Result.Failure(Error.Conflict("MemberGrade.DuplicateEngName", $"'{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. return Result.Success();
  53. }
  54. }