Handler.cs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. using SharedKernel.Results;
  5. namespace Application.Features.Api.Member.Follow.GetFollowers;
  6. public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Result<Response>>
  7. {
  8. public async Task<Result<Response>> Handle(Query request, CancellationToken ct)
  9. {
  10. var target = await db.Member.AsNoTracking().Where(x => x.SID == request.MemberSID && !x.IsWithdraw).Select(x => new { x.ID }).FirstOrDefaultAsync(ct);
  11. if (target is null)
  12. {
  13. return Result.Failure<Response>(Error.NotFound("Follow.MemberNotFound", "회원을 찾을 수 없습니다."));
  14. }
  15. var query = db.MemberFollow.AsNoTracking().Where(x => x.FolloweeMemberID == target.ID);
  16. var total = await query.LongCountAsync(ct);
  17. var skip = (request.Page - 1) * request.PerPage;
  18. var list = await query
  19. .OrderByDescending(x => x.CreatedAt)
  20. .Skip(skip)
  21. .Take(request.PerPage)
  22. .Select(x => new Response.Row
  23. {
  24. SID = x.Follower.SID,
  25. Name = x.Follower.Name,
  26. Thumb = x.Follower.Thumb,
  27. Summary = x.Follower.Summary,
  28. IsCreator = x.Follower.IsCreator,
  29. FollowedAt = x.CreatedAt
  30. })
  31. .ToListAsync(ct);
  32. return new Response
  33. {
  34. Total = total,
  35. List = list
  36. };
  37. }
  38. }