Files
Musify/backend/Core/Musify.Application/Tracks/GetTrackStatusCounts.cs
T
Admin d839a72700 Add track status filter and counts, album track ids and bulk track deletion
GET /tracks/users/{userId} accepts repeated status values and returns the
albums each track belongs to. GET /tracks/users/{userId}/status-counts,
GET /albums/{id}/tracks/ids and DELETE /tracks with a list of track ids
are new.
2026-09-25 01:14:59 +02:00

36 lines
1.4 KiB
C#

using Mediator;
using Microsoft.EntityFrameworkCore;
using Musify.Application.Contracts;
using Musify.Application.Tracks.Responses;
using Musify.Domain.ValueObjects;
namespace Musify.Application.Tracks
{
public record GetTrackStatusCountsQuery(long UserId)
: IQuery<TrackStatusCountsResponse>;
public class GetTrackStatusCountsQueryHandler(IDatabase database)
: IQueryHandler<GetTrackStatusCountsQuery, TrackStatusCountsResponse>
{
public async ValueTask<TrackStatusCountsResponse> Handle(GetTrackStatusCountsQuery request, CancellationToken cancellationToken)
{
var counts = await database.Tracks
.AsNoTracking()
.Active()
.Where(track => track.OwnerUserId == request.UserId)
.GroupBy(track => track.Audio.TranscodeStatus)
.Select(group => new { Status = group.Key, Count = group.Count() })
.ToListAsync(cancellationToken);
int CountOf(ProcessingStatus status) => counts.Where(c => c.Status == status).Sum(c => c.Count);
return new TrackStatusCountsResponse(
counts.Sum(c => c.Count),
CountOf(ProcessingStatus.Pending),
CountOf(ProcessingStatus.Processing),
CountOf(ProcessingStatus.Completed),
CountOf(ProcessingStatus.Failed));
}
}
}