From 801bf08337bc78a2630cbb6af6e8712b2340e95b Mon Sep 17 00:00:00 2001 From: XShine555 Date: Sat, 21 Mar 2026 04:00:12 +0100 Subject: [PATCH] Queries y algunos cambios --- Application/Application.csproj | 4 -- .../Application/PaginatedResponse.cs | 11 +++++ .../Contracts/PaginatedPlayListResponse.cs | 12 ----- .../Queries/GetPlayLists/GetPlayListsQuery.cs | 3 +- .../GetPlayLists/GetPlayListsQueryHandler.cs | 8 ++-- .../GetPlayListsByUserIdQuery.cs | 3 +- .../GetPlayListsByUserIdQueryHandler.cs | 7 +-- .../Queries/GetTrackById/GetTrackByIdQuery.cs | 9 ++++ .../GetTrackById/GetTrackByIdQueryHandler.cs | 20 ++++++++ .../Queries/GetTracks/GetTracksQuery.cs | 10 ++++ .../GetTracks/GetTracksQueryHandler.cs | 40 ++++++++++++++++ .../GetTracksByUserIdQuery.cs | 14 ++++++ .../GetTracksByUserIdQueryHandler.cs | 47 +++++++++++++++++++ 13 files changed, 163 insertions(+), 25 deletions(-) create mode 100644 Application/Contracts/Application/PaginatedResponse.cs delete mode 100644 Application/PlayLists/Contracts/PaginatedPlayListResponse.cs create mode 100644 Application/Tracks/Queries/GetTrackById/GetTrackByIdQuery.cs create mode 100644 Application/Tracks/Queries/GetTrackById/GetTrackByIdQueryHandler.cs create mode 100644 Application/Tracks/Queries/GetTracks/GetTracksQuery.cs create mode 100644 Application/Tracks/Queries/GetTracks/GetTracksQueryHandler.cs create mode 100644 Application/Tracks/Queries/GetTracksByUserId/GetTracksByUserIdQuery.cs create mode 100644 Application/Tracks/Queries/GetTracksByUserId/GetTracksByUserIdQueryHandler.cs 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