using Application.Abstractions.Data;
using Application.Abstractions.Messaging;
using Microsoft.EntityFrameworkCore;
using SharedKernel.Results;
namespace Application.Features.Api.Member.Items.Unequip;
/// 지위 아이템 장착 해제. 이미 미장착이면 무해(idempotent).
internal sealed class Handler(IAppDbContext db) : ICommandHandler>
{
public async Task> Handle(Command request, CancellationToken ct)
{
var item = await db.MemberItem.FirstOrDefaultAsync(i => i.ID == request.MemberItemID, ct);
if (item is null || item.MemberID != request.MemberID)
{
return Result.Failure(Error.NotFound("MemberItem.NotFound", "보유 아이템을 찾을 수 없습니다."));
}
if (item.EquipSlot is null)
{
return Result.Failure(Error.Problem("MemberItem.NotEquippable", "장착할 수 없는 아이템입니다."));
}
if (item.IsEquipped)
{
item.Unequip();
await db.SaveChangesAsync(ct);
}
return Result.Success(new Response(item.ID, item.EquipSlot.Value, false));
}
}