From cf5286a3194af3c9f290356a11ccbfe6d5c8fdf8 Mon Sep 17 00:00:00 2001 From: XShine555 Date: Wed, 25 Mar 2026 02:13:47 +0100 Subject: [PATCH] Fixes --- .../Configuration/TrackConfiguration.cs | 13 ++- ...TrackEvent.cs => UpdateTrackAudioEvent.cs} | 5 +- .../Handlers/CreatePlayListCommandHandler.cs | 8 +- .../Handlers/DeletePlayListCommandHandler.cs | 31 ++++-- .../Handlers/UpdatePlayListCommandHandler.cs | 22 +++-- .../Handler/CreateTrackCommandHandler.cs | 30 ++++-- Domain/Entities/Track.cs | 7 ++ Infrastructure/Infrastructure.csproj | 2 - .../Audio/TranscodeDashAudioActivity.cs | 26 ++--- .../Audio/UpdateTrackAudioActivity.cs | 99 +++++++++++++++++++ .../Files/TransferFilesToBucketActivity.cs | 2 +- .../Pictures/UpdatePlayListPictureActivity.cs | 8 +- .../Pictures/UpdateTrackPictureActivity.cs | 8 +- .../Arguments/UpdateTrackAudioArguments.cs | 6 ++ ...onsumer.cs => UpdateTrackAudioConsumer.cs} | 10 +- .../MessagingDependencyInjection.cs | 10 +- .../MassTransit/RoutingSlip/ActivityNames.cs | 1 + .../AudioWorkflowRoutingSlipBuilder.cs | 13 ++- .../PictureWorkflowRoutingSlipBuilder.cs | 5 - ...20260325003221_FirstMigration.Designer.cs} | 12 ++- ...on.cs => 20260325003221_FirstMigration.cs} | 2 + .../Migrations/DatabaseModelSnapshot.cs | 10 ++ Infrastructure/Storage/StorageHandler.cs | 9 +- 23 files changed, 260 insertions(+), 79 deletions(-) rename Application/Events/{TranscodeAudioFromTrackEvent.cs => UpdateTrackAudioEvent.cs} (57%) create mode 100644 Infrastructure/MassTransit/Activities/Audio/UpdateTrackAudioActivity.cs create mode 100644 Infrastructure/MassTransit/Arguments/UpdateTrackAudioArguments.cs rename Infrastructure/MassTransit/Consumers/{TranscodeAudioFromTrackConsumer.cs => UpdateTrackAudioConsumer.cs} (57%) rename Infrastructure/Persistence/Migrations/{20260324183733_FirstMigration.Designer.cs => 20260325003221_FirstMigration.Designer.cs} (96%) rename Infrastructure/Persistence/Migrations/{20260324183733_FirstMigration.cs => 20260325003221_FirstMigration.cs} (97%) diff --git a/Application/Configuration/TrackConfiguration.cs b/Application/Configuration/TrackConfiguration.cs index 4d9d7a8..f72dd79 100644 --- a/Application/Configuration/TrackConfiguration.cs +++ b/Application/Configuration/TrackConfiguration.cs @@ -19,16 +19,16 @@ namespace Musify.Application.Configuration public string ParentFolder { get; set; } = "Tracks"; [Required] - public string OriginalPictures { get; set; } = "OriginalTracks"; + public string OriginalPictures { get; set; } = "OriginalPictures"; [Required] - public string SmallPictures { get; set; } = "SmallTracks"; + public string SmallPictures { get; set; } = "SmallPictures"; [Required] - public string MediumPictures { get; set; } = "MediumTracks"; + public string MediumPictures { get; set; } = "MediumPictures"; [Required] - public string LargePictures { get; set; } = "LargeTracks"; + public string LargePictures { get; set; } = "LargePictures"; [Required] public string PresetOriginalPicture { get; set; } = "PresetOriginalPicture.webp"; @@ -43,7 +43,10 @@ namespace Musify.Application.Configuration public string PresetLargePicture { get; set; } = "PresetLargePicture.webp"; [Required] - public string Audios { get; set; } = "Audios"; + public string OriginalAudios { get; set; } = "OriginalAudios"; + + [Required] + public string ProcessedAudio { get; set; } = "ProcessedAudios"; } public class TrackPicturesSizes diff --git a/Application/Events/TranscodeAudioFromTrackEvent.cs b/Application/Events/UpdateTrackAudioEvent.cs similarity index 57% rename from Application/Events/TranscodeAudioFromTrackEvent.cs rename to Application/Events/UpdateTrackAudioEvent.cs index 69cd150..6891d9a 100644 --- a/Application/Events/TranscodeAudioFromTrackEvent.cs +++ b/Application/Events/UpdateTrackAudioEvent.cs @@ -1,8 +1,9 @@ namespace Musify.Application.Events { - public record TranscodeAudioFromTrackEvent( + public record UpdateTrackAudioEvent( + Guid TrackId, string SourceBucketName, string SourceKeyName, string DestinationBucketName, - string DestinationKeyName); + string DestinationFolderKeyName); } \ No newline at end of file diff --git a/Application/PlayLists/Handlers/CreatePlayListCommandHandler.cs b/Application/PlayLists/Handlers/CreatePlayListCommandHandler.cs index 510e1f3..2c12c83 100644 --- a/Application/PlayLists/Handlers/CreatePlayListCommandHandler.cs +++ b/Application/PlayLists/Handlers/CreatePlayListCommandHandler.cs @@ -56,7 +56,10 @@ namespace Musify.Application.PlayLists.Handlers { var imageId = Guid.NewGuid(); var pictureName = imageId + picture.FileType; - var pictureStorageKey = Path.Join(playListConfiguration.Routes.OriginalPictures, pictureName); + var pictureStorageKey = Path.Join( + playListConfiguration.Routes.ParentFolders, + playListConfiguration.Routes.OriginalPictures, + pictureName); var uploadResult = await UploadFile(picture, pictureStorageKey, cancellationToken); @@ -97,12 +100,15 @@ namespace Musify.Application.PlayLists.Handlers async Task PublishUpdateEvent(string originalPictureKeyName, PlayList playList, CancellationToken cancellationToken) { var smallPictureKeyName = Path.Combine( + playListConfiguration.Routes.ParentFolders, playListConfiguration.Routes.SmallPictures, $"{playList.Id}.{pictureHandler.FileExtension}"); var mediumPictureKeyName = Path.Combine( + playListConfiguration.Routes.ParentFolders, playListConfiguration.Routes.MediumPictures, $"{playList.Id}.{pictureHandler.FileExtension}"); var largePictureKeyName = Path.Combine( + playListConfiguration.Routes.ParentFolders, playListConfiguration.Routes.LargePictures, $"{playList.Id}.{pictureHandler.FileExtension}"); diff --git a/Application/PlayLists/Handlers/DeletePlayListCommandHandler.cs b/Application/PlayLists/Handlers/DeletePlayListCommandHandler.cs index bcd8486..f248f6f 100644 --- a/Application/PlayLists/Handlers/DeletePlayListCommandHandler.cs +++ b/Application/PlayLists/Handlers/DeletePlayListCommandHandler.cs @@ -31,24 +31,35 @@ namespace Musify.Application.PlayLists.Handlers var keysToRemove = new List(); if (playList.SmallPictureKeyName != playListConfiguration.Routes.PresetSmallPicture) - { - keysToRemove.Add(playList.SmallPictureKeyName); - } + keysToRemove.Add(Path.Combine( + playListConfiguration.Routes.ParentFolders, + playListConfiguration.Routes.SmallPictures, + playList.SmallPictureKeyName)); if (playList.MediumPictureKeyName != playListConfiguration.Routes.PresetMediumPicture) - { - keysToRemove.Add(playList.MediumPictureKeyName); - } + keysToRemove.Add(Path.Combine( + playListConfiguration.Routes.ParentFolders, + playListConfiguration.Routes.MediumPictures, + playList.MediumPictureKeyName)); if (playList.LargePictureKeyName != playListConfiguration.Routes.PresetLargePicture) - { - keysToRemove.Add(playList.LargePictureKeyName); - } + keysToRemove.Add(Path.Combine( + playListConfiguration.Routes.ParentFolders, + playListConfiguration.Routes.LargePictures, + playList.LargePictureKeyName)); foreach (var key in keysToRemove) { var publishResult = await TryPublishRemoveFileEventAsync(playList.Id, key, cancellationToken); - if (!publishResult.IsSuccess && !publishResult.IsNotFound()) + if (!publishResult.IsSuccess) + { + if (publishResult.IsNotFound()) + { + logger.LogWarning("File with key={KeyName} not found in storage while trying to publish remove file event for PlayList with id={PlayListId}.", key, playList.Id); + continue; + } + return publishResult; + } } database.PlayLists.Remove(playList); diff --git a/Application/PlayLists/Handlers/UpdatePlayListCommandHandler.cs b/Application/PlayLists/Handlers/UpdatePlayListCommandHandler.cs index b682bbe..803f8ed 100644 --- a/Application/PlayLists/Handlers/UpdatePlayListCommandHandler.cs +++ b/Application/PlayLists/Handlers/UpdatePlayListCommandHandler.cs @@ -52,17 +52,17 @@ namespace Musify.Application.PlayLists.Handlers } if (playList.SmallPictureKeyName != playListConfiguration.Routes.PresetSmallPicture) - { - await PublishRemoveFileEvent(playList.SmallPictureKeyName, cancellationToken); - } + await PublishRemoveFileEvent(Path.Combine( + playListConfiguration.Routes.SmallPictures, + playList.SmallPictureKeyName), cancellationToken); if (playList.MediumPictureKeyName != playListConfiguration.Routes.PresetMediumPicture) - { - await PublishRemoveFileEvent(playList.MediumPictureKeyName, cancellationToken); - } + await PublishRemoveFileEvent(Path.Combine( + playListConfiguration.Routes.MediumPictures, + playList.MediumPictureKeyName), cancellationToken); if (playList.LargePictureKeyName != playListConfiguration.Routes.PresetLargePicture) - { - await PublishRemoveFileEvent(playList.LargePictureKeyName, cancellationToken); - } + await PublishRemoveFileEvent(Path.Combine( + playListConfiguration.Routes.LargePictures, + playList.LargePictureKeyName), cancellationToken); var newImageId = Guid.NewGuid(); var pictureName = newImageId + request.NewPicture.FileType; @@ -99,7 +99,9 @@ namespace Musify.Application.PlayLists.Handlers { await eventBus.PublishAsync(new RemoveFileEvent( storageConfiguration.BucketName, - keyName), cancellationToken); + Path.Combine( + playListConfiguration.Routes.ParentFolders, + keyName)), cancellationToken); return Result.NoContent(); } diff --git a/Application/Tracks/Handler/CreateTrackCommandHandler.cs b/Application/Tracks/Handler/CreateTrackCommandHandler.cs index 8124cd1..ccd74b4 100644 --- a/Application/Tracks/Handler/CreateTrackCommandHandler.cs +++ b/Application/Tracks/Handler/CreateTrackCommandHandler.cs @@ -25,17 +25,23 @@ namespace Musify.Application.Tracks.Handler return Result.NotFound($"User with id {request.UserId} not found"); } - var originalPictureKeyName = Path.Combine(trackConfiguration.Routes.OriginalPictures, Guid.NewGuid() + request.Picture.FileType); + var originalPictureFileName = Guid.NewGuid() + request.Picture.FileType; + var originalAudioFileName = Guid.NewGuid() + request.Audio.FileType; var track = new Track { Title = request.Title, NormalizedTitle = request.Title.Trim().ToUpperInvariant(), - OriginalPictureKeyName = originalPictureKeyName, + OriginalPictureKeyName = originalPictureFileName, + OriginalAudioKeyName = originalAudioFileName, SmallPictureKeyName = trackConfiguration.Routes.PresetSmallPicture, MediumPictureKeyName = trackConfiguration.Routes.PresetMediumPicture, LargePictureKeyName = trackConfiguration.Routes.PresetLargePicture, }; + var originalPictureKeyName = Path.Combine( + trackConfiguration.Routes.ParentFolder, + trackConfiguration.Routes.OriginalPictures, + originalPictureFileName); var pictureUploadResult = await UploadFile(request.Picture, originalPictureKeyName, cancellationToken); if (!pictureUploadResult.IsSuccess) { @@ -44,7 +50,10 @@ namespace Musify.Application.Tracks.Handler } - var audioKeyName = Path.Combine(trackConfiguration.Routes.Audios, Guid.NewGuid() + request.Audio.FileType); + var audioKeyName = Path.Combine( + trackConfiguration.Routes.ParentFolder, + trackConfiguration.Routes.OriginalAudios, + Guid.NewGuid() + request.Audio.FileType); var audioUploadResult = await UploadFile(request.Audio, audioKeyName, cancellationToken); if (!audioUploadResult.IsSuccess) { @@ -93,12 +102,15 @@ namespace Musify.Application.Tracks.Handler async Task PublishUpdateEvent(string originalPictureKeyName, Track track, CancellationToken cancellationToken) { var smallPictureKeyName = Path.Combine( + trackConfiguration.Routes.ParentFolder, trackConfiguration.Routes.SmallPictures, $"{track.Id}.{pictureHandler.FileExtension}"); var mediumPictureKeyName = Path.Combine( + trackConfiguration.Routes.ParentFolder, trackConfiguration.Routes.MediumPictures, $"{track.Id}.{pictureHandler.FileExtension}"); var largePictureKeyName = Path.Combine( + trackConfiguration.Routes.ParentFolder, trackConfiguration.Routes.LargePictures, $"{track.Id}.{pictureHandler.FileExtension}"); @@ -119,15 +131,17 @@ namespace Musify.Application.Tracks.Handler async Task PublishTranscodeEvent(Guid trackId, string audioKeyName, CancellationToken cancellationToken) { - var destinationAudioKeyName = Path.Combine( - trackConfiguration.Routes.Audios, - trackId.ToString()); + var destinationFolderAudio = Path.Combine( + trackConfiguration.Routes.ParentFolder, + trackConfiguration.Routes.ProcessedAudio, + Guid.NewGuid().ToString()); - await eventBus.PublishAsync(new TranscodeAudioFromTrackEvent( + await eventBus.PublishAsync(new UpdateTrackAudioEvent( + trackId, storageConfiguration.BucketName, audioKeyName, storageConfiguration.BucketName, - destinationAudioKeyName), cancellationToken); + destinationFolderAudio), cancellationToken); } } } diff --git a/Domain/Entities/Track.cs b/Domain/Entities/Track.cs index 888dfd6..ba4f802 100644 --- a/Domain/Entities/Track.cs +++ b/Domain/Entities/Track.cs @@ -32,6 +32,13 @@ namespace Musify.Domain.Entities [MaxLength(64)] public required string LargePictureKeyName { get; set; } + [Required] + [MaxLength(64)] + public required string OriginalAudioKeyName { get; set; } + + [MaxLength(64)] + public string AudioFolderKeyName { get; set; } = string.Empty; + [Required] public DateTime CreatedDate { get; set; } = DateTime.UtcNow; diff --git a/Infrastructure/Infrastructure.csproj b/Infrastructure/Infrastructure.csproj index 98ee6a2..256cc80 100644 --- a/Infrastructure/Infrastructure.csproj +++ b/Infrastructure/Infrastructure.csproj @@ -38,9 +38,7 @@ - - diff --git a/Infrastructure/MassTransit/Activities/Audio/TranscodeDashAudioActivity.cs b/Infrastructure/MassTransit/Activities/Audio/TranscodeDashAudioActivity.cs index 123092f..7665e75 100644 --- a/Infrastructure/MassTransit/Activities/Audio/TranscodeDashAudioActivity.cs +++ b/Infrastructure/MassTransit/Activities/Audio/TranscodeDashAudioActivity.cs @@ -39,21 +39,23 @@ namespace Musify.Infrastructure.Messaging.Activities try { - await using var fileStream = File.OpenRead(sourceFilePath); - - var result = await audioTranscoder.TranscodeToDashAsync( - fileStream, - workingDirectory, - executeContext.CancellationToken); - - if (!result.IsSuccess) + await using (var fileStream = File.OpenRead(sourceFilePath)) { - var errorMessage = string.Join("; ", result.Errors); - logger.LogError("Transcoding failed for file {SourceFilePath}. Errors: {ErrorMessage}", - sourceFilePath, errorMessage); - throw new Exception(errorMessage); + var result = await audioTranscoder.TranscodeToDashAsync( + fileStream, + workingDirectory, + executeContext.CancellationToken); + + if (!result.IsSuccess) + { + var errorMessage = string.Join("; ", result.Errors); + logger.LogError("Transcoding failed for file {SourceFilePath}. Errors: {ErrorMessage}", + sourceFilePath, errorMessage); + throw new Exception(errorMessage); + } } + File.Delete(sourceFilePath); await processTrackingStore.CompleteStepAsync(processId, stepId, executeContext.CancellationToken); return executeContext.Completed(); } diff --git a/Infrastructure/MassTransit/Activities/Audio/UpdateTrackAudioActivity.cs b/Infrastructure/MassTransit/Activities/Audio/UpdateTrackAudioActivity.cs new file mode 100644 index 0000000..2530b45 --- /dev/null +++ b/Infrastructure/MassTransit/Activities/Audio/UpdateTrackAudioActivity.cs @@ -0,0 +1,99 @@ +using MassTransit; +using Microsoft.Extensions.Logging; +using Musify.Application.Contracts.Infrastructure; +using Musify.Domain.Entities; +using Musify.Infrastructure.MassTransit.Arguments; +using Musify.Infrastructure.MassTransit.Logs; +using Musify.Infrastructure.Messaging.Activities; + +namespace Musify.Infrastructure.MassTransit.Activities.Audio +{ + public class UpdateTrackAudioActivity( + IDatabase database, + ILogger logger, + IProcessTrackingStore processTrackingStore) + : IActivity + { + public const string ExecuteEndpointName = "update-track-audio"; + + public async Task Execute(ExecuteContext executeContext) + { + var processId = await processTrackingStore.GetOrCreateProcessAsync( + "RoutingSlip", + executeContext.CorrelationId ?? executeContext.TrackingNumber, + executeContext.ConversationId, + executeContext.MessageId, + executeContext.CancellationToken); + + var stepId = await processTrackingStore.StartStepAsync( + processId, + nameof(UpdateTrackAudioActivity), + ProcessStepComponentType.Activity, + 0, + executeContext.CancellationToken); + + try + { + var track = await database.Tracks.FindAsync( + [executeContext.Arguments.TrackId], + cancellationToken: executeContext.CancellationToken); + + if (track is null) + { + logger.LogWarning("Track with id {TrackId} not found", + executeContext.Arguments.TrackId); + throw new InvalidOperationException($"Track with id {executeContext.Arguments.TrackId} not found"); + } + + var log = new UpdateTrackAudioLog( + track.Id, + track.AudioFolderKeyName); + + track.AudioFolderKeyName = Path.GetFileName(executeContext.Arguments.AudioFolderKeyName); + + database.Tracks.Update(track); + await database.SaveChangesAsync(executeContext.CancellationToken); + + logger.LogInformation("Updated Track {TrackId} audio", + executeContext.Arguments.TrackId); + + await processTrackingStore.CompleteStepAsync(processId, stepId, executeContext.CancellationToken); + return executeContext.Completed(); + } + catch (Exception exception) + { + logger.LogError(exception, "Error updating Track {TrackId} audio", + executeContext.Arguments.TrackId); + await processTrackingStore.FailStepAsync(processId, stepId, exception.Message, executeContext.CancellationToken); + throw; + } + } + + public async Task Compensate(CompensateContext compensateContext) + { + try + { + var track = await database.Tracks.FindAsync( + [compensateContext.Log.TrackId], + cancellationToken: compensateContext.CancellationToken); + + if (track is null) + { + return compensateContext.Compensated(); + } + + track.AudioFolderKeyName = compensateContext.Log.PreviousFolderAudioKeyName; + + database.Tracks.Update(track); + await database.SaveChangesAsync(compensateContext.CancellationToken); + + return compensateContext.Compensated(); + } + catch (Exception exception) + { + logger.LogError(exception, "Error compensating Track {TrackId} audio", compensateContext.Log.TrackId); + return compensateContext.Failed(exception); + } + } + } +} \ No newline at end of file diff --git a/Infrastructure/MassTransit/Activities/Files/TransferFilesToBucketActivity.cs b/Infrastructure/MassTransit/Activities/Files/TransferFilesToBucketActivity.cs index 0c955eb..7af6d04 100644 --- a/Infrastructure/MassTransit/Activities/Files/TransferFilesToBucketActivity.cs +++ b/Infrastructure/MassTransit/Activities/Files/TransferFilesToBucketActivity.cs @@ -46,7 +46,7 @@ namespace Musify.Infrastructure.Messaging.Activities try { var uploadedKeys = Directory.GetFiles(folderPath) - .Select(file => $"{destinationKeyName}/{Path.GetFileName(file) }") + .Select(file => Path.Combine(destinationKeyName, Path.GetFileName(file))) .ToArray(); var transferFilesResult = await storageHandler.TransferFilesAsync( diff --git a/Infrastructure/MassTransit/Activities/Pictures/UpdatePlayListPictureActivity.cs b/Infrastructure/MassTransit/Activities/Pictures/UpdatePlayListPictureActivity.cs index 47a1c0f..40a68a8 100644 --- a/Infrastructure/MassTransit/Activities/Pictures/UpdatePlayListPictureActivity.cs +++ b/Infrastructure/MassTransit/Activities/Pictures/UpdatePlayListPictureActivity.cs @@ -51,10 +51,10 @@ namespace Musify.Infrastructure.Messaging.Activities playList.MediumPictureKeyName, playList.LargePictureKeyName); - playList.OriginalPictureKeyName = executeContext.Arguments.OriginalPictureKeyName; - playList.SmallPictureKeyName = executeContext.Arguments.SmallPictureKeyName; - playList.MediumPictureKeyName = executeContext.Arguments.MediumPictureKeyName; - playList.LargePictureKeyName = executeContext.Arguments.LargePictureKeyName; + playList.OriginalPictureKeyName = Path.GetFileName(executeContext.Arguments.OriginalPictureKeyName); + playList.SmallPictureKeyName = Path.GetFileName(executeContext.Arguments.SmallPictureKeyName); + playList.MediumPictureKeyName = Path.GetFileName(executeContext.Arguments.MediumPictureKeyName); + playList.LargePictureKeyName = Path.GetFileName(executeContext.Arguments.LargePictureKeyName); database.PlayLists.Update(playList); await database.SaveChangesAsync(executeContext.CancellationToken); diff --git a/Infrastructure/MassTransit/Activities/Pictures/UpdateTrackPictureActivity.cs b/Infrastructure/MassTransit/Activities/Pictures/UpdateTrackPictureActivity.cs index dd88b29..585b0b6 100644 --- a/Infrastructure/MassTransit/Activities/Pictures/UpdateTrackPictureActivity.cs +++ b/Infrastructure/MassTransit/Activities/Pictures/UpdateTrackPictureActivity.cs @@ -51,10 +51,10 @@ namespace Musify.Infrastructure.Messaging.Activities track.MediumPictureKeyName, track.LargePictureKeyName); - track.OriginalPictureKeyName = executeContext.Arguments.OriginalPictureKeyName; - track.SmallPictureKeyName = executeContext.Arguments.SmallPictureKeyName; - track.MediumPictureKeyName = executeContext.Arguments.MediumPictureKeyName; - track.LargePictureKeyName = executeContext.Arguments.LargePictureKeyName; + track.OriginalPictureKeyName = Path.GetFileName(executeContext.Arguments.OriginalPictureKeyName); + track.SmallPictureKeyName = Path.GetFileName(executeContext.Arguments.SmallPictureKeyName); + track.MediumPictureKeyName = Path.GetFileName(executeContext.Arguments.MediumPictureKeyName); + track.LargePictureKeyName = Path.GetFileName(executeContext.Arguments.LargePictureKeyName); database.Tracks.Update(track); await database.SaveChangesAsync(executeContext.CancellationToken); diff --git a/Infrastructure/MassTransit/Arguments/UpdateTrackAudioArguments.cs b/Infrastructure/MassTransit/Arguments/UpdateTrackAudioArguments.cs new file mode 100644 index 0000000..b3a741f --- /dev/null +++ b/Infrastructure/MassTransit/Arguments/UpdateTrackAudioArguments.cs @@ -0,0 +1,6 @@ +namespace Musify.Infrastructure.MassTransit.Arguments +{ + public record UpdateTrackAudioArguments( + Guid TrackId, + string AudioFolderKeyName); +} \ No newline at end of file diff --git a/Infrastructure/MassTransit/Consumers/TranscodeAudioFromTrackConsumer.cs b/Infrastructure/MassTransit/Consumers/UpdateTrackAudioConsumer.cs similarity index 57% rename from Infrastructure/MassTransit/Consumers/TranscodeAudioFromTrackConsumer.cs rename to Infrastructure/MassTransit/Consumers/UpdateTrackAudioConsumer.cs index 9ce7347..2d44e9c 100644 --- a/Infrastructure/MassTransit/Consumers/TranscodeAudioFromTrackConsumer.cs +++ b/Infrastructure/MassTransit/Consumers/UpdateTrackAudioConsumer.cs @@ -2,16 +2,16 @@ using Musify.Application.Events; using Musify.Infrastructure.Messaging.RoutingSlip.Builders; -namespace Musify.Infrastructure.Messaging.Consumers +namespace Musify.Infrastructure.MassTransit.Consumers { - public class TranscodeAudioFromTrackConsumer( + public class UpdateTrackAudioConsumer( IBus bus, AudioWorkflowRoutingSlipBuilder routingSlipBuilder) - : IConsumer + : IConsumer { - public const string QueueName = "transcode-audio-from-track"; + public const string QueueName = "update-track-audio"; - public async Task Consume(ConsumeContext consumeContext) + public async Task Consume(ConsumeContext consumeContext) { var routingSlip = routingSlipBuilder .Build(consumeContext.Message, consumeContext.CorrelationId) diff --git a/Infrastructure/MassTransit/DependencyInjection/MessagingDependencyInjection.cs b/Infrastructure/MassTransit/DependencyInjection/MessagingDependencyInjection.cs index 3c35432..b2b4cc4 100644 --- a/Infrastructure/MassTransit/DependencyInjection/MessagingDependencyInjection.cs +++ b/Infrastructure/MassTransit/DependencyInjection/MessagingDependencyInjection.cs @@ -1,7 +1,10 @@ using MassTransit; using Microsoft.Extensions.DependencyInjection; using Musify.Infrastructure.Configuration; +using Musify.Infrastructure.MassTransit.Activities.Audio; +using Musify.Infrastructure.MassTransit.Arguments; using Musify.Infrastructure.MassTransit.Consumers; +using Musify.Infrastructure.MassTransit.Logs; using Musify.Infrastructure.Messaging.Activities; using Musify.Infrastructure.Messaging.Activities.Arguments; using Musify.Infrastructure.Messaging.Activities.Logs; @@ -36,9 +39,9 @@ namespace Musify.Infrastructure.Messaging { options.AddConsumer(); options.AddConsumer(); - options.AddConsumer(); options.AddConsumer(); options.AddConsumer(); + options.AddConsumer(); options.AddExecuteActivity(); options.AddExecuteActivity(); @@ -50,6 +53,7 @@ namespace Musify.Infrastructure.Messaging options.AddActivity(); options.AddActivity(); options.AddActivity(); + options.AddActivity(); options.UsingRabbitMq((busRegistrationContext, busFactoryConfigurator) => { @@ -69,9 +73,9 @@ namespace Musify.Infrastructure.Messaging endpointConfigurator.ConfigureConsumer(busRegistrationContext); } ); - busFactoryConfigurator.ReceiveEndpoint(TranscodeAudioFromTrackConsumer.QueueName, endpointConfigurator => + busFactoryConfigurator.ReceiveEndpoint(UpdateTrackAudioConsumer.QueueName, endpointConfigurator => { - endpointConfigurator.ConfigureConsumer(busRegistrationContext); + endpointConfigurator.ConfigureConsumer(busRegistrationContext); } ); busFactoryConfigurator.ReceiveEndpoint(UpdateTrackPictureConsumer.QueueName, endpointConfigurator => diff --git a/Infrastructure/MassTransit/RoutingSlip/ActivityNames.cs b/Infrastructure/MassTransit/RoutingSlip/ActivityNames.cs index 6f52fa2..b726249 100644 --- a/Infrastructure/MassTransit/RoutingSlip/ActivityNames.cs +++ b/Infrastructure/MassTransit/RoutingSlip/ActivityNames.cs @@ -14,5 +14,6 @@ namespace Musify.Infrastructure.Messaging.RoutingSlip internal const string DeleteOriginal = "DeleteOriginal"; internal const string UpdateTrackPicture = "UpdateTrackPicture"; internal const string UpdatePlayListPicture = "UpdatePlayListPicture"; + internal const string UpdateTrackAudio = "UpdateTrackAudio"; } } diff --git a/Infrastructure/MassTransit/RoutingSlip/Builders/AudioWorkflowRoutingSlipBuilder.cs b/Infrastructure/MassTransit/RoutingSlip/Builders/AudioWorkflowRoutingSlipBuilder.cs index 11ae04b..e93f33b 100644 --- a/Infrastructure/MassTransit/RoutingSlip/Builders/AudioWorkflowRoutingSlipBuilder.cs +++ b/Infrastructure/MassTransit/RoutingSlip/Builders/AudioWorkflowRoutingSlipBuilder.cs @@ -2,6 +2,8 @@ using MassTransit; using MassTransit.Courier.Contracts; using Musify.Application.Events; using Musify.Infrastructure.Configuration; +using Musify.Infrastructure.MassTransit.Activities.Audio; +using Musify.Infrastructure.MassTransit.Arguments; using Musify.Infrastructure.MassTransit.Consumers; using Musify.Infrastructure.Messaging.Activities; using Musify.Infrastructure.Messaging.Activities.Arguments; @@ -11,7 +13,7 @@ namespace Musify.Infrastructure.Messaging.RoutingSlip.Builders { public class AudioWorkflowRoutingSlipBuilder(WorkerConfiguration workerConfiguration) { - public RoutingSlipBuilder Build(TranscodeAudioFromTrackEvent message, Guid? correlationId) + public RoutingSlipBuilder Build(UpdateTrackAudioEvent message, Guid? correlationId) { var routingSlipBuilder = new RoutingSlipBuilder(NewId.NextGuid()); @@ -49,7 +51,14 @@ namespace Musify.Infrastructure.Messaging.RoutingSlip.Builders new TransferFilesToBucketArguments( message.DestinationBucketName, RoutingSlipVariableNames.Audio.TranscodedDirectory, - message.DestinationKeyName)); + message.DestinationFolderKeyName)); + + routingSlipBuilder.AddActivity( + ActivityNames.UpdateTrackAudio, + MessagingHelper.BuildExecuteActivityUri(UpdateTrackAudioActivity.ExecuteEndpointName), + new UpdateTrackAudioArguments( + message.TrackId, + message.DestinationFolderKeyName)); return routingSlipBuilder; } diff --git a/Infrastructure/MassTransit/RoutingSlip/Builders/PictureWorkflowRoutingSlipBuilder.cs b/Infrastructure/MassTransit/RoutingSlip/Builders/PictureWorkflowRoutingSlipBuilder.cs index d81366e..5ae5f8c 100644 --- a/Infrastructure/MassTransit/RoutingSlip/Builders/PictureWorkflowRoutingSlipBuilder.cs +++ b/Infrastructure/MassTransit/RoutingSlip/Builders/PictureWorkflowRoutingSlipBuilder.cs @@ -130,11 +130,6 @@ namespace Musify.Infrastructure.Messaging.RoutingSlip.Builders largePictureWidth, largePictureHeight); - routingSlipBuilder.AddActivity( - ActivityNames.DeleteOriginal, - MessagingHelper.BuildExecuteActivityUri(RemoveFileFromBucketActivity.ExecuteEndpointName), - new RemoveFileFromBucketArguments(sourceBucketName, sourceKeyName)); - routingSlipBuilder.AddActivity( ActivityNames.UploadFiles, MessagingHelper.BuildExecuteActivityUri(TransferFilesToBucketActivity.ExecuteEndpointName), diff --git a/Infrastructure/Persistence/Migrations/20260324183733_FirstMigration.Designer.cs b/Infrastructure/Persistence/Migrations/20260325003221_FirstMigration.Designer.cs similarity index 96% rename from Infrastructure/Persistence/Migrations/20260324183733_FirstMigration.Designer.cs rename to Infrastructure/Persistence/Migrations/20260325003221_FirstMigration.Designer.cs index 3eea4a7..e9a6cc7 100644 --- a/Infrastructure/Persistence/Migrations/20260324183733_FirstMigration.Designer.cs +++ b/Infrastructure/Persistence/Migrations/20260325003221_FirstMigration.Designer.cs @@ -12,7 +12,7 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace Musify.Infrastructure.Persistence.Migrations { [DbContext(typeof(Database))] - [Migration("20260324183733_FirstMigration")] + [Migration("20260325003221_FirstMigration")] partial class FirstMigration { /// @@ -195,6 +195,11 @@ namespace Musify.Infrastructure.Persistence.Migrations .ValueGeneratedOnAdd() .HasColumnType("uuid"); + b.Property("AudioFolderKeyName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + b.Property("CreatedDate") .HasColumnType("timestamp with time zone"); @@ -213,6 +218,11 @@ namespace Musify.Infrastructure.Persistence.Migrations .HasMaxLength(50) .HasColumnType("character varying(50)"); + b.Property("OriginalAudioKeyName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + b.Property("OriginalPictureKeyName") .IsRequired() .HasMaxLength(64) diff --git a/Infrastructure/Persistence/Migrations/20260324183733_FirstMigration.cs b/Infrastructure/Persistence/Migrations/20260325003221_FirstMigration.cs similarity index 97% rename from Infrastructure/Persistence/Migrations/20260324183733_FirstMigration.cs rename to Infrastructure/Persistence/Migrations/20260325003221_FirstMigration.cs index 43e95a3..5994892 100644 --- a/Infrastructure/Persistence/Migrations/20260324183733_FirstMigration.cs +++ b/Infrastructure/Persistence/Migrations/20260325003221_FirstMigration.cs @@ -41,6 +41,8 @@ namespace Musify.Infrastructure.Persistence.Migrations SmallPictureKeyName = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), MediumPictureKeyName = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), LargePictureKeyName = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), + OriginalAudioKeyName = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), + AudioFolderKeyName = table.Column(type: "character varying(64)", maxLength: 64, nullable: false), CreatedDate = table.Column(type: "timestamp with time zone", nullable: false), UpdatedDate = table.Column(type: "timestamp with time zone", nullable: false) }, diff --git a/Infrastructure/Persistence/Migrations/DatabaseModelSnapshot.cs b/Infrastructure/Persistence/Migrations/DatabaseModelSnapshot.cs index 73fc038..b4994a4 100644 --- a/Infrastructure/Persistence/Migrations/DatabaseModelSnapshot.cs +++ b/Infrastructure/Persistence/Migrations/DatabaseModelSnapshot.cs @@ -192,6 +192,11 @@ namespace Musify.Infrastructure.Persistence.Migrations .ValueGeneratedOnAdd() .HasColumnType("uuid"); + b.Property("AudioFolderKeyName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + b.Property("CreatedDate") .HasColumnType("timestamp with time zone"); @@ -210,6 +215,11 @@ namespace Musify.Infrastructure.Persistence.Migrations .HasMaxLength(50) .HasColumnType("character varying(50)"); + b.Property("OriginalAudioKeyName") + .IsRequired() + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + b.Property("OriginalPictureKeyName") .IsRequired() .HasMaxLength(64) diff --git a/Infrastructure/Storage/StorageHandler.cs b/Infrastructure/Storage/StorageHandler.cs index cfc0d53..a61c822 100644 --- a/Infrastructure/Storage/StorageHandler.cs +++ b/Infrastructure/Storage/StorageHandler.cs @@ -80,27 +80,28 @@ namespace Musify.Infrastructure.Storage string fileName = Path.GetFileName(file); string filePath = Path.Combine(sourceDirectory, file); + var keyName = Path.Combine(route, fileName); var upload = new Upload { Id = Guid.NewGuid(), BucketName = bucketName, - KeyName = $"{route}/{fileName}", + KeyName = keyName, ContentType = "Application/Octet-Stream" }; await database.Uploads.AddAsync(upload, cancellationToken); try { - await trasnsferUtility.UploadAsync(filePath, bucketName, fileName, cancellationToken); + await trasnsferUtility.UploadAsync(filePath, bucketName, keyName, cancellationToken); upload.State = UploadState.Successful; successCount++; - logger.LogDebug("Transferred file to S3. Bucket: {BucketName}, Route: {Route}, File: {FileName}", bucketName, route, fileName); + logger.LogDebug("Transferred file to S3. Bucket: {BucketName}, KeyName: {KeyName}", bucketName, keyName); } catch (Exception exception) { failedCount++; upload.State = UploadState.Failed; - logger.LogError(exception, "Failed to transfer file to S3. Bucket: {BucketName}, Route: {Route}, File: {FileName}", bucketName, route, fileName); + logger.LogError(exception, "Failed to transfer file to S3. Bucket: {BucketName}, keyName: {keyName}", bucketName, keyName); } }