using ErrorOr; using Mediator; using Microsoft.EntityFrameworkCore; using Musify.Application.Contracts; using Musify.Application.Shared; using Musify.Application.Tracks.Responses; using X.PagedList; using X.PagedList.EF; namespace Musify.Application.Likes { public record GetLikedTracksQuery( long UserId, int PageNumber, int PageSize) : IQuery>>; public class GetLikedTracksQueryHandler(IDatabase database) : IQueryHandler>> { public async ValueTask>> Handle(GetLikedTracksQuery request, CancellationToken cancellationToken) { var likesQuery = database.TrackLikes .AsNoTracking() .Include(like => like.Track.Owner) .Where(like => like.UserId == request.UserId); var totalCount = await likesQuery.CountAsync(cancellationToken); var pagedEntities = await likesQuery .OrderByDescending(like => like.CreatedAt) .Select(like => new { like.Track, ListensCount = like.Track.ListeningHistories.Count }) .ToPagedListAsync(request.PageNumber, request.PageSize, totalCount, cancellationToken); var pagedTracks = new StaticPagedList( pagedEntities.Select(x => TrackApplicationResponse.FromEntity(x.Track, x.ListensCount)), pagedEntities.PageNumber, pagedEntities.PageSize, pagedEntities.TotalItemCount); return PaginatedResponse.FromPagedList(pagedTracks); } } }