using Application.Abstractions.Data; using Application.Abstractions.Messaging; using Microsoft.EntityFrameworkCore; namespace Application.Features.Forum.PostFile.Search; public sealed class Handler(IAppDbContext db) : IQueryHandler { public async Task Handle(Query request, CancellationToken ct) { var query = db.PostFile.AsNoTracking() .Include(c => c.Board) .Include(c => c.Post) .AsQueryable(); if (request.BoardID.HasValue) { query = query.Where(c => c.BoardID == request.BoardID.Value); } if (request.PostID.HasValue) { query = query.Where(c => c.PostID == request.PostID.Value); } if (request.IsDisabled.HasValue) { query = query.Where(c => c.IsDisabled == request.IsDisabled.Value); } if (!string.IsNullOrWhiteSpace(request.StartAt) && DateTime.TryParse(request.StartAt, out var startDate)) { query = query.Where(c => c.CreatedAt >= startDate); } if (!string.IsNullOrWhiteSpace(request.EndAt) && DateTime.TryParse(request.EndAt, out var endDate)) { query = query.Where(c => c.CreatedAt <= endDate.AddDays(1)); } query = query.OrderByDescending(c => c.ID); var total = await query.CountAsync(ct); var list = await query .Skip((request.PageNum - 1) * request.PerPage) .Take(request.PerPage) .Select(c => new { c.ID, c.BoardID, BoardName = c.Board.Name, c.PostID, PostSubject = c.Post.Subject, c.FileName, c.Url, c.Extension, c.Size, c.Downloads, c.IsDisabled, c.CreatedAt }) .ToListAsync(ct); var startNum = total - ((request.PageNum - 1) * request.PerPage); return new Response( total, [..list.Select((c, i) => new Response.Row( Num: startNum - i, c.ID, c.BoardID, c.BoardName, c.PostID, c.PostSubject, c.FileName, c.Url, c.Extension, c.Size, c.Downloads, c.IsDisabled, c.CreatedAt ))] ); } }