using ErrorOr; using Mediator; using Microsoft.EntityFrameworkCore; using Musify.Application.Contracts; using Musify.Application.Tracks.Responses; namespace Musify.Application.Tracks { public record GetTrackByIdQuery(Guid TrackId) : IQuery>; public class GetTrackByIdQueryHandler(IDatabase database) : IQueryHandler> { public async ValueTask> Handle(GetTrackByIdQuery request, CancellationToken cancellationToken) { var entity = await database.Tracks.AsNoTracking() .Include(t => t.Owner) .Include(t => t.Tags) .Where(t => t.Id == request.TrackId) .Select(t => new { Track = t, ListensCount = t.ListeningHistories.Count(l => l.IsCounted) }) .SingleOrDefaultAsync(cancellationToken); if (entity == null) return Error.NotFound(); return TrackApplicationResponse.FromEntity(entity.Track, entity.ListensCount); } } }