diff --git a/Application/PlayLists/Handlers/GetPlayListTracksQueryHandler.cs b/Application/PlayLists/Handlers/GetPlayListTracksQueryHandler.cs new file mode 100644 index 0000000..b0fd8cf --- /dev/null +++ b/Application/PlayLists/Handlers/GetPlayListTracksQueryHandler.cs @@ -0,0 +1,41 @@ +using Ardalis.Result; +using Mediator; +using Microsoft.EntityFrameworkCore; +using Musify.Application.Contracts; +using Musify.Application.Pagination; +using Musify.Application.PlayLists.Queries; +using Musify.Application.Tracks.Responses; +using X.PagedList.EF; + +namespace Musify.Application.PlayLists.Handlers +{ + public class GetPlayListTracksQueryHandler(IDatabase database) + : IQueryHandler> > + { + public async ValueTask >> Handle(GetPlayListTracksQuery request, CancellationToken cancellationToken) + { + var pageNumber = request.PageNumber < 1 ? 1 : request.PageNumber; + var pageSize = request.PageSize < 1 ? 10 : request.PageSize; + + var playListExists = await database.PlayLists + .AsNoTracking() + .AnyAsync(p => p.Id == request.PlayListId, cancellationToken); + if (!playListExists) + return Result>.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(pageNumber, pageSize, totalCount, cancellationToken); + + return Result.Success(PaginatedResponse.FromPagedList(pagedTracks)); + } + } +} diff --git a/Application/PlayLists/Queries/GetPlayListTracksQuery.cs b/Application/PlayLists/Queries/GetPlayListTracksQuery.cs new file mode 100644 index 0000000..49759ef --- /dev/null +++ b/Application/PlayLists/Queries/GetPlayListTracksQuery.cs @@ -0,0 +1,13 @@ +using Ardalis.Result; +using Mediator; +using Musify.Application.Pagination; +using Musify.Application.Tracks.Responses; + +namespace Musify.Application.PlayLists.Queries +{ + public record GetPlayListTracksQuery( + Guid PlayListId, + int PageNumber = 1, + int PageSize = 10) + : IQuery>>; +} diff --git a/Domain/Entities/PlayListHasTrack.cs b/Domain/Entities/PlayListHasTrack.cs index 38d0c86..3de229f 100644 --- a/Domain/Entities/PlayListHasTrack.cs +++ b/Domain/Entities/PlayListHasTrack.cs @@ -25,6 +25,6 @@ namespace Musify.Domain.Entities public PlayList PlayList { get; set; } [ForeignKey(nameof(TrackId)) ] - public Track? Track { get; set; } + public Track Track { get; set; } } } \ No newline at end of file