Handler.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using Application.Abstractions.Data;
  2. using Application.Abstractions.Messaging;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace Application.Features.Api.Feed.GetSuggestedFollows;
  5. public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
  6. {
  7. public async Task<Response> Handle(Query request, CancellationToken ct)
  8. {
  9. var top = Math.Clamp(request.Top, 1, 20);
  10. var viewerID = request.ViewerMemberID ?? 0;
  11. var followingIDs = viewerID > 0
  12. ? await db.MemberFollow.AsNoTracking().Where(f => f.FollowerMemberID == viewerID).Select(f => f.FolloweeMemberID).ToListAsync(ct)
  13. : [];
  14. var query = db.Member.AsNoTracking()
  15. .Where(m => m.IsCreator && !m.IsWithdraw && !m.IsDenied && m.ID != viewerID && !followingIDs.Contains(m.ID))
  16. .Select(m => new
  17. {
  18. m.SID,
  19. m.Name,
  20. m.Thumb,
  21. m.Summary,
  22. m.IsCreator,
  23. FollowerCount = m.MemberStats != null ? m.MemberStats.FollowerCount : 0
  24. });
  25. var list = await query.OrderByDescending(x => x.FollowerCount).Take(top).ToListAsync(ct);
  26. if (list.Count < top)
  27. {
  28. var fallbackTake = top - list.Count;
  29. var existingSIDs = list.Select(x => x.SID).ToList();
  30. var fallback = await db.Member.AsNoTracking()
  31. .Where(m => !m.IsWithdraw && !m.IsDenied && m.ID != viewerID && !followingIDs.Contains(m.ID) && !existingSIDs.Contains(m.SID))
  32. .Select(m => new
  33. {
  34. m.SID,
  35. m.Name,
  36. m.Thumb,
  37. m.Summary,
  38. m.IsCreator,
  39. FollowerCount = m.MemberStats != null ? m.MemberStats.FollowerCount : 0
  40. })
  41. .OrderByDescending(x => x.FollowerCount)
  42. .Take(fallbackTake)
  43. .ToListAsync(ct);
  44. list.AddRange(fallback);
  45. }
  46. return new Response
  47. {
  48. List = [..list.Select(x => new Response.Row
  49. {
  50. SID = x.SID,
  51. Name = x.Name,
  52. Thumb = x.Thumb,
  53. Summary = x.Summary,
  54. IsCreator = x.IsCreator,
  55. FollowerCount = x.FollowerCount
  56. })]
  57. };
  58. }
  59. }