Handler.cs 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace Application.Features.Api.Crew.ConsentSession;
  5. internal sealed class Handler(IAppDbContext db) : ICommandHandler<Command, Response>
  6. {
  7. public async Task<Response> Handle(Command request, CancellationToken ct)
  8. {
  9. var consent = await db.CrewSessionConsent
  10. .FirstOrDefaultAsync(c => c.CrewSessionID == request.CrewSessionID && c.CrewMemberID == request.CrewMemberID, ct);
  11. if (consent is null)
  12. {
  13. throw new KeyNotFoundException("동의 정보를 찾을 수 없습니다.");
  14. }
  15. if (consent.IsConsented)
  16. {
  17. throw new InvalidOperationException("이미 동의했습니다.");
  18. }
  19. consent.Consent();
  20. // 전원 동의 확인
  21. var allConsented = await db.CrewSessionConsent
  22. .Where(c => c.CrewSessionID == request.CrewSessionID)
  23. .AllAsync(c => c.IsConsented || c.CrewMemberID == request.CrewMemberID, ct);
  24. if (allConsented)
  25. {
  26. var session = await db.CrewSession.FindAsync([request.CrewSessionID], ct);
  27. session?.Activate();
  28. }
  29. await db.SaveChangesAsync(ct);
  30. return new Response(allConsented);
  31. }
  32. }