Handler.cs 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. using SharedKernel.Results;
  5. namespace Application.Features.Api.Store.Inventory.Delete;
  6. /// <summary>
  7. /// 보관함 소프트 삭제. DB row 는 유지하고 DeletedAt 만 마킹.
  8. /// CouponCode.Status 는 그대로 유지 (이미 결제 완료된 자원 — 풀로 되돌리지 않음).
  9. /// </summary>
  10. internal sealed class Handler(IAppDbContext db) : ICommandHandler<Command, Result>
  11. {
  12. public async Task<Result> Handle(Command request, CancellationToken ct)
  13. {
  14. var inv = await db.MemberInventory
  15. .FirstOrDefaultAsync(i => i.ID == request.InventoryID, ct);
  16. if (inv is null)
  17. {
  18. return Result.Failure(Error.NotFound("Inventory.NotFound", "보관함 항목을 찾을 수 없습니다."));
  19. }
  20. if (inv.MemberID != request.MemberID)
  21. {
  22. return Result.Failure(Error.NotFound("Inventory.NotFound", "보관함 항목을 찾을 수 없습니다."));
  23. }
  24. if (inv.DeletedAt is not null)
  25. {
  26. return Result.Failure(Error.Conflict("Inventory.AlreadyDeleted", "이미 삭제된 보관함 항목입니다."));
  27. }
  28. inv.SoftDelete();
  29. await db.SaveChangesAsync(ct);
  30. return Result.Success();
  31. }
  32. }