Handler.cs 1.2 KB

1234567891011121314151617181920212223242526272829303132333435
  1. using Application.Abstractions.Messaging;
  2. using Application.Abstractions.Data;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace Application.Features.Api.Forum.Comment.Mention;
  5. public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, List<Response>>
  6. {
  7. public async Task<List<Response>> Handle(Query request, CancellationToken ct)
  8. {
  9. // 해당 게시글에 댓글을 작성한 회원 목록 (본인 제외, DISTINCT)
  10. var query = db.Comment.AsNoTracking()
  11. .Include(c => c.Member)
  12. .Where(c => c.PostID == request.PostID && !c.IsDeleted)
  13. .Select(c => c.Member)
  14. .Distinct();
  15. // 본인 제외
  16. if (request.MemberID is int memberID)
  17. {
  18. query = query.Where(m => m.ID != memberID);
  19. }
  20. // 키워드 필터
  21. if (!string.IsNullOrWhiteSpace(request.Keyword))
  22. {
  23. var keyword = request.Keyword.Trim();
  24. query = query.Where(m => (m.Name != null && m.Name.Contains(keyword)) || m.SID.Contains(keyword));
  25. }
  26. var members = await query.Take(10).ToListAsync(ct);
  27. return members.Select(m => new Response(m.ID, m.SID, m.Name, m.Thumb)).ToList();
  28. }
  29. }