using ErrorOr; using Mediator; using Microsoft.EntityFrameworkCore; using Musify.Application.Contracts; using Musify.Application.Tracks.Responses; using Musify.Domain.Entities; 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 => ((ExternalTrack)t).TrackArtists) .ThenInclude(trackArtist => trackArtist.Artist) .Include(t => ((LocalTrack)t).Owner) .Where(t => t.Id == request.TrackId) .Select(t => new { Track = t, ListensCount = t.ListeningHistories.Count }) .SingleOrDefaultAsync(cancellationToken); if (entity is null) return Error.NotFound(); return TrackApplicationResponse.FromEntity(entity.Track, entity.ListensCount); } } }