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)); } }