using Application.Abstractions.Data; using Application.Abstractions.Messaging; using Domain.Entities.Store.ValueObject; using Microsoft.EntityFrameworkCore; using SharedKernel.Results; namespace Application.Features.Admin.Store.Order.RejectRefund; public sealed class Handler(IAppDbContext db) : ICommandHandler { public async Task Handle(Command request, CancellationToken ct) { var refund = await db.OrderRefund.FirstOrDefaultAsync(r => r.ID == request.RefundID, ct); if (refund is null) { return Result.Failure(Error.NotFound("Refund.NotFound", "환불 요청을 찾을 수 없습니다.")); } if (refund.Status != RefundStatus.Requested) { return Result.Failure(Error.Problem("Refund.NotPending", "처리 대기 중인 환불 요청만 거부 가능합니다.")); } if (string.IsNullOrWhiteSpace(request.AdminMemo)) { return Result.Failure(Error.Problem("Refund.MemoRequired", "거부 시 사유(AdminMemo)는 필수입니다.")); } refund.Reject(request.AdminUserId, request.AdminEmail, request.AdminMemo); await db.SaveChangesAsync(ct); return Result.Success(); } }