Design Prot Merge #1
@@ -1,4 +1,5 @@
|
|||||||
using Mediator;
|
using Mediator;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
using Musify.Application.Contracts;
|
using Musify.Application.Contracts;
|
||||||
using Musify.Application.Tracks.Responses;
|
using Musify.Application.Tracks.Responses;
|
||||||
|
|
||||||
@@ -12,18 +13,24 @@ namespace Musify.Application.Tracks
|
|||||||
{
|
{
|
||||||
public const int ListSize = 15;
|
public const int ListSize = 15;
|
||||||
|
|
||||||
public ValueTask<IEnumerable<TrackApplicationResponse>> Handle(GetListeningHistoryQuery query, CancellationToken cancellationToken)
|
public async ValueTask<IEnumerable<TrackApplicationResponse>> Handle(GetListeningHistoryQuery query, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var listeningHistory = database.ListeningHistories
|
var recentTrackIds = await database.ListeningHistories
|
||||||
.Where(l => l.UserId == query.UserId)
|
.Where(l => l.UserId == query.UserId)
|
||||||
.OrderByDescending(l => l.ListenedAt)
|
.GroupBy(l => l.TrackId)
|
||||||
.Select(t => new { t.Track, ListensCount = t.Track.ListeningHistories.Count })
|
.OrderByDescending(g => g.Max(l => l.ListenedAt))
|
||||||
.AsEnumerable()
|
.Select(g => g.Key)
|
||||||
.DistinctBy(t => t.Track.Id)
|
|
||||||
.Take(ListSize)
|
.Take(ListSize)
|
||||||
.Select(t => TrackApplicationResponse.FromEntity(t.Track, t.ListensCount));
|
.ToListAsync(cancellationToken);
|
||||||
|
|
||||||
return ValueTask.FromResult(listeningHistory);
|
var tracksById = await database.Tracks
|
||||||
|
.Where(t => recentTrackIds.Contains(t.Id))
|
||||||
|
.Select(t => new { t.Id, Track = t, ListensCount = t.ListeningHistories.Count })
|
||||||
|
.ToDictionaryAsync(t => t.Id, cancellationToken);
|
||||||
|
|
||||||
|
return recentTrackIds
|
||||||
|
.Select(id => tracksById[id])
|
||||||
|
.Select(t => TrackApplicationResponse.FromEntity(t.Track, t.ListensCount));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user