Handler.cs 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. using Application.Abstractions.Messaging;
  2. using Application.Abstractions.Data;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace Application.Features.Admin.Crypto.Board.GetBoards
  5. {
  6. public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
  7. {
  8. public async Task<Response> Handle(Query request, CancellationToken ct)
  9. {
  10. var coin = await db.Coin.AsNoTracking().FirstOrDefaultAsync(c => c.ID == request.CoinID, ct);
  11. if (coin is null)
  12. {
  13. throw new KeyNotFoundException("코인을 찾을 수 없습니다.");
  14. }
  15. var allBoards = await db.Board
  16. .AsNoTracking()
  17. .Include(b => b.BoardGroup)
  18. .OrderBy(b => b.BoardGroup.Order)
  19. .ThenBy(b => b.Order)
  20. .Select(b => new
  21. {
  22. b.ID,
  23. b.Code,
  24. b.Name,
  25. GroupName = b.BoardGroup.Name,
  26. b.IsActive,
  27. b.CoinID
  28. })
  29. .ToListAsync(ct);
  30. var linked = allBoards
  31. .Where(b => b.CoinID == request.CoinID)
  32. .Select(b => new Response.Row(b.ID, b.Code, b.Name, b.GroupName, b.IsActive))
  33. .ToList();
  34. var unlinked = allBoards
  35. .Where(b => b.CoinID is null)
  36. .Select(b => new Response.Row(b.ID, b.Code, b.Name, b.GroupName, b.IsActive))
  37. .ToList();
  38. return new Response(coin.Symbol, coin.KorName, linked, unlinked);
  39. }
  40. }
  41. }