Handler.cs 2.0 KB

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