using ErrorOr; using Mediator; using Microsoft.EntityFrameworkCore; using Musify.Application.Albums.Responses; using Musify.Application.Contracts; using Musify.Application.Shared; using X.PagedList; using X.PagedList.EF; namespace Musify.Application.Albums { public record GetAlbumsQuery(string? Title, int PageNumber, int PageSize) : IQuery>>; public class GetAlbumsQueryHandler(IDatabase database) : IQueryHandler>> { public async ValueTask>> Handle(GetAlbumsQuery request, CancellationToken cancellationToken) { var albumsQuery = database.UserAlbums .AsNoTracking() .AsQueryable(); if (!string.IsNullOrEmpty(request.Title)) { var normalizedTitle = request.Title.Trim().ToUpperInvariant(); albumsQuery = albumsQuery.Where(album => album.NormalizedTitle.Contains(normalizedTitle)); } var totalCount = await albumsQuery.CountAsync(cancellationToken); var pagedEntities = await albumsQuery .OrderByDescending(album => album.CreatedAt) .Select(album => new { Album = album, TrackCount = album.AlbumTracks.Count, CoverTrackIds = album.AlbumTracks .OrderBy(albumTrack => albumTrack.TrackNumber) .Take(AlbumApplicationResponse.CoverTrackCount) .Select(albumTrack => albumTrack.TrackId) .ToList() }) .ToPagedListAsync(request.PageNumber, request.PageSize, totalCount, cancellationToken); var pagedAlbums = new StaticPagedList( pagedEntities.Select(entry => AlbumApplicationResponse.FromEntity(entry.Album, entry.TrackCount, entry.CoverTrackIds)), pagedEntities.PageNumber, pagedEntities.PageSize, pagedEntities.TotalItemCount); return PaginatedResponse.FromPagedList(pagedAlbums); } } }