Handler.cs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Domain.Entities.Store.ValueObject;
  4. using Microsoft.EntityFrameworkCore;
  5. using SharedKernel.Results;
  6. namespace Application.Features.Admin.Store.Settlement.MarkSettled;
  7. public sealed class Handler(IAppDbContext db) : ICommandHandler<Command, Result>
  8. {
  9. public async Task<Result> Handle(Command request, CancellationToken ct)
  10. {
  11. if (string.IsNullOrWhiteSpace(request.AdminUserId))
  12. {
  13. return Result.Failure(Error.Problem("GameSettlement.AdminRequired", "처리 관리자 정보가 누락되었습니다."));
  14. }
  15. if (request.AdminMemo is { Length: > 500 })
  16. {
  17. return Result.Failure(Error.Problem("GameSettlement.AdminMemoTooLong", "관리자 메모는 500자 이하여야 합니다."));
  18. }
  19. var settlement = await db.GameSettlement
  20. .FirstOrDefaultAsync(s => s.ID == request.ID, ct);
  21. if (settlement is null)
  22. {
  23. return Result.Failure(Error.NotFound("GameSettlement.NotFound", "정산 정보를 찾을 수 없습니다."));
  24. }
  25. if (settlement.Status != GameSettlementStatus.Pending)
  26. {
  27. return Result.Failure(Error.Problem("GameSettlement.AlreadySettled", "이미 정산 완료된 항목입니다."));
  28. }
  29. try
  30. {
  31. settlement.MarkSettled(request.AdminUserId, request.AdminEmail, request.AdminMemo);
  32. }
  33. catch (InvalidOperationException ex)
  34. {
  35. return Result.Failure(Error.Problem("GameSettlement.InvalidTransition", ex.Message));
  36. }
  37. catch (ArgumentOutOfRangeException ex)
  38. {
  39. return Result.Failure(Error.Problem("GameSettlement.InvalidArgument", ex.Message));
  40. }
  41. await db.SaveChangesAsync(ct);
  42. return Result.Success();
  43. }
  44. }