Handler.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. using Application.Abstractions.Messaging;
  2. using Application.Abstractions.Data;
  3. using Domain.Entities.Forum.ValueObject;
  4. using Microsoft.EntityFrameworkCore;
  5. namespace Application.Features.Admin.Forum.Post.Search;
  6. public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
  7. {
  8. public async Task<Response> Handle(Query request, CancellationToken ct)
  9. {
  10. var query = db.Post.AsNoTracking().Include(c => c.Board).AsQueryable();
  11. if (request.BoardID.HasValue)
  12. {
  13. query = query.Where(c => c.BoardID == request.BoardID.Value);
  14. }
  15. if (request.BoardPrefixID.HasValue)
  16. {
  17. query = query.Where(c => c.BoardPrefixID == request.BoardPrefixID.Value);
  18. }
  19. if (!string.IsNullOrWhiteSpace(request.Keyword))
  20. {
  21. var kw = request.Keyword.Trim();
  22. query = request.Search switch
  23. {
  24. 0 => query.Where(c => c.Subject.Contains(kw)),
  25. 1 => query.Where(c => c.Content.Contains(kw)),
  26. 2 => query.Where(c => (c.Name != null && c.Name.Contains(kw)) || (c.SID != null && c.SID.Contains(kw))),
  27. _ => query.Where(c => c.Subject.Contains(kw) || c.Content.Contains(kw))
  28. };
  29. }
  30. if (!string.IsNullOrWhiteSpace(request.StartAt) && DateTime.TryParse(request.StartAt, out var startDate))
  31. {
  32. query = query.Where(c => c.CreatedAt >= startDate);
  33. }
  34. if (!string.IsNullOrWhiteSpace(request.EndAt) && DateTime.TryParse(request.EndAt, out var endDate))
  35. {
  36. query = query.Where(c => c.CreatedAt <= endDate.AddDays(1));
  37. }
  38. if (request.IsNotice == true)
  39. {
  40. query = query.Where(c => c.IsNotice);
  41. }
  42. if (request.IsSecret == true)
  43. {
  44. query = query.Where(c => c.IsSecret);
  45. }
  46. if (request.IsReply == true)
  47. {
  48. query = query.Where(c => c.IsReply);
  49. }
  50. if (request.IsDeleted == true)
  51. {
  52. query = query.Where(c => c.IsDeleted);
  53. }
  54. if (request.IsQnA == true)
  55. {
  56. query = query.Where(c => c.Board.BoardMeta.List.Layout == BoardLayout.QnA);
  57. }
  58. query = request.Sort switch
  59. {
  60. 1 => query.OrderByDescending(c => c.Views),
  61. 2 => query.OrderByDescending(c => c.Comments),
  62. 3 => query.OrderByDescending(c => c.Likes),
  63. _ => query.OrderByDescending(c => c.ID)
  64. };
  65. var total = await query.CountAsync(ct);
  66. var list = await query
  67. .Skip((request.PageNum - 1) * request.PerPage)
  68. .Take(request.PerPage)
  69. .Select(c => new
  70. {
  71. c.ID,
  72. c.BoardID,
  73. BoardName = c.Board.Name,
  74. BoardPrefixName = c.BoardPrefix != null ? c.BoardPrefix.Name : null,
  75. c.BoardPrefixID,
  76. c.Subject,
  77. c.Thumbnail,
  78. c.Name,
  79. c.SID,
  80. c.IsNotice,
  81. c.IsSecret,
  82. c.IsReply,
  83. c.IsSpeaker,
  84. c.IsAnonymous,
  85. c.IsDeleted,
  86. IsQnA = c.Board.BoardMeta.List.Layout == BoardLayout.QnA,
  87. c.Views,
  88. c.Likes,
  89. c.Dislikes,
  90. c.Comments,
  91. c.Images,
  92. c.Medias,
  93. c.Files,
  94. c.Tags,
  95. c.UpdatedAt,
  96. c.CreatedAt
  97. })
  98. .ToListAsync(ct);
  99. var startNum = total - ((request.PageNum - 1) * request.PerPage);
  100. return new Response(
  101. total,
  102. [..list.Select((c, i) => new Response.Row(
  103. Num: startNum - i,
  104. c.ID,
  105. c.BoardID,
  106. c.BoardName,
  107. c.BoardPrefixName,
  108. c.BoardPrefixID,
  109. c.Subject,
  110. c.Thumbnail,
  111. c.Name,
  112. c.SID,
  113. c.IsNotice,
  114. c.IsSecret,
  115. c.IsReply,
  116. c.IsSpeaker,
  117. c.IsAnonymous,
  118. c.IsDeleted,
  119. c.IsQnA,
  120. c.Views,
  121. c.Likes,
  122. c.Dislikes,
  123. c.Comments,
  124. c.Images,
  125. c.Medias,
  126. c.Files,
  127. c.Tags,
  128. c.UpdatedAt,
  129. c.CreatedAt
  130. ))]
  131. );
  132. }
  133. }