Handler.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. using Application.Abstractions.Messaging;
  2. using Application.Abstractions.Data;
  3. using Application.Abstractions.Cache;
  4. using SharedKernel.Results;
  5. using SharedKernel.Storage;
  6. using Microsoft.EntityFrameworkCore;
  7. namespace Application.Features.Admin.Banner.Item.Update;
  8. public sealed class Handler(IAppDbContext db, IFileStorage fileStorage, ICacheService cache) : ICommandHandler<Command, Result>
  9. {
  10. public async Task<Result> Handle(Command request, CancellationToken ct)
  11. {
  12. var bannerItem = await db.BannerItem.FirstOrDefaultAsync(x => x.ID == request.ID, ct);
  13. if (bannerItem is null)
  14. {
  15. return Result.Failure(Error.NotFound("Banner.NotFound", "배너를 찾을 수 없습니다."));
  16. }
  17. if (!await db.BannerPosition.AnyAsync(x => x.ID == request.PositionID, ct))
  18. {
  19. return Result.Failure(Error.NotFound("Banner.PositionNotFound", "배너 위치를 찾을 수 없습니다."));
  20. }
  21. FileStoragePath uploadPath = new FileStoragePath(UploadTarget.Upload, UploadFolder.Banner, bannerItem.ID);
  22. string[] allowedFileExtensions = [".jpg", ".jpeg", ".png", ".gif", ".webp"];
  23. string? desktopImgPath = bannerItem.DesktopImage;
  24. string? mobileImgPath = bannerItem.MobileImage;
  25. if (request.DesktopImage is not null)
  26. {
  27. // 새 파일 업로드 → 기존 파일 교체
  28. if (!string.IsNullOrEmpty(bannerItem.DesktopImage))
  29. {
  30. fileStorage.DeleteByUrl(bannerItem.DesktopImage);
  31. }
  32. desktopImgPath = (await fileStorage.SaveFileAsync(request.DesktopImage, uploadPath, allowedFileExtensions, ct))?.Url;
  33. }
  34. else if (request.RemoveDesktop)
  35. {
  36. // 명시적 삭제 — 기존 파일 제거 후 URL null
  37. if (!string.IsNullOrEmpty(bannerItem.DesktopImage))
  38. {
  39. fileStorage.DeleteByUrl(bannerItem.DesktopImage);
  40. }
  41. desktopImgPath = null;
  42. }
  43. if (request.MobileImage is not null)
  44. {
  45. // 새 파일 업로드 → 기존 파일 교체
  46. if (!string.IsNullOrEmpty(bannerItem.MobileImage))
  47. {
  48. fileStorage.DeleteByUrl(bannerItem.MobileImage);
  49. }
  50. mobileImgPath = (await fileStorage.SaveFileAsync(request.MobileImage, uploadPath, allowedFileExtensions, ct))?.Url;
  51. }
  52. else if (request.RemoveMobile)
  53. {
  54. // 명시적 삭제 — 기존 파일 제거 후 URL null
  55. if (!string.IsNullOrEmpty(bannerItem.MobileImage))
  56. {
  57. fileStorage.DeleteByUrl(bannerItem.MobileImage);
  58. }
  59. mobileImgPath = null;
  60. }
  61. bannerItem.Update(
  62. request.Subject,
  63. desktopImgPath,
  64. mobileImgPath,
  65. request.Link,
  66. request.LinkTarget,
  67. request.Order,
  68. request.IsActive,
  69. request.StartAt,
  70. request.EndAt
  71. );
  72. await db.SaveChangesAsync(ct);
  73. await cache.RemoveByPrefixAsync("banner:", ct);
  74. return Result.Success();
  75. }
  76. }