Handler.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. using Application.Abstractions.Messaging;
  2. using Application.Abstractions.Data;
  3. using Microsoft.EntityFrameworkCore;
  4. namespace Application.Features.Director.AccessLog.Search;
  5. public sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Response>
  6. {
  7. public async Task<Response> Handle(Query request, CancellationToken ct)
  8. {
  9. var query = db.AdminAccessLog.AsNoTracking().AsQueryable();
  10. // 키워드 검색
  11. if (!string.IsNullOrWhiteSpace(request.Keyword))
  12. {
  13. var kw = request.Keyword.Trim();
  14. query = request.Search switch
  15. {
  16. 1 => query.Where(x => x.UserID.Contains(kw)),
  17. 2 => query.Where(x => x.Path.Contains(kw)),
  18. 3 => query.Where(x => x.IpAddress != null && x.IpAddress.Contains(kw)),
  19. 4 => query.Where(x => x.MenuName != null && x.MenuName.Contains(kw)),
  20. _ => query.Where(x => x.UserID.Contains(kw))
  21. };
  22. }
  23. // Method 필터
  24. if (!string.IsNullOrWhiteSpace(request.Method))
  25. {
  26. query = query.Where(x => x.Method == request.Method);
  27. }
  28. // 날짜 필터
  29. if (!string.IsNullOrWhiteSpace(request.StartAt) && DateTime.TryParse(request.StartAt, out var startAt))
  30. {
  31. query = query.Where(x => x.CreatedAt >= startAt);
  32. }
  33. if (!string.IsNullOrWhiteSpace(request.EndAt) && DateTime.TryParse(request.EndAt, out var endAt))
  34. {
  35. query = query.Where(x => x.CreatedAt <= endAt);
  36. }
  37. var total = await query.CountAsync(ct);
  38. var skip = (request.PageNum - 1) * request.PerPage;
  39. var list = await query
  40. .OrderByDescending(x => x.ID)
  41. .Skip(skip)
  42. .Take(request.PerPage)
  43. .Select(x => new
  44. {
  45. x.ID,
  46. x.UserID,
  47. x.UserName,
  48. x.Method,
  49. x.Path,
  50. x.QueryString,
  51. x.StatusCode,
  52. x.ElapsedMs,
  53. x.MenuName,
  54. x.IpAddress,
  55. x.UserAgent,
  56. x.CreatedAt
  57. })
  58. .ToListAsync(ct);
  59. var rows = list.Select((x, idx) => new Response.Row
  60. {
  61. Num = total - skip - idx,
  62. ID = x.ID,
  63. UserID = x.UserID,
  64. UserName = x.UserName,
  65. Method = x.Method,
  66. Path = x.Path,
  67. QueryString = x.QueryString,
  68. StatusCode = x.StatusCode,
  69. ElapsedMs = x.ElapsedMs,
  70. MenuName = x.MenuName,
  71. IpAddress = x.IpAddress,
  72. UserAgent = x.UserAgent,
  73. CreatedAt = x.CreatedAt
  74. }).ToList();
  75. return new Response
  76. {
  77. Total = total,
  78. List = rows
  79. };
  80. }
  81. }