Handler.cs 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Domain.Entities.Donations;
  4. using Microsoft.EntityFrameworkCore;
  5. namespace Application.Features.Api.Crew.JoinByCode;
  6. internal sealed class Handler(IAppDbContext db) : ICommandHandler<Command, Response>
  7. {
  8. public async Task<Response> Handle(Command request, CancellationToken ct)
  9. {
  10. var crew = await db.Crew
  11. .FirstOrDefaultAsync(c => c.InviteCode == request.InviteCode && c.IsActive, ct);
  12. if (crew is null)
  13. {
  14. throw new KeyNotFoundException("유효하지 않은 초대 코드입니다.");
  15. }
  16. // 이미 등록된 크루원인지 확인
  17. var exists = await db.CrewMember
  18. .AnyAsync(m => m.CrewID == crew.ID && m.MemberID == request.MemberID, ct);
  19. if (exists)
  20. {
  21. throw new InvalidOperationException("이미 등록된 크루원입니다.");
  22. }
  23. var channel = await db.Channel.AsNoTracking()
  24. .FirstOrDefaultAsync(c => c.MemberID == request.MemberID, ct);
  25. var nextOrder = await db.CrewMember
  26. .Where(m => m.CrewID == crew.ID)
  27. .MaxAsync(m => (int?)m.SortOrder, ct) ?? 0;
  28. var member = CrewMember.Create(
  29. crew.ID,
  30. request.MemberID,
  31. request.Nickname,
  32. channel?.ID,
  33. sortOrder: nextOrder + 1
  34. );
  35. db.CrewMember.Add(member);
  36. await db.SaveChangesAsync(ct);
  37. return new Response(member.ID, crew.Name);
  38. }
  39. }