using Application.Abstractions.Data;
using Application.Abstractions.Messaging;
using Microsoft.EntityFrameworkCore;
using SharedKernel.Results;
namespace Application.Features.Api.Store.Inventory.Delete;
///
/// 보관함 소프트 삭제. DB row 는 유지하고 DeletedAt 만 마킹.
/// CouponCode.Status 는 그대로 유지 (이미 결제 완료된 자원 — 풀로 되돌리지 않음).
///
internal sealed class Handler(IAppDbContext db) : ICommandHandler
{
public async Task 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();
}
}