diff --git a/Application/Application.csproj b/Application/Application.csproj
index 0a86904..cde91d6 100644
--- a/Application/Application.csproj
+++ b/Application/Application.csproj
@@ -24,8 +24,4 @@
-
-
-
-
diff --git a/Application/Contracts/Application/PaginatedResponse.cs b/Application/Contracts/Application/PaginatedResponse.cs
new file mode 100644
index 0000000..8106a4b
--- /dev/null
+++ b/Application/Contracts/Application/PaginatedResponse.cs
@@ -0,0 +1,11 @@
+namespace Musify.Application.Contracts.Application
+{
+ public record PaginatedResponse(
+ IReadOnlyCollection Items,
+ int PageNumber,
+ int PageSize,
+ int PageCount,
+ int TotalItemCount,
+ bool HasNextPage,
+ bool HasPreviousPage);
+}
diff --git a/Application/PlayLists/Contracts/PaginatedPlayListResponse.cs b/Application/PlayLists/Contracts/PaginatedPlayListResponse.cs
deleted file mode 100644
index 1431574..0000000
--- a/Application/PlayLists/Contracts/PaginatedPlayListResponse.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-namespace Musify.Application.PlayLists.Contracts
-{
- public record PaginatedPlayListResponse(
- IReadOnlyCollection PlayLists,
- int PageNumber,
- int PageSize,
- int PageCount,
- int TotalItemCount,
- bool HasNextPage,
- bool HasPreviousPage
- );
-}
\ No newline at end of file
diff --git a/Application/PlayLists/Queries/GetPlayLists/GetPlayListsQuery.cs b/Application/PlayLists/Queries/GetPlayLists/GetPlayListsQuery.cs
index ba213f7..e5de1e1 100644
--- a/Application/PlayLists/Queries/GetPlayLists/GetPlayListsQuery.cs
+++ b/Application/PlayLists/Queries/GetPlayLists/GetPlayListsQuery.cs
@@ -1,9 +1,10 @@
using Ardalis.Result;
using DispatchR.Abstractions.Send;
+using Musify.Application.Contracts.Application;
using Musify.Application.PlayLists.Contracts;
namespace Musify.Application.PlayLists.Queries.GetPlayLists
{
public record GetPlayListsQuery(int PageNumber = 1, int PageSize = 10)
- : IRequest>>;
+ : IRequest> >>;
}
\ No newline at end of file
diff --git a/Application/PlayLists/Queries/GetPlayLists/GetPlayListsQueryHandler.cs b/Application/PlayLists/Queries/GetPlayLists/GetPlayListsQueryHandler.cs
index ecda141..8a5835b 100644
--- a/Application/PlayLists/Queries/GetPlayLists/GetPlayListsQueryHandler.cs
+++ b/Application/PlayLists/Queries/GetPlayLists/GetPlayListsQueryHandler.cs
@@ -1,17 +1,17 @@
using Ardalis.Result;
using DispatchR.Abstractions.Send;
using Microsoft.EntityFrameworkCore;
+using Musify.Application.Contracts.Application;
using Musify.Application.Contracts.Infrastructure;
using Musify.Application.PlayLists.Contracts;
-using Musify.Domain.Entities;
using X.PagedList.EF;
namespace Musify.Application.PlayLists.Queries.GetPlayLists
{
public class GetPlayListsQueryHandler(IDatabase database)
- : IRequestHandler> >
+ : IRequestHandler >> >
{
- public async Task> Handle(GetPlayListsQuery request, CancellationToken cancellationToken)
+ public async Task >> Handle(GetPlayListsQuery request, CancellationToken cancellationToken)
{
var pageNumber = request.PageNumber < 1 ? 1 : request.PageNumber;
var pageSize = request.PageSize < 1 ? 10 : request.PageSize;
@@ -24,7 +24,7 @@ namespace Musify.Application.PlayLists.Queries.GetPlayLists
.Select(p => PlayListResponse.FromEntity(p))
.ToPagedListAsync(pageNumber, pageSize, totalCount, cancellationToken);
- var response = new PaginatedPlayListResponse(
+ var response = new PaginatedResponse(
pagedPlayLists.ToArray(),
pagedPlayLists.PageNumber,
pagedPlayLists.PageSize,
diff --git a/Application/PlayLists/Queries/GetPlayListsByUserId/GetPlayListsByUserIdQuery.cs b/Application/PlayLists/Queries/GetPlayListsByUserId/GetPlayListsByUserIdQuery.cs
index efeb755..b90358a 100644
--- a/Application/PlayLists/Queries/GetPlayListsByUserId/GetPlayListsByUserIdQuery.cs
+++ b/Application/PlayLists/Queries/GetPlayListsByUserId/GetPlayListsByUserIdQuery.cs
@@ -1,5 +1,6 @@
using Ardalis.Result;
using DispatchR.Abstractions.Send;
+using Musify.Application.Contracts.Application;
using Musify.Application.PlayLists.Contracts;
namespace Musify.Application.PlayLists.Queries.GetPlayListsByUserId
@@ -9,5 +10,5 @@ namespace Musify.Application.PlayLists.Queries.GetPlayListsByUserId
string Name = "",
int PageNumber = 1,
int PageSize = 10)
- : IRequest>>;
+ : IRequest> >>;
}
\ No newline at end of file
diff --git a/Application/PlayLists/Queries/GetPlayListsByUserId/GetPlayListsByUserIdQueryHandler.cs b/Application/PlayLists/Queries/GetPlayListsByUserId/GetPlayListsByUserIdQueryHandler.cs
index 58403b4..a54bf3d 100644
--- a/Application/PlayLists/Queries/GetPlayListsByUserId/GetPlayListsByUserIdQueryHandler.cs
+++ b/Application/PlayLists/Queries/GetPlayListsByUserId/GetPlayListsByUserIdQueryHandler.cs
@@ -1,6 +1,7 @@
using Ardalis.Result;
using DispatchR.Abstractions.Send;
using Microsoft.EntityFrameworkCore;
+using Musify.Application.Contracts.Application;
using Musify.Application.Contracts.Infrastructure;
using Musify.Application.PlayLists.Contracts;
using X.PagedList.EF;
@@ -8,9 +9,9 @@ using X.PagedList.EF;
namespace Musify.Application.PlayLists.Queries.GetPlayListsByUserId
{
public class GetPlayListsByUserIdQueryHandler(IDatabase database)
- : IRequestHandler> >
+ : IRequestHandler > >>
{
- public async Task> Handle(GetPlayListsByUserIdQuery request, CancellationToken cancellationToken)
+ public async Task >> Handle(GetPlayListsByUserIdQuery request, CancellationToken cancellationToken)
{
var pageNumber = request.PageNumber < 1 ? 1 : request.PageNumber;
var pageSize = request.PageSize < 1 ? 10 : request.PageSize;
@@ -30,7 +31,7 @@ namespace Musify.Application.PlayLists.Queries.GetPlayListsByUserId
.Select(p => PlayListResponse.FromEntity(p))
.ToPagedListAsync(pageNumber, pageSize, totalCount, cancellationToken);
- var response = new PaginatedPlayListResponse(
+ var response = new PaginatedResponse(
pagedPlayLists.ToArray(),
pagedPlayLists.PageNumber,
pagedPlayLists.PageSize,
diff --git a/Application/Tracks/Queries/GetTrackById/GetTrackByIdQuery.cs b/Application/Tracks/Queries/GetTrackById/GetTrackByIdQuery.cs
new file mode 100644
index 0000000..9a3f9c4
--- /dev/null
+++ b/Application/Tracks/Queries/GetTrackById/GetTrackByIdQuery.cs
@@ -0,0 +1,9 @@
+using Ardalis.Result;
+using DispatchR.Abstractions.Send;
+using Musify.Application.Tracks.Contracts;
+
+namespace Musify.Application.Tracks.Queries.GetTrackById
+{
+ public record GetTrackByIdQuery(Guid TrackId)
+ : IRequest >>;
+}
\ No newline at end of file
diff --git a/Application/Tracks/Queries/GetTrackById/GetTrackByIdQueryHandler.cs b/Application/Tracks/Queries/GetTrackById/GetTrackByIdQueryHandler.cs
new file mode 100644
index 0000000..151ac1f
--- /dev/null
+++ b/Application/Tracks/Queries/GetTrackById/GetTrackByIdQueryHandler.cs
@@ -0,0 +1,20 @@
+using Ardalis.Result;
+using DispatchR.Abstractions.Send;
+using Musify.Application.Contracts.Infrastructure;
+using Musify.Application.Tracks.Contracts;
+
+namespace Musify.Application.Tracks.Queries.GetTrackById
+{
+ public class GetTrackByIdQueryHandler(IDatabase database)
+ : IRequestHandler >>
+ {
+ public async Task> Handle(GetTrackByIdQuery request, CancellationToken cancellationToken)
+ {
+ var track = await database.Tracks.FindAsync(request.TrackId);
+
+ return track is null
+ ? Result.NotFound()
+ : Result.Success(TrackResponse.FromEntity(track));
+ }
+ }
+}
\ No newline at end of file
diff --git a/Application/Tracks/Queries/GetTracks/GetTracksQuery.cs b/Application/Tracks/Queries/GetTracks/GetTracksQuery.cs
new file mode 100644
index 0000000..37a81cb
--- /dev/null
+++ b/Application/Tracks/Queries/GetTracks/GetTracksQuery.cs
@@ -0,0 +1,10 @@
+using Ardalis.Result;
+using DispatchR.Abstractions.Send;
+using Musify.Application.Contracts.Application;
+using Musify.Application.Tracks.Contracts;
+
+namespace Musify.Application.Tracks.Queries.GetTracks
+{
+ public record GetTracksQuery(int PageNumber = 1, int PageSize = 10)
+ : IRequest >> >;
+}
\ No newline at end of file
diff --git a/Application/Tracks/Queries/GetTracks/GetTracksQueryHandler.cs b/Application/Tracks/Queries/GetTracks/GetTracksQueryHandler.cs
new file mode 100644
index 0000000..e0bd672
--- /dev/null
+++ b/Application/Tracks/Queries/GetTracks/GetTracksQueryHandler.cs
@@ -0,0 +1,40 @@
+using Ardalis.Result;
+using DispatchR.Abstractions.Send;
+using Microsoft.EntityFrameworkCore;
+using Musify.Application.Contracts.Application;
+using Musify.Application.Contracts.Infrastructure;
+using Musify.Application.Tracks.Contracts;
+using X.PagedList.EF;
+
+namespace Musify.Application.Tracks.Queries.GetTracks
+{
+ public class GetTracksQueryHandler(IDatabase database)
+ : IRequestHandler> > >
+ {
+ public async Task >> Handle(GetTracksQuery request, CancellationToken cancellationToken)
+ {
+ var pageNumber = request.PageNumber < 1 ? 1 : request.PageNumber;
+ var pageSize = request.PageSize < 1 ? 10 : request.PageSize;
+
+ var totalCount = await database.PlayLists.CountAsync(cancellationToken);
+
+ var pagedPlayLists = await database.UserHasTracks
+ .AsNoTracking()
+ .OrderBy(t => t.Id)
+ .Include(ut => ut.Track)
+ .Select(t => TrackResponse.FromEntity(t.Track))
+ .ToPagedListAsync(pageNumber, pageSize, totalCount, cancellationToken);
+
+ var response = new PaginatedResponse(
+ pagedPlayLists.ToArray(),
+ pagedPlayLists.PageNumber,
+ pagedPlayLists.PageSize,
+ pagedPlayLists.PageCount,
+ pagedPlayLists.TotalItemCount,
+ pagedPlayLists.HasNextPage,
+ pagedPlayLists.HasPreviousPage);
+
+ return Result.Success(response);
+ }
+ }
+}
\ No newline at end of file
diff --git a/Application/Tracks/Queries/GetTracksByUserId/GetTracksByUserIdQuery.cs b/Application/Tracks/Queries/GetTracksByUserId/GetTracksByUserIdQuery.cs
new file mode 100644
index 0000000..7968dff
--- /dev/null
+++ b/Application/Tracks/Queries/GetTracksByUserId/GetTracksByUserIdQuery.cs
@@ -0,0 +1,14 @@
+using Ardalis.Result;
+using DispatchR.Abstractions.Send;
+using Musify.Application.Contracts.Application;
+using Musify.Application.Tracks.Contracts;
+
+namespace Musify.Application.Tracks.Queries.GetTracksByUserId
+{
+ public record GetTracksByUserIdQuery(
+ Guid UserId,
+ string Name = "",
+ int PageNumber = 1,
+ int PageSize = 10)
+ : IRequest > >>;
+}
\ No newline at end of file
diff --git a/Application/Tracks/Queries/GetTracksByUserId/GetTracksByUserIdQueryHandler.cs b/Application/Tracks/Queries/GetTracksByUserId/GetTracksByUserIdQueryHandler.cs
new file mode 100644
index 0000000..b4c5285
--- /dev/null
+++ b/Application/Tracks/Queries/GetTracksByUserId/GetTracksByUserIdQueryHandler.cs
@@ -0,0 +1,47 @@
+using Ardalis.Result;
+using DispatchR.Abstractions.Send;
+using Microsoft.EntityFrameworkCore;
+using Musify.Application.Contracts.Application;
+using Musify.Application.Contracts.Infrastructure;
+using Musify.Application.Tracks.Contracts;
+using X.PagedList.EF;
+
+namespace Musify.Application.Tracks.Queries.GetTracksByUserId
+{
+ public class GetTracksByUserIdQueryHandler(IDatabase database)
+ : IRequestHandler> >>
+ {
+ public async Task >> Handle(GetTracksByUserIdQuery request, CancellationToken cancellationToken)
+ {
+ var pageNumber = request.PageNumber < 1 ? 1 : request.PageNumber;
+ var pageSize = request.PageSize < 1 ? 10 : request.PageSize;
+ var normalizedName = request.Name?.Trim().ToUpperInvariant() ?? string.Empty;
+
+ var tracksQuery = database.UserHasTracks
+ .AsNoTracking()
+ .Include(ut => ut.Track)
+ .Where(p => p.UserId == request.UserId);
+
+ if (!string.IsNullOrWhiteSpace(normalizedName))
+ tracksQuery = tracksQuery.Where(t => t.Track.NormalizedTitle.Contains(normalizedName));
+
+ var totalCount = await tracksQuery.CountAsync(cancellationToken);
+
+ var pagedTracks = await tracksQuery
+ .OrderBy(t => t.Track.CreatedDate)
+ .Select(t => TrackResponse.FromEntity(t.Track))
+ .ToPagedListAsync(pageNumber, pageSize, totalCount, cancellationToken);
+
+ var response = new PaginatedResponse(
+ pagedTracks.ToArray(),
+ pagedTracks.PageNumber,
+ pagedTracks.PageSize,
+ pagedTracks.PageCount,
+ pagedTracks.TotalItemCount,
+ pagedTracks.HasNextPage,
+ pagedTracks.HasPreviousPage);
+
+ return Result.Success(response);
+ }
+ }
+}
\ No newline at end of file