using ErrorOr; using Mediator; using Microsoft.EntityFrameworkCore; using Musify.Application.Contracts; using Musify.Application.Shared; using Musify.Application.Tracks.Responses; using X.PagedList.EF; namespace Musify.Application.PlayLists { public record GetPlayListTracksQuery( Guid PlayListId, int PageNumber, int PageSize) : IQuery>>; public class GetPlayListTracksQueryHandler(IDatabase database) : IQueryHandler> > { public async ValueTask >> Handle(GetPlayListTracksQuery request, CancellationToken cancellationToken) { var playListExists = await database.PlayLists .AsNoTracking() .AnyAsync(p => p.Id == request.PlayListId, cancellationToken); if (!playListExists) return Error.NotFound(); var tracksQuery = database.PlayListHasTracks .AsNoTracking() .Include(plt => plt.Track) .Where(plt => plt.PlayListId == request.PlayListId); var totalCount = await tracksQuery.CountAsync(cancellationToken); var pagedTracks = await tracksQuery .OrderBy(plt => plt.Position) .Select(plt => TrackApplicationResponse.FromEntity(plt.Track)) .ToPagedListAsync(request.PageNumber, request.PageSize, totalCount, cancellationToken); return PaginatedResponse.FromPagedList(pagedTracks); } } }