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) .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); } } }