From ac1c515dec8e85b3fb4e6569eb72150d5e4a02cc Mon Sep 17 00:00:00 2001 From: XShine555 Date: Mon, 6 Jul 2026 02:04:01 +0200 Subject: [PATCH] feat(tracks): support search by name in GetTracks --- .../Musify.Api/Endpoints/TrackEndpoints.cs | 3 ++- .../Musify.Application/Tracks/GetTracks.cs | 20 +++++++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/backend/Musify.Api/Endpoints/TrackEndpoints.cs b/backend/Musify.Api/Endpoints/TrackEndpoints.cs index 5ed80d3..cafa59e 100644 --- a/backend/Musify.Api/Endpoints/TrackEndpoints.cs +++ b/backend/Musify.Api/Endpoints/TrackEndpoints.cs @@ -77,10 +77,11 @@ public static class TrackEndpoints private static async Task GetTracks( IMediator mediator, CancellationToken cancellationToken, + string? name, int pageNumber = 1, int pageSize = 10) { - var result = await mediator.Send(new GetTracksQuery(pageNumber, pageSize), cancellationToken); + var result = await mediator.Send(new GetTracksQuery(name, pageNumber, pageSize), cancellationToken); return result.ToHttpResult(); } diff --git a/backend/Musify.Application/Tracks/GetTracks.cs b/backend/Musify.Application/Tracks/GetTracks.cs index eb5e213..377cd91 100644 --- a/backend/Musify.Application/Tracks/GetTracks.cs +++ b/backend/Musify.Application/Tracks/GetTracks.cs @@ -8,7 +8,7 @@ using Musify.Application.Contracts; namespace Musify.Application.Tracks { - public record GetTracksQuery(int PageNumber = 1, int PageSize = 10) + public record GetTracksQuery(string? Name = null, int PageNumber = 1, int PageSize = 10) : IQuery >>; public class GetTracksQueryHandler(IDatabase database) @@ -16,14 +16,26 @@ namespace Musify.Application.Tracks { public async ValueTask >> Handle(GetTracksQuery request, CancellationToken cancellationToken) { + var pageNumber = request.PageNumber < 1 ? 1 : request.PageNumber; + var pageSize = request.PageSize < 1 ? 10 : request.PageSize; + var tracksQuery = database.UserHasTracks .AsNoTracking() - .OrderBy(t => t.Id) .Include(ut => ut.Track) - .Select(t => TrackApplicationResponse.FromEntity(t.Track)); + .AsQueryable(); + + if (request.Name is not null) + { + var normalizedName = request.Name.Trim().ToUpperInvariant(); + tracksQuery = tracksQuery.Where(t => t.Track.NormalizedTitle.Contains(normalizedName)); + } var totalCount = await tracksQuery.CountAsync(cancellationToken); - var pagedTracks = await tracksQuery.ToPagedListAsync(request.PageNumber, request.PageSize, totalCount, cancellationToken); + + var pagedTracks = await tracksQuery + .OrderBy(t => t.Id) + .Select(t => TrackApplicationResponse.FromEntity(t.Track)) + .ToPagedListAsync(pageNumber, pageSize, totalCount, cancellationToken); return PaginatedResponse.FromPagedList(pagedTracks); }