Handler.cs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. using SharedKernel.Results;
  5. using SharedKernel.Storage;
  6. namespace Application.Features.Api.MyPage.ChangeBanner;
  7. internal sealed class Handler(IAppDbContext db, IFileStorage fileStorage) : ICommandHandler<Command, Result<string?>>
  8. {
  9. public async Task<Result<string?>> Handle(Command request, CancellationToken ct)
  10. {
  11. var member = await db.Member.FirstOrDefaultAsync(m => m.ID == request.MemberID, ct);
  12. if (member is null)
  13. {
  14. return Result.Failure<string?>(Error.NotFound("MyPage.MemberNotFound", "회원 정보를 찾을 수 없습니다."));
  15. }
  16. if (!string.IsNullOrEmpty(member.BannerUrl))
  17. {
  18. fileStorage.DeleteByUrl(member.BannerUrl);
  19. }
  20. string? bannerUrl = null;
  21. if (request.Banner is not null && request.Banner.Length > 0)
  22. {
  23. FileStoragePath uploadPath = new(UploadTarget.Upload, UploadFolder.MemberBanner, request.MemberID);
  24. string[] allowedExtensions = [".jpg", ".jpeg", ".png", ".gif", ".webp"];
  25. var result = await fileStorage.SaveFileAsync(request.Banner, uploadPath, allowedExtensions, ct);
  26. bannerUrl = result?.Url;
  27. }
  28. member.SetBannerUrl(bannerUrl);
  29. await db.SaveChangesAsync(ct);
  30. return Result.Success<string?>(bannerUrl);
  31. }
  32. }