diff --git a/backend/Core/Musify.Application/Albums/GetRecentlyListenedAlbums.cs b/backend/Core/Musify.Application/Albums/GetRecentlyListenedAlbums.cs index a046349..59e8631 100644 --- a/backend/Core/Musify.Application/Albums/GetRecentlyListenedAlbums.cs +++ b/backend/Core/Musify.Application/Albums/GetRecentlyListenedAlbums.cs @@ -7,7 +7,7 @@ using Musify.Application.Contracts; namespace Musify.Application.Albums { public record GetRecentlyListenedAlbumsQuery(long UserId, int Limit) - : IQuery >>; + : IQuery>>; public class GetRecentlyListenedAlbumsQueryHandler(IDatabase database) : IQueryHandler>> @@ -24,9 +24,9 @@ namespace Musify.Application.Albums listenedTrackIds, albumTrack => albumTrack.TrackId, history => history.TrackId, - (albumTrack, history) => new { albumTrack.AlbumId, history.ListenedAt } ) + (albumTrack, history) => new { albumTrack.AlbumId, history.ListenedAt }) .GroupBy(entry => entry.AlbumId) - .Select(group => new { AlbumId = group.Key, LastListenedAt = group.Max(entry => entry.ListenedAt) } ) + .Select(group => new { AlbumId = group.Key, LastListenedAt = group.Max(entry => entry.ListenedAt) }) .OrderByDescending(entry => entry.LastListenedAt) .Take(request.Limit) .ToListAsync(cancellationToken); @@ -48,7 +48,7 @@ namespace Musify.Application.Albums .Take(AlbumApplicationResponse.CoverTrackCount) .Select(albumTrack => albumTrack.TrackId) .ToList() - } ) + }) .ToDictionaryAsync(entry => entry.Album.Id, cancellationToken); return ranked diff --git a/backend/Core/Musify.Application/Albums/RequestAlbumPictureUpload.cs b/backend/Core/Musify.Application/Albums/RequestAlbumPictureUpload.cs index d59b86f..e0f0abc 100644 --- a/backend/Core/Musify.Application/Albums/RequestAlbumPictureUpload.cs +++ b/backend/Core/Musify.Application/Albums/RequestAlbumPictureUpload.cs @@ -42,7 +42,7 @@ namespace Musify.Application.Albums var effectiveSizeBytes = request.ExpectedSizeBytes ?? uploadIntentConfiguration.DefaultExpectedPictureSizeBytes; - var objectName = $"{Guid.NewGuid() }.{request.FileType.TrimStart('.').ToLowerInvariant() }"; + var objectName = $"{Guid.NewGuid()}.{request.FileType.TrimStart('.').ToLowerInvariant()}"; var tempKey = albumConfiguration.Routes.BuildTempPicturePath( uploadIntentConfiguration.TemporalRootPrefix, request.UserId, objectName); @@ -84,7 +84,7 @@ namespace Musify.Application.Albums await database.SaveChangesAsync(cancellationToken); await transaction.CommitAsync(cancellationToken); - logger.LogInformation("Issued upload intent {IntentId} for user {UserId} (AlbumPicture, temp key: {Key} )", intent.Id, request.UserId, tempKey); + logger.LogInformation("Issued upload intent {IntentId} for user {UserId} (AlbumPicture, temp key: {Key})", intent.Id, request.UserId, tempKey); return new AlbumPictureUploadResponse( intent.Id, diff --git a/backend/Core/Musify.Application/Albums/UpdateAlbum.cs b/backend/Core/Musify.Application/Albums/UpdateAlbum.cs index 0d56817..d89500e 100644 --- a/backend/Core/Musify.Application/Albums/UpdateAlbum.cs +++ b/backend/Core/Musify.Application/Albums/UpdateAlbum.cs @@ -77,8 +77,6 @@ namespace Musify.Application.Albums finalPictureKey = albumConfiguration.Routes.BuildOriginalPicturePath(request.UserId, pictureIntent.ObjectName); } - database.Albums.Update(album); - if (pictureIntent != null && finalPictureKey != null) { var publishResult = await PublishUpdateAlbumPictureSourceEventAsync( diff --git a/backend/Core/Musify.Application/PlayLists/CreatePlayList.cs b/backend/Core/Musify.Application/PlayLists/CreatePlayList.cs index de1e164..1568a88 100644 --- a/backend/Core/Musify.Application/PlayLists/CreatePlayList.cs +++ b/backend/Core/Musify.Application/PlayLists/CreatePlayList.cs @@ -55,7 +55,7 @@ namespace Musify.Application.PlayLists UserId = request.UserId, Name = request.Name, NormalizedName = request.Name.Trim().ToUpperInvariant(), - Description = string.IsNullOrWhiteSpace(request.Description)? null: request.Description.Trim(), + Description = string.IsNullOrWhiteSpace(request.Description) ? null : request.Description.Trim(), Pictures = resolvedPictures.Pictures, Visibility = request.Visibility }; @@ -106,7 +106,7 @@ namespace Musify.Application.PlayLists }, validation.Value); } - async Task> PublishCreatePlayListEventAsync( + private async Task> PublishCreatePlayListEventAsync( Guid playListId, UploadIntent pictureIntent, string finalPictureKey, diff --git a/backend/Core/Musify.Application/PlayLists/GetPlayListTracks.cs b/backend/Core/Musify.Application/PlayLists/GetPlayListTracks.cs index f5e19e1..cb3cbc9 100644 --- a/backend/Core/Musify.Application/PlayLists/GetPlayListTracks.cs +++ b/backend/Core/Musify.Application/PlayLists/GetPlayListTracks.cs @@ -16,9 +16,9 @@ namespace Musify.Application.PlayLists : IQuery>>; public class GetPlayListTracksQueryHandler(IDatabase database) - : IQueryHandler> > + : IQueryHandler>> { - public async ValueTask >> Handle(GetPlayListTracksQuery request, CancellationToken cancellationToken) + public async ValueTask>> Handle(GetPlayListTracksQuery request, CancellationToken cancellationToken) { var playListExists = await database.PlayLists .AsNoTracking() diff --git a/backend/Core/Musify.Application/PlayLists/GetPlayLists.cs b/backend/Core/Musify.Application/PlayLists/GetPlayLists.cs index ff1722c..07d8874 100644 --- a/backend/Core/Musify.Application/PlayLists/GetPlayLists.cs +++ b/backend/Core/Musify.Application/PlayLists/GetPlayLists.cs @@ -10,12 +10,12 @@ using Musify.Application.Contracts; namespace Musify.Application.PlayLists { public record GetPlayListsQuery(int PageNumber, int PageSize) - : IQuery> >; + : IQuery>>; public class GetPlayListsQueryHandler(IDatabase database) - : IQueryHandler >> + : IQueryHandler>> { - public async ValueTask >> Handle(GetPlayListsQuery request, CancellationToken cancellationToken) + public async ValueTask>> Handle(GetPlayListsQuery request, CancellationToken cancellationToken) { var totalCount = await database.PlayLists.CountAsync(cancellationToken); diff --git a/backend/Core/Musify.Application/PlayLists/GetPlayListsByUserId.cs b/backend/Core/Musify.Application/PlayLists/GetPlayListsByUserId.cs index 99a425b..f877f7e 100644 --- a/backend/Core/Musify.Application/PlayLists/GetPlayListsByUserId.cs +++ b/backend/Core/Musify.Application/PlayLists/GetPlayListsByUserId.cs @@ -16,12 +16,12 @@ namespace Musify.Application.PlayLists int PageNumber, int PageSize, bool OnlyPublic = false) - : IQuery> >; + : IQuery>>; public class GetPlayListsByUserIdQueryHandler(IDatabase database) - : IQueryHandler > > + : IQueryHandler>> { - public async ValueTask >> Handle(GetPlayListsByUserIdQuery request, CancellationToken cancellationToken) + public async ValueTask>> Handle(GetPlayListsByUserIdQuery request, CancellationToken cancellationToken) { var playListsQuery = database.PlayLists .AsNoTracking() @@ -51,7 +51,7 @@ namespace Musify.Application.PlayLists .Take(PlayListApplicationResponse.CoverTrackCount) .Select(plt => plt.TrackId) .ToList() - } ) + }) .ToPagedListAsync(request.PageNumber, request.PageSize, totalCount, cancellationToken); var pagedPlayLists = new StaticPagedList( diff --git a/backend/Core/Musify.Application/PlayLists/RequestPlayListPictureUpload.cs b/backend/Core/Musify.Application/PlayLists/RequestPlayListPictureUpload.cs index 539daad..dbf519d 100644 --- a/backend/Core/Musify.Application/PlayLists/RequestPlayListPictureUpload.cs +++ b/backend/Core/Musify.Application/PlayLists/RequestPlayListPictureUpload.cs @@ -42,7 +42,7 @@ namespace Musify.Application.PlayLists var effectiveSizeBytes = request.ExpectedSizeBytes ?? uploadIntentConfiguration.DefaultExpectedPictureSizeBytes; - var objectName = $"{Guid.NewGuid() }.{request.FileType.TrimStart('.').ToLowerInvariant() }"; + var objectName = $"{Guid.NewGuid()}.{request.FileType.TrimStart('.').ToLowerInvariant()}"; var tempKey = playListConfiguration.Routes.BuildTempPicturePath( uploadIntentConfiguration.TemporalRootPrefix, request.UserId, objectName); @@ -84,7 +84,7 @@ namespace Musify.Application.PlayLists await database.SaveChangesAsync(cancellationToken); await transaction.CommitAsync(cancellationToken); - logger.LogInformation("Issued upload intent {IntentId} for user {UserId} (PlayListPicture, temp key: {Key} )", intent.Id, request.UserId, tempKey); + logger.LogInformation("Issued upload intent {IntentId} for user {UserId} (PlayListPicture, temp key: {Key})", intent.Id, request.UserId, tempKey); return new PlayListPictureUploadResponse( intent.Id, diff --git a/backend/Core/Musify.Application/PlayLists/UpdatePlayList.cs b/backend/Core/Musify.Application/PlayLists/UpdatePlayList.cs index 624bbb7..46cc87a 100644 --- a/backend/Core/Musify.Application/PlayLists/UpdatePlayList.cs +++ b/backend/Core/Musify.Application/PlayLists/UpdatePlayList.cs @@ -85,9 +85,7 @@ namespace Musify.Application.PlayLists finalPictureKey = playListConfiguration.Routes.BuildOriginalPicturePath(request.UserId, pictureIntent.ObjectName); } - database.PlayLists.Update(playListEntity); - - if (pictureIntent != null&& finalPictureKey != null) + if (pictureIntent != null && finalPictureKey != null) { var publishResult = await PublishUpdatePlayListPictureSourceEventAsync( playListEntity.Id, pictureIntent, finalPictureKey, cancellationToken); @@ -117,7 +115,7 @@ namespace Musify.Application.PlayLists return PlayListApplicationResponse.FromEntity(playListEntity, coverTrackIds); } - async Task> PublishUpdatePlayListPictureSourceEventAsync( + private async Task> PublishUpdatePlayListPictureSourceEventAsync( Guid playListId, UploadIntent pictureIntent, string finalPictureKey, diff --git a/backend/Core/Musify.Application/Tracks/GetLastTrackListenedByUserId.cs b/backend/Core/Musify.Application/Tracks/GetLastTrackListenedByUserId.cs index d3c322d..a73bbac 100644 --- a/backend/Core/Musify.Application/Tracks/GetLastTrackListenedByUserId.cs +++ b/backend/Core/Musify.Application/Tracks/GetLastTrackListenedByUserId.cs @@ -14,6 +14,7 @@ namespace Musify.Application.Tracks public async ValueTask> Handle(GetLastTrackListenedByUserIdQuery query, CancellationToken cancellationToken) { var track = await database.ListeningHistories + .AsNoTracking() .Include(t => t.Track.Owner) .Include(t => t.Track.Tags) .Where(t => t.UserId == query.UserId) diff --git a/backend/Core/Musify.Application/Tracks/GetListeningHistory.cs b/backend/Core/Musify.Application/Tracks/GetListeningHistory.cs index 5efcaf4..a828fa8 100644 --- a/backend/Core/Musify.Application/Tracks/GetListeningHistory.cs +++ b/backend/Core/Musify.Application/Tracks/GetListeningHistory.cs @@ -16,6 +16,7 @@ namespace Musify.Application.Tracks public async ValueTask> Handle(GetListeningHistoryQuery query, CancellationToken cancellationToken) { var recentTrackIds = await database.ListeningHistories + .AsNoTracking() .Where(l => l.UserId == query.UserId) .GroupBy(l => l.TrackId) .OrderByDescending(g => g.Max(l => l.ListenedAt)) @@ -24,14 +25,15 @@ namespace Musify.Application.Tracks .ToListAsync(cancellationToken); var tracksById = await database.Tracks + .AsNoTracking() .Include(t => t.Owner) .Include(t => t.Tags) .Where(t => recentTrackIds.Contains(t.Id)) - .Select(t => new { t.Id, Track = t, ListensCount = t.ListeningHistories.Count } ) + .Select(t => new { t.Id, Track = t, ListensCount = t.ListeningHistories.Count }) .ToDictionaryAsync(t => t.Id, cancellationToken); return recentTrackIds - .Select(id => tracksById[id] ) + .Select(id => tracksById[id]) .Select(t => TrackApplicationResponse.FromEntity(t.Track, t.ListensCount)); } } diff --git a/backend/Core/Musify.Application/Tracks/GetTrackById.cs b/backend/Core/Musify.Application/Tracks/GetTrackById.cs index 9b4851a..d1fb84b 100644 --- a/backend/Core/Musify.Application/Tracks/GetTrackById.cs +++ b/backend/Core/Musify.Application/Tracks/GetTrackById.cs @@ -10,7 +10,7 @@ namespace Musify.Application.Tracks : IQuery>; public class GetTrackByIdQueryHandler(IDatabase database) - : IQueryHandler > + : IQueryHandler> { public async ValueTask> Handle(GetTrackByIdQuery request, CancellationToken cancellationToken) { diff --git a/backend/Core/Musify.Application/Tracks/GetTrackCover.cs b/backend/Core/Musify.Application/Tracks/GetTrackCover.cs index 917ff46..80b00ec 100644 --- a/backend/Core/Musify.Application/Tracks/GetTrackCover.cs +++ b/backend/Core/Musify.Application/Tracks/GetTrackCover.cs @@ -48,6 +48,6 @@ namespace Musify.Application.Tracks } private static string? BuildKey(Func builder, string? name) - => string.IsNullOrEmpty(name)? null: builder(name); + => string.IsNullOrEmpty(name) ? null : builder(name); } } \ No newline at end of file diff --git a/backend/Core/Musify.Application/Tracks/GetTracks.cs b/backend/Core/Musify.Application/Tracks/GetTracks.cs index 75d5353..c2b614b 100644 --- a/backend/Core/Musify.Application/Tracks/GetTracks.cs +++ b/backend/Core/Musify.Application/Tracks/GetTracks.cs @@ -33,7 +33,7 @@ namespace Musify.Application.Tracks var pagedEntities = await tracksQuery .OrderByDescending(t => t.Track.CreatedAt) .ThenBy(t => t.Id) - .Select(t => new { t.Track, ListensCount = t.Track.ListeningHistories.Count } ) + .Select(t => new { t.Track, ListensCount = t.Track.ListeningHistories.Count }) .ToPagedListAsync(request.PageNumber, request.PageSize, totalCount, cancellationToken); var items = pagedEntities diff --git a/backend/Core/Musify.Application/Tracks/GetTracksByUserId.cs b/backend/Core/Musify.Application/Tracks/GetTracksByUserId.cs index 4a8d585..ecc7a81 100644 --- a/backend/Core/Musify.Application/Tracks/GetTracksByUserId.cs +++ b/backend/Core/Musify.Application/Tracks/GetTracksByUserId.cs @@ -14,12 +14,12 @@ namespace Musify.Application.Tracks string? Name, int PageNumber, int PageSize) - : IQuery > >; + : IQuery>>; public class GetTracksByUserIdQueryHandler(IDatabase database) - : IQueryHandler> > + : IQueryHandler>> { - public async ValueTask >> Handle(GetTracksByUserIdQuery request, CancellationToken cancellationToken) + public async ValueTask>> Handle(GetTracksByUserIdQuery request, CancellationToken cancellationToken) { var pageNumber = request.PageNumber < 1 ? 1 : request.PageNumber; var pageSize = request.PageSize < 1 ? 10 : request.PageSize; diff --git a/backend/Core/Musify.Application/Users/CreateUser.cs b/backend/Core/Musify.Application/Users/CreateUser.cs index 392e026..ad19221 100644 --- a/backend/Core/Musify.Application/Users/CreateUser.cs +++ b/backend/Core/Musify.Application/Users/CreateUser.cs @@ -28,7 +28,7 @@ namespace Musify.Application.Users } public class CreateUserCommandHandler(IDatabase database, ILogger logger) - : ICommandHandler > + : ICommandHandler> { public async ValueTask> Handle(CreateUserCommand request, CancellationToken cancellationToken) { diff --git a/backend/Core/Musify.Application/Users/GetListeningStats.cs b/backend/Core/Musify.Application/Users/GetListeningStats.cs index 1eefb36..6794717 100644 --- a/backend/Core/Musify.Application/Users/GetListeningStats.cs +++ b/backend/Core/Musify.Application/Users/GetListeningStats.cs @@ -16,6 +16,7 @@ namespace Musify.Application.Users var weekAgo = DateTime.UtcNow.AddDays(-7); var thisWeekHistory = database.ListeningHistories + .AsNoTracking() .Where(l => l.UserId == request.UserId && l.ListenedAt >= weekAgo); var tracksThisWeek = await thisWeekHistory @@ -24,10 +25,11 @@ namespace Musify.Application.Users .CountAsync(cancellationToken); var secondsThisWeek = await thisWeekHistory - .Join(database.Tracks, l => l.TrackId, t => t.Id, (l, t) => t.DurationSeconds) + .Join(database.Tracks.AsNoTracking(), l => l.TrackId, t => t.Id, (l, t) => t.DurationSeconds) .SumAsync(cancellationToken); var listenedDates = await database.ListeningHistories + .AsNoTracking() .Where(l => l.UserId == request.UserId) .Select(l => l.ListenedAt.Date) .Distinct() diff --git a/backend/Core/Musify.Application/Users/GetUserById.cs b/backend/Core/Musify.Application/Users/GetUserById.cs index 145a7ff..92d651b 100644 --- a/backend/Core/Musify.Application/Users/GetUserById.cs +++ b/backend/Core/Musify.Application/Users/GetUserById.cs @@ -7,10 +7,10 @@ using Musify.Application.Users.Responses; namespace Musify.Application.Users { public record GetUserByIdQuery(long Id) - : IQuery >; + : IQuery>; public class GetUserByIdQueryHandler(IDatabase database) - : IQueryHandler > + : IQueryHandler> { public async ValueTask> Handle(GetUserByIdQuery request, CancellationToken cancellationToken) { diff --git a/backend/Core/Musify.Application/Users/GetUsers.cs b/backend/Core/Musify.Application/Users/GetUsers.cs index acc2317..90955bb 100644 --- a/backend/Core/Musify.Application/Users/GetUsers.cs +++ b/backend/Core/Musify.Application/Users/GetUsers.cs @@ -9,29 +9,29 @@ using Musify.Application.Contracts; namespace Musify.Application.Users { public record GetUsersQuery(int PageNumber, int PageSize, string? UsernameSearch) - : IQuery >>; + : IQuery>>; public class GetUsersQueryHandler(IDatabase database) - : IQueryHandler > > + : IQueryHandler>> { - public async ValueTask >> Handle(GetUsersQuery request, CancellationToken cancellationToken) + public async ValueTask>> Handle(GetUsersQuery request, CancellationToken cancellationToken) { - var user = database.Users + var usersQuery = database.Users .AsNoTracking() .AsQueryable(); if (!string.IsNullOrEmpty(request.UsernameSearch)) { var normalizedUsername = request.UsernameSearch.Trim().ToUpperInvariant(); - user = user.Where(u => u.NormalizedName.Contains(normalizedUsername)); + usersQuery = usersQuery.Where(u => u.NormalizedName.Contains(normalizedUsername)); } - var totalCount = await user.CountAsync(cancellationToken); - var pagedUser = await user + var totalCount = await usersQuery.CountAsync(cancellationToken); + var pagedUsers = await usersQuery .Select(u => UserApplicationResponse.FromEntity(u)) .ToPagedListAsync(request.PageNumber, request.PageSize, totalCount, cancellationToken); - return PaginatedResponse.FromPagedList(pagedUser); + return PaginatedResponse.FromPagedList(pagedUsers); } } }