feat: Stream Now instant-play of a random track from the nav button
This commit is contained in:
@@ -25,6 +25,25 @@ public class TrackRepository : Repository<DeepDrftContext, TrackEntity>
|
||||
public async Task<TrackEntity?> GetByEntryKeyAsync(string entryKey)
|
||||
=> await _context.Tracks.FirstOrDefaultAsync(t => t.EntryKey == entryKey);
|
||||
|
||||
// Picks one track uniformly at random. Two round-trips (count, then a single offset row)
|
||||
// rather than ORDER BY random() so the database never sorts the whole table — the catalogue
|
||||
// is small today but this keeps the cost flat as it grows. Returns null when empty so the
|
||||
// service surfaces a valid empty-library state, not an error. Queries the DbSet directly,
|
||||
// mirroring GetByEntryKeyAsync, since the base Repository<> exposes only id-based reads.
|
||||
public async Task<TrackEntity?> GetRandomAsync(CancellationToken cancellationToken = default)
|
||||
{
|
||||
var count = await _context.Tracks.CountAsync(cancellationToken);
|
||||
if (count == 0)
|
||||
return null;
|
||||
|
||||
var index = Random.Shared.Next(count);
|
||||
return await _context.Tracks
|
||||
.OrderBy(t => t.Id)
|
||||
.Skip(index)
|
||||
.Take(1)
|
||||
.FirstOrDefaultAsync(cancellationToken);
|
||||
}
|
||||
|
||||
protected override void UpdateEntity(TrackEntity target, TrackEntity source)
|
||||
{
|
||||
base.UpdateEntity(target, source); // copies CreatedAt, UpdatedAt, IsDeleted
|
||||
|
||||
Reference in New Issue
Block a user