| 123456789101112131415161718192021222324252627282930313233343536373839 |
- using Application.Abstractions.Data;
- using Application.Abstractions.Messaging;
- using Microsoft.EntityFrameworkCore;
- using SharedKernel.Results;
- namespace Application.Features.Api.Store.Inventory.Delete;
- /// <summary>
- /// 보관함 소프트 삭제. DB row 는 유지하고 DeletedAt 만 마킹.
- /// CouponCode.Status 는 그대로 유지 (이미 결제 완료된 자원 — 풀로 되돌리지 않음).
- /// </summary>
- internal sealed class Handler(IAppDbContext db) : ICommandHandler<Command, Result>
- {
- public async Task<Result> Handle(Command request, CancellationToken ct)
- {
- var inv = await db.MemberInventory
- .FirstOrDefaultAsync(i => i.ID == request.InventoryID, ct);
- if (inv is null)
- {
- return Result.Failure(Error.NotFound("Inventory.NotFound", "보관함 항목을 찾을 수 없습니다."));
- }
- if (inv.MemberID != request.MemberID)
- {
- return Result.Failure(Error.NotFound("Inventory.NotFound", "보관함 항목을 찾을 수 없습니다."));
- }
- if (inv.DeletedAt is not null)
- {
- return Result.Failure(Error.Conflict("Inventory.AlreadyDeleted", "이미 삭제된 보관함 항목입니다."));
- }
- inv.SoftDelete();
- await db.SaveChangesAsync(ct);
- return Result.Success();
- }
- }
|