using Application.Abstractions.Data; using Application.Abstractions.Messaging; using Microsoft.EntityFrameworkCore; using SharedKernel.Results; using OrderRefundEntity = Domain.Entities.Store.OrderRefund; namespace Application.Features.Admin.Store.Order.RequestRefund; public sealed class Handler(IAppDbContext db) : ICommandHandler> { public async Task> Handle(Command request, CancellationToken ct) { var order = await db.Order.FirstOrDefaultAsync(o => o.ID == request.OrderID, ct); if (order is null) { return Result.Failure(Error.NotFound("Order.NotFound", "주문을 찾을 수 없습니다.")); } if (request.Amount <= 0 || request.Amount > order.TotalAmount) { return Result.Failure(Error.Problem("Refund.InvalidAmount", $"환불 금액은 1 ~ {order.TotalAmount:N0}원 사이여야 합니다.")); } var refund = OrderRefundEntity.Create(request.OrderID, request.Type, request.ReasonType, request.Amount, request.Reason); db.OrderRefund.Add(refund); await db.SaveChangesAsync(ct); return Result.Success(refund.ID); } }