Clean up Application layer commands/queries readability and correctness
Add missing AsNoTracking() on read-only queries, drop redundant Update() calls on already-tracked entities, and fix inconsistent formatting (stray spaces in generics, ternaries, and lambdas) across the Albums/Tracks/PlayLists/Users command and query handlers.
This commit is contained in:
@@ -77,8 +77,6 @@ namespace Musify.Application.Albums
|
|||||||
finalPictureKey = albumConfiguration.Routes.BuildOriginalPicturePath(request.UserId, pictureIntent.ObjectName);
|
finalPictureKey = albumConfiguration.Routes.BuildOriginalPicturePath(request.UserId, pictureIntent.ObjectName);
|
||||||
}
|
}
|
||||||
|
|
||||||
database.Albums.Update(album);
|
|
||||||
|
|
||||||
if (pictureIntent != null && finalPictureKey != null)
|
if (pictureIntent != null && finalPictureKey != null)
|
||||||
{
|
{
|
||||||
var publishResult = await PublishUpdateAlbumPictureSourceEventAsync(
|
var publishResult = await PublishUpdateAlbumPictureSourceEventAsync(
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ namespace Musify.Application.PlayLists
|
|||||||
}, validation.Value);
|
}, validation.Value);
|
||||||
}
|
}
|
||||||
|
|
||||||
async Task<ErrorOr<Success>> PublishCreatePlayListEventAsync(
|
private async Task<ErrorOr<Success>> PublishCreatePlayListEventAsync(
|
||||||
Guid playListId,
|
Guid playListId,
|
||||||
UploadIntent pictureIntent,
|
UploadIntent pictureIntent,
|
||||||
string finalPictureKey,
|
string finalPictureKey,
|
||||||
|
|||||||
@@ -85,8 +85,6 @@ namespace Musify.Application.PlayLists
|
|||||||
finalPictureKey = playListConfiguration.Routes.BuildOriginalPicturePath(request.UserId, pictureIntent.ObjectName);
|
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(
|
var publishResult = await PublishUpdatePlayListPictureSourceEventAsync(
|
||||||
@@ -117,7 +115,7 @@ namespace Musify.Application.PlayLists
|
|||||||
return PlayListApplicationResponse.FromEntity(playListEntity, coverTrackIds);
|
return PlayListApplicationResponse.FromEntity(playListEntity, coverTrackIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
async Task<ErrorOr<Success>> PublishUpdatePlayListPictureSourceEventAsync(
|
private async Task<ErrorOr<Success>> PublishUpdatePlayListPictureSourceEventAsync(
|
||||||
Guid playListId,
|
Guid playListId,
|
||||||
UploadIntent pictureIntent,
|
UploadIntent pictureIntent,
|
||||||
string finalPictureKey,
|
string finalPictureKey,
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ namespace Musify.Application.Tracks
|
|||||||
public async ValueTask<ErrorOr<TrackApplicationResponse>> Handle(GetLastTrackListenedByUserIdQuery query, CancellationToken cancellationToken)
|
public async ValueTask<ErrorOr<TrackApplicationResponse>> Handle(GetLastTrackListenedByUserIdQuery query, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var track = await database.ListeningHistories
|
var track = await database.ListeningHistories
|
||||||
|
.AsNoTracking()
|
||||||
.Include(t => t.Track.Owner)
|
.Include(t => t.Track.Owner)
|
||||||
.Include(t => t.Track.Tags)
|
.Include(t => t.Track.Tags)
|
||||||
.Where(t => t.UserId == query.UserId)
|
.Where(t => t.UserId == query.UserId)
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ namespace Musify.Application.Tracks
|
|||||||
public async ValueTask<IEnumerable<TrackApplicationResponse>> Handle(GetListeningHistoryQuery query, CancellationToken cancellationToken)
|
public async ValueTask<IEnumerable<TrackApplicationResponse>> Handle(GetListeningHistoryQuery query, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var recentTrackIds = await database.ListeningHistories
|
var recentTrackIds = await database.ListeningHistories
|
||||||
|
.AsNoTracking()
|
||||||
.Where(l => l.UserId == query.UserId)
|
.Where(l => l.UserId == query.UserId)
|
||||||
.GroupBy(l => l.TrackId)
|
.GroupBy(l => l.TrackId)
|
||||||
.OrderByDescending(g => g.Max(l => l.ListenedAt))
|
.OrderByDescending(g => g.Max(l => l.ListenedAt))
|
||||||
@@ -24,6 +25,7 @@ namespace Musify.Application.Tracks
|
|||||||
.ToListAsync(cancellationToken);
|
.ToListAsync(cancellationToken);
|
||||||
|
|
||||||
var tracksById = await database.Tracks
|
var tracksById = await database.Tracks
|
||||||
|
.AsNoTracking()
|
||||||
.Include(t => t.Owner)
|
.Include(t => t.Owner)
|
||||||
.Include(t => t.Tags)
|
.Include(t => t.Tags)
|
||||||
.Where(t => recentTrackIds.Contains(t.Id))
|
.Where(t => recentTrackIds.Contains(t.Id))
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ namespace Musify.Application.Users
|
|||||||
var weekAgo = DateTime.UtcNow.AddDays(-7);
|
var weekAgo = DateTime.UtcNow.AddDays(-7);
|
||||||
|
|
||||||
var thisWeekHistory = database.ListeningHistories
|
var thisWeekHistory = database.ListeningHistories
|
||||||
|
.AsNoTracking()
|
||||||
.Where(l => l.UserId == request.UserId && l.ListenedAt >= weekAgo);
|
.Where(l => l.UserId == request.UserId && l.ListenedAt >= weekAgo);
|
||||||
|
|
||||||
var tracksThisWeek = await thisWeekHistory
|
var tracksThisWeek = await thisWeekHistory
|
||||||
@@ -24,10 +25,11 @@ namespace Musify.Application.Users
|
|||||||
.CountAsync(cancellationToken);
|
.CountAsync(cancellationToken);
|
||||||
|
|
||||||
var secondsThisWeek = await thisWeekHistory
|
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);
|
.SumAsync(cancellationToken);
|
||||||
|
|
||||||
var listenedDates = await database.ListeningHistories
|
var listenedDates = await database.ListeningHistories
|
||||||
|
.AsNoTracking()
|
||||||
.Where(l => l.UserId == request.UserId)
|
.Where(l => l.UserId == request.UserId)
|
||||||
.Select(l => l.ListenedAt.Date)
|
.Select(l => l.ListenedAt.Date)
|
||||||
.Distinct()
|
.Distinct()
|
||||||
|
|||||||
@@ -16,22 +16,22 @@ namespace Musify.Application.Users
|
|||||||
{
|
{
|
||||||
public async ValueTask<ErrorOr<PaginatedResponse<UserApplicationResponse>>> Handle(GetUsersQuery request, CancellationToken cancellationToken)
|
public async ValueTask<ErrorOr<PaginatedResponse<UserApplicationResponse>>> Handle(GetUsersQuery request, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var user = database.Users
|
var usersQuery = database.Users
|
||||||
.AsNoTracking()
|
.AsNoTracking()
|
||||||
.AsQueryable();
|
.AsQueryable();
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(request.UsernameSearch))
|
if (!string.IsNullOrEmpty(request.UsernameSearch))
|
||||||
{
|
{
|
||||||
var normalizedUsername = request.UsernameSearch.Trim().ToUpperInvariant();
|
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 totalCount = await usersQuery.CountAsync(cancellationToken);
|
||||||
var pagedUser = await user
|
var pagedUsers = await usersQuery
|
||||||
.Select(u => UserApplicationResponse.FromEntity(u))
|
.Select(u => UserApplicationResponse.FromEntity(u))
|
||||||
.ToPagedListAsync(request.PageNumber, request.PageSize, totalCount, cancellationToken);
|
.ToPagedListAsync(request.PageNumber, request.PageSize, totalCount, cancellationToken);
|
||||||
|
|
||||||
return PaginatedResponse<UserApplicationResponse>.FromPagedList(pagedUser);
|
return PaginatedResponse<UserApplicationResponse>.FromPagedList(pagedUsers);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user