From 275ba57c0c1ff2e9096e6d9d7448ad53fa32eab9 Mon Sep 17 00:00:00 2001 From: XShine555 Date: Sat, 9 May 2026 19:09:10 +0200 Subject: [PATCH] Update routes and changes on queries --- .../Configuration/TrackConfiguration.cs | 12 +++++++++ .../Handlers/GetPlayListByIdQueryHandler.cs | 5 ++-- .../Handler/CreateTrackCommandHandler.cs | 23 +++++++++------- .../Handler/DeleteTrackCommandHandler.cs | 26 ++++++++++++------- .../Handler/GetTrackByIdQueryHandler.cs | 9 ++++--- 5 files changed, 49 insertions(+), 26 deletions(-) diff --git a/Application/Configuration/TrackConfiguration.cs b/Application/Configuration/TrackConfiguration.cs index 5928fac..c9658ef 100644 --- a/Application/Configuration/TrackConfiguration.cs +++ b/Application/Configuration/TrackConfiguration.cs @@ -65,6 +65,18 @@ namespace Musify.Application.Configuration public string OriginalAudiosPath => Path.Combine(ParentFolder, OriginalAudiosFolder); public string ProcessedAudiosPath => Path.Combine(ParentFolder, ProcessedAudioFolder); + + public string BuildOriginalPicturePath(string pictureName) => Path.Combine(OriginalPicturesPath, pictureName); + + public string BuildSmallPicturePath(string pictureName) => Path.Combine(SmallPicturesPath, pictureName); + + public string BuildMediumPicturePath(string pictureName) => Path.Combine(MediumPicturesPath, pictureName); + + public string BuildLargePicturePath(string pictureName) => Path.Combine(LargePicturesPath, pictureName); + + public string BuildOriginalAudioPath(string audioName) => Path.Combine(OriginalAudiosPath, audioName); + + public string BuildProcessedAudioPath(string audioName) => Path.Combine(ProcessedAudiosPath, audioName); } public class TrackPicturesSizes diff --git a/Application/PlayLists/Handlers/GetPlayListByIdQueryHandler.cs b/Application/PlayLists/Handlers/GetPlayListByIdQueryHandler.cs index d8558f6..6b430c7 100644 --- a/Application/PlayLists/Handlers/GetPlayListByIdQueryHandler.cs +++ b/Application/PlayLists/Handlers/GetPlayListByIdQueryHandler.cs @@ -14,11 +14,10 @@ namespace Musify.Application.PlayLists.Handlers { var playList = await database.PlayLists .AsNoTracking() + .Select(p => PlayListResponse.FromEntity(p)) .SingleOrDefaultAsync(p => p.Id == request.Id, cancellationToken); - return playList is not null - ? Result.Success(PlayListResponse.FromEntity(playList)) - : Result.NotFound("Playlist not found"); + return playList ?? Result.NotFound(); } } } \ No newline at end of file diff --git a/Application/Tracks/Handler/CreateTrackCommandHandler.cs b/Application/Tracks/Handler/CreateTrackCommandHandler.cs index a197ad5..68c79ec 100644 --- a/Application/Tracks/Handler/CreateTrackCommandHandler.cs +++ b/Application/Tracks/Handler/CreateTrackCommandHandler.cs @@ -1,5 +1,6 @@ using Ardalis.Result; using Mediator; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using Musify.Application.Configuration; using Musify.Application.Contracts.Infrastructure; @@ -16,8 +17,9 @@ namespace Musify.Application.Tracks.Handler { public async ValueTask> Handle(CreateTrackCommand request, CancellationToken cancellationToken) { - var userExists = await database.Users.FindAsync(request.UserId, cancellationToken); - if (userExists is null) + var userExists = await database.Users.AsNoTracking() + .AnyAsync(u => u.Id == request.UserId, cancellationToken); + if (!userExists) { logger.LogWarning("User {UserId} not found", request.UserId); return Result.NotFound($"User {request.UserId} not found"); @@ -29,8 +31,8 @@ namespace Musify.Application.Tracks.Handler trackConfiguration.Routes.PresetMediumPicture, trackConfiguration.Routes.PresetLargePicture); - var fullPictureKey = Path.Combine(trackConfiguration.Routes.OriginalPicturesPath, trackEntity.OriginalPictureName); - var fullAudioKey = Path.Combine(trackConfiguration.Routes.OriginalAudiosPath, trackEntity.OriginalAudioName); + var fullPictureKey = trackConfiguration.Routes.BuildOriginalPicturePath(trackEntity.OriginalPictureName); + var fullAudioKey = trackConfiguration.Routes.BuildOriginalAudioPath(trackEntity.OriginalAudioName); await UploadFilesAsync(request, fullPictureKey, fullAudioKey, cancellationToken); @@ -58,8 +60,9 @@ namespace Musify.Application.Tracks.Handler pictureKey, cancellationToken); } - catch + catch (Exception exception) { + logger.LogError(exception, "Failed to upload picture for track {Title}", request.Title); return Result.Error($"Failed to upload picture for {request.Title}"); } @@ -72,8 +75,9 @@ namespace Musify.Application.Tracks.Handler audioKey, cancellationToken); } - catch + catch (Exception exception) { + logger.LogError(exception, "Failed to upload audio for track {Title}", request.Title); await RollbackFilesAsync(pictureKey, audioKey, cancellationToken); return Result.Error($"Failed to upload audio for {request.Title}"); } @@ -94,7 +98,7 @@ namespace Musify.Application.Tracks.Handler await eventBus.PublishAsync(new UpdateTrackPictureEvent( track.Id, storageConfiguration.Bucket, - Path.Combine(trackConfiguration.Routes.OriginalPicturesPath, track.OriginalPictureName), + trackConfiguration.Routes.BuildOriginalPicturePath(track.OriginalPictureName), new ImageSize( trackConfiguration.Routes.SmallPicturesPath, trackConfiguration.PicturesSizes.SmallPictureWidth, @@ -116,15 +120,14 @@ namespace Musify.Application.Tracks.Handler async Task PublishTranscodeEvent(Track track, CancellationToken cancellationToken) { - var destinationFolderAudio = Path.Combine(trackConfiguration.Routes.ProcessedAudiosPath, - Guid.NewGuid().ToString()); + var destinationFolderAudio = trackConfiguration.Routes.BuildProcessedAudioPath(Guid.NewGuid().ToString()); try { await eventBus.PublishAsync(new UpdateTrackAudioEvent( track.Id, storageConfiguration.Bucket, - Path.Combine(trackConfiguration.Routes.OriginalAudiosPath, track.OriginalAudioName), + trackConfiguration.Routes.BuildOriginalAudioPath(track.OriginalAudioName), storageConfiguration.Bucket, destinationFolderAudio), cancellationToken); } diff --git a/Application/Tracks/Handler/DeleteTrackCommandHandler.cs b/Application/Tracks/Handler/DeleteTrackCommandHandler.cs index 8736249..5737708 100644 --- a/Application/Tracks/Handler/DeleteTrackCommandHandler.cs +++ b/Application/Tracks/Handler/DeleteTrackCommandHandler.cs @@ -1,5 +1,6 @@ using Ardalis.Result; using Mediator; +using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using Musify.Application.Configuration; using Musify.Application.Contracts.Infrastructure; @@ -14,7 +15,7 @@ namespace Musify.Application.Tracks.Handler { public async ValueTask Handle(DeleteTrackCommand request, CancellationToken cancellationToken) { - var track = await database.Tracks.FindAsync(request.TrackId, cancellationToken); + var track = await database.Tracks.SingleOrDefaultAsync(t => t.Id == request.TrackId, cancellationToken); if (track is null) { logger.LogInformation("Track {TrackId} not found", request.TrackId); @@ -35,33 +36,40 @@ namespace Musify.Application.Tracks.Handler async Task RemovePictures(Track track, CancellationToken cancellationToken) { - await RemoveFile(Path.Combine(trackConfiguration.Routes.OriginalPicturesPath, track.OriginalPictureName), + await RemoveFile(trackConfiguration.Routes.BuildOriginalPicturePath(track.OriginalPictureName), cancellationToken); if (track.SmallPictureName != trackConfiguration.Routes.PresetSmallPicture) - await RemoveFile(Path.Combine(trackConfiguration.Routes.SmallPicturesPath, track.SmallPictureName), + await RemoveFile(trackConfiguration.Routes.BuildSmallPicturePath(track.SmallPictureName), cancellationToken); if (track.MediumPictureName != trackConfiguration.Routes.PresetMediumPicture) - await RemoveFile(Path.Combine(trackConfiguration.Routes.MediumPicturesPath, track.MediumPictureName), + await RemoveFile(trackConfiguration.Routes.BuildMediumPicturePath(track.MediumPictureName), cancellationToken); if (track.LargePictureName != trackConfiguration.Routes.PresetLargePicture) - await RemoveFile(Path.Combine(trackConfiguration.Routes.LargePicturesPath, track.LargePictureName), + await RemoveFile(trackConfiguration.Routes.BuildLargePicturePath(track.LargePictureName), cancellationToken); } async Task RemoveAudios(Track track, CancellationToken cancellationToken) { - await RemoveFile(Path.Combine(trackConfiguration.Routes.OriginalAudiosPath, track.OriginalAudioName), + await RemoveFile(trackConfiguration.Routes.BuildOriginalAudioPath(track.OriginalAudioName), cancellationToken); - await RemoveFile(Path.Combine(trackConfiguration.Routes.ProcessedAudiosPath, track.AudioFolderName), + await RemoveFile(trackConfiguration.Routes.BuildProcessedAudioPath(track.AudioFolderName), cancellationToken); } async Task RemoveFile(string path, CancellationToken cancellationToken) { - await storageHandler.RemoveFileAsync(storageConfiguration.Bucket, path, cancellationToken); - logger.LogDebug("Removed file {Path} from storage", path); + try + { + await storageHandler.RemoveFileAsync(storageConfiguration.Bucket, path, cancellationToken); + logger.LogDebug("Removed file {Path} from storage", path); + } + catch (Exception exception) + { + logger.LogError(exception, "Failed to remove file {Path} from storage", path); + } } } } \ No newline at end of file diff --git a/Application/Tracks/Handler/GetTrackByIdQueryHandler.cs b/Application/Tracks/Handler/GetTrackByIdQueryHandler.cs index 2d4172b..f529bab 100644 --- a/Application/Tracks/Handler/GetTrackByIdQueryHandler.cs +++ b/Application/Tracks/Handler/GetTrackByIdQueryHandler.cs @@ -1,5 +1,6 @@ using Ardalis.Result; using Mediator; +using Microsoft.EntityFrameworkCore; using Musify.Application.Contracts.Infrastructure; using Musify.Application.Tracks.Queries; using Musify.Application.Tracks.Responses; @@ -11,11 +12,11 @@ namespace Musify.Application.Tracks.Handler { public async ValueTask> Handle(GetTrackByIdQuery request, CancellationToken cancellationToken) { - var track = await database.Tracks.FindAsync(request.TrackId); + var track = await database.Tracks.AsNoTracking() + .Select(t => TrackResponse.FromEntity(t)) + .SingleOrDefaultAsync(t => t.Id == request.TrackId, cancellationToken); - return track is null - ? Result.NotFound() - : Result.Success(TrackResponse.FromEntity(track)); + return track ?? Result.NotFound(); } } } \ No newline at end of file