Changes on routes

This commit is contained in:
2026-03-27 21:16:38 +01:00
parent c4fae8b5e6
commit 8e678435f4
13 changed files with 92 additions and 60 deletions
@@ -8,6 +8,8 @@ namespace Musify.Application.Contracts.Infrastructure
Task<string> GetUrlAsync(string bucketName, string keyName, TimeSpan ExpirationTime, CancellationToken cancellationToken); Task<string> GetUrlAsync(string bucketName, string keyName, TimeSpan ExpirationTime, CancellationToken cancellationToken);
Task<Result<string>> UploadFileAsync(string filePath, string bucketName, string keyName, CancellationToken cancellationToken);
Task<Result<string>> UploadFileAsync(Stream sourceStream, string contentType, string bucketName, string keyName, CancellationToken cancellationToken); Task<Result<string>> UploadFileAsync(Stream sourceStream, string contentType, string bucketName, string keyName, CancellationToken cancellationToken);
Task<Result> TransferFilesAsync(string sourceDirectory, string bucketName, string route, CancellationToken cancellationToken); Task<Result> TransferFilesAsync(string sourceDirectory, string bucketName, string route, CancellationToken cancellationToken);
@@ -4,13 +4,13 @@
Guid TrackId, Guid TrackId,
string SourceBucketName, string SourceBucketName,
string SourceKeyName, string SourceKeyName,
string SmallPictureKeyName, string SmallPictureRoute,
int SmallPictureWidth, int SmallPictureWidth,
int SmallPictureHeight, int SmallPictureHeight,
string MediumPictureKeyName, string MediumPictureRoute,
int MediumPictureWidth, int MediumPictureWidth,
int MediumPictureHeight, int MediumPictureHeight,
string LargePictureKeyName, string LargePictureRoute,
int LargePictureWidth, int LargePictureWidth,
int LargePictureHeight); int LargePictureHeight);
} }
@@ -11,7 +11,7 @@ using Musify.Domain.Entities;
namespace Musify.Application.Tracks.Handler namespace Musify.Application.Tracks.Handler
{ {
public class CreateTrackCommandHandler(IDatabase database, IPictureHandler pictureHandler, IEventBus eventBus, IStorageHandler storageHandler, public class CreateTrackCommandHandler(IDatabase database, IEventBus eventBus, IStorageHandler storageHandler,
ILogger<CreateTrackCommandHandler> logger, ApplicationStorageConfiguration storageConfiguration, TrackConfiguration trackConfiguration) ILogger<CreateTrackCommandHandler> logger, ApplicationStorageConfiguration storageConfiguration, TrackConfiguration trackConfiguration)
: IRequestHandler<CreateTrackCommand, Task<Result<TrackResponse> >> : IRequestHandler<CreateTrackCommand, Task<Result<TrackResponse> >>
{ {
@@ -38,7 +38,7 @@ namespace Musify.Application.Tracks.Handler
LargePictureKeyName = trackConfiguration.Routes.PresetLargePicture, LargePictureKeyName = trackConfiguration.Routes.PresetLargePicture,
}; };
var originalPictureKeyName = Path.Combine(trackConfiguration.Routes.PresetMediumPicture, var originalPictureKeyName = Path.Combine(trackConfiguration.Routes.OriginalPicturesPath,
originalPictureFileName); originalPictureFileName);
var pictureUploadResult = await UploadFile(request.Picture, originalPictureKeyName, cancellationToken); var pictureUploadResult = await UploadFile(request.Picture, originalPictureKeyName, cancellationToken);
if (!pictureUploadResult.IsSuccess) if (!pictureUploadResult.IsSuccess)
@@ -48,7 +48,7 @@ namespace Musify.Application.Tracks.Handler
} }
var audioKeyName = Path.Combine(trackConfiguration.Routes.OriginalAudiosFolder, var audioKeyName = Path.Combine(trackConfiguration.Routes.OriginalAudiosPath,
Guid.NewGuid() + request.Audio.FileType); Guid.NewGuid() + request.Audio.FileType);
var audioUploadResult = await UploadFile(request.Audio, audioKeyName, cancellationToken); var audioUploadResult = await UploadFile(request.Audio, audioKeyName, cancellationToken);
if (!audioUploadResult.IsSuccess) if (!audioUploadResult.IsSuccess)
@@ -97,31 +97,24 @@ namespace Musify.Application.Tracks.Handler
async Task PublishUpdateEvent(string originalPictureKeyName, Track track, CancellationToken cancellationToken) async Task PublishUpdateEvent(string originalPictureKeyName, Track track, CancellationToken cancellationToken)
{ {
var smallPictureKeyName = Path.Combine(trackConfiguration.Routes.MediumPicturesPath,
track.Id + pictureHandler.FileExtension);
var mediumPictureKeyName = Path.Combine(trackConfiguration.Routes.MediumPicturesPath,
track.Id + pictureHandler.FileExtension);
var largePictureKeyName = Path.Combine(trackConfiguration.Routes.LargePicturesPath,
track.Id + pictureHandler.FileExtension);
await eventBus.PublishAsync(new UpdateTrackPictureEvent( await eventBus.PublishAsync(new UpdateTrackPictureEvent(
track.Id, track.Id,
storageConfiguration.BucketName, storageConfiguration.BucketName,
originalPictureKeyName, originalPictureKeyName,
smallPictureKeyName, trackConfiguration.Routes.SmallPicturesPath,
trackConfiguration.PicturesSizes.SmallPictureWidth, trackConfiguration.PicturesSizes.SmallPictureWidth,
trackConfiguration.PicturesSizes.SmallPictureHeight, trackConfiguration.PicturesSizes.SmallPictureHeight,
mediumPictureKeyName, trackConfiguration.Routes.MediumPicturesPath,
trackConfiguration.PicturesSizes.MediumPictureWidth, trackConfiguration.PicturesSizes.MediumPictureWidth,
trackConfiguration.PicturesSizes.MediumPictureHeight, trackConfiguration.PicturesSizes.MediumPictureHeight,
largePictureKeyName, trackConfiguration.Routes.LargePicturesPath,
trackConfiguration.PicturesSizes.LargePictureWidth, trackConfiguration.PicturesSizes.LargePictureWidth,
trackConfiguration.PicturesSizes.LargePictureHeight), cancellationToken); trackConfiguration.PicturesSizes.LargePictureHeight), cancellationToken);
} }
async Task PublishTranscodeEvent(Guid trackId, string audioKeyName, CancellationToken cancellationToken) async Task PublishTranscodeEvent(Guid trackId, string audioKeyName, CancellationToken cancellationToken)
{ {
var destinationFolderAudio = Path.Combine(trackConfiguration.Routes.ProcessedAudioFolder, var destinationFolderAudio = Path.Combine(trackConfiguration.Routes.ProcessedAudiosPath,
Guid.NewGuid().ToString()); Guid.NewGuid().ToString());
await eventBus.PublishAsync(new UpdateTrackAudioEvent( await eventBus.PublishAsync(new UpdateTrackAudioEvent(
+1
View File
@@ -21,6 +21,7 @@
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="10.0.5" /> <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="10.0.5" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="10.0.5" /> <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="10.0.5" />
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="6.0.1" /> <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="6.0.1" />
<PackageReference Include="MimeMapping" Version="4.0.0" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="10.0.1" /> <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="10.0.1" />
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.15.0" /> <PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.15.0" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.15.0" /> <PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.15.0" />
@@ -1,5 +1,6 @@
using MassTransit; using MassTransit;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using MimeMapping;
using Musify.Application.Contracts.Infrastructure; using Musify.Application.Contracts.Infrastructure;
using Musify.Domain.Entities; using Musify.Domain.Entities;
using Musify.Infrastructure.MassTransit.Arguments; using Musify.Infrastructure.MassTransit.Arguments;
@@ -33,16 +34,14 @@ namespace Musify.Infrastructure.MassTransit.Activities.Files
var sourceFilePath = executeContext.GetVariable<string>(executeContext.Arguments.FilePathVariableName); var sourceFilePath = executeContext.GetVariable<string>(executeContext.Arguments.FilePathVariableName);
if (string.IsNullOrEmpty(sourceFilePath)) if (string.IsNullOrEmpty(sourceFilePath))
throw new InvalidOperationException($"Upload activity requires variable '{executeContext.Arguments.FilePathVariableName}' with source file path."); throw new InvalidOperationException($"Upload activity requires variable '{executeContext.Arguments.FilePathVariableName}' with source file path.");
var fileName = Path.GetFileName(sourceFilePath);
try try
{ {
using var fileStream = File.OpenRead(sourceFilePath);
var uploadResult = await storageHandler.UploadFileAsync( var uploadResult = await storageHandler.UploadFileAsync(
fileStream, sourceFilePath,
executeContext.Arguments.ContentType,
executeContext.Arguments.DestinationBucketName, executeContext.Arguments.DestinationBucketName,
executeContext.Arguments.DestinationKeyName, Path.Combine(executeContext.Arguments.DestinationRoute, fileName),
executeContext.CancellationToken); executeContext.CancellationToken);
if (!uploadResult.IsSuccess) if (!uploadResult.IsSuccess)
@@ -50,15 +49,15 @@ namespace Musify.Infrastructure.MassTransit.Activities.Files
var errors = string.Join("; ", uploadResult.Errors); var errors = string.Join("; ", uploadResult.Errors);
logger.LogWarning("Failed to upload file to bucket. Bucket: {BucketName}, Key: {KeyName}, Errors: {Errors}", logger.LogWarning("Failed to upload file to bucket. Bucket: {BucketName}, Key: {KeyName}, Errors: {Errors}",
executeContext.Arguments.DestinationBucketName, executeContext.Arguments.DestinationBucketName,
executeContext.Arguments.DestinationKeyName, executeContext.Arguments.DestinationRoute,
errors); errors);
throw new Exception(errors); throw new Exception(errors);
} }
await processTrackingStore.CompleteStepAsync(processId, stepId, executeContext.CancellationToken); await processTrackingStore.CompleteStepAsync(processId, stepId, executeContext.CancellationToken);
return executeContext.Completed(new UploadFileToBucketLog( return executeContext.CompletedWithVariables(new UploadFileToBucketLog(
executeContext.Arguments.DestinationBucketName, executeContext.Arguments.DestinationBucketName,
executeContext.Arguments.DestinationKeyName)); executeContext.Arguments.DestinationRoute));
} }
catch (Exception exception) catch (Exception exception)
{ {
@@ -4,6 +4,7 @@ using Musify.Application.Contracts.Infrastructure;
using Musify.Domain.Entities; using Musify.Domain.Entities;
using Musify.Infrastructure.MassTransit.Activities.Arguments; using Musify.Infrastructure.MassTransit.Activities.Arguments;
using Musify.Infrastructure.MassTransit.Activities.Logs; using Musify.Infrastructure.MassTransit.Activities.Logs;
using Musify.Infrastructure.MassTransit.RoutingSlip.Builders;
namespace Musify.Infrastructure.MassTransit.Activities namespace Musify.Infrastructure.MassTransit.Activities
{ {
@@ -66,9 +67,7 @@ namespace Musify.Infrastructure.MassTransit.Activities
var destinationDirectory = Path.GetDirectoryName(destinationFilePath); var destinationDirectory = Path.GetDirectoryName(destinationFilePath);
if (!string.IsNullOrEmpty(destinationDirectory)) if (!string.IsNullOrEmpty(destinationDirectory))
{
Directory.CreateDirectory(destinationDirectory); Directory.CreateDirectory(destinationDirectory);
}
await using var destinationStream = File.Create(destinationFilePath); await using var destinationStream = File.Create(destinationFilePath);
await resizedPicture.Value.CopyToAsync(destinationStream, executeContext.CancellationToken); await resizedPicture.Value.CopyToAsync(destinationStream, executeContext.CancellationToken);
@@ -80,7 +79,7 @@ namespace Musify.Infrastructure.MassTransit.Activities
executeContext.Arguments.Height); executeContext.Arguments.Height);
await processTrackingStore.CompleteStepAsync(processId, stepId, executeContext.CancellationToken); await processTrackingStore.CompleteStepAsync(processId, stepId, executeContext.CancellationToken);
return executeContext.Completed(); return executeContext.Completed(new ResizePictureLog(destinationFilePath));
} }
catch (Exception exception) catch (Exception exception)
{ {
@@ -2,8 +2,5 @@ namespace Musify.Infrastructure.MassTransit.Activities.Arguments
{ {
public record GeneratePictureWorkflowPathsArguments( public record GeneratePictureWorkflowPathsArguments(
string TemporaryRootDirectory, string TemporaryRootDirectory,
string SourceKeyName, string SourceKeyName);
string SmallPictureKeyName, }
string MediumPictureKeyName,
string LargePictureKeyName);
}
@@ -2,7 +2,6 @@
{ {
public record UploadFileToBucketArguments( public record UploadFileToBucketArguments(
string FilePathVariableName, string FilePathVariableName,
string ContentType,
string DestinationBucketName, string DestinationBucketName,
string DestinationKeyName); string DestinationRoute);
} }
@@ -182,14 +182,14 @@ namespace Musify.Infrastructure.MassTransit
where TLog : class where TLog : class
{ {
busFactoryConfigurator.ReceiveEndpoint($"{endpointName}_execute", endpointConfigurator => busFactoryConfigurator.ReceiveEndpoint($"{endpointName}_execute", endpointConfigurator =>
{ endpointConfigurator.ExecuteActivityHost<TActivity, TArguments>(
endpointConfigurator.ExecuteActivityHost<TActivity, TArguments>(busRegistrationContext); MessagingHelper.BuildCompensateActivityUri(endpointName),
} ); busRegistrationContext)
);
busFactoryConfigurator.ReceiveEndpoint($"{endpointName}_compensate", endpointConfigurator => busFactoryConfigurator.ReceiveEndpoint($"{endpointName}_compensate", endpointConfigurator =>
{ endpointConfigurator.CompensateActivityHost<TActivity, TLog>(busRegistrationContext)
endpointConfigurator.CompensateActivityHost<TActivity, TLog>(busRegistrationContext); );
} );
} }
} }
} }
@@ -9,8 +9,10 @@ namespace Musify.Infrastructure.MassTransit.RoutingSlip
internal const string ResizeSmall = "ResizeSmall"; internal const string ResizeSmall = "ResizeSmall";
internal const string ResizeMedium = "ResizeMedium"; internal const string ResizeMedium = "ResizeMedium";
internal const string ResizeLarge = "ResizeLarge"; internal const string ResizeLarge = "ResizeLarge";
internal const string UploadSmall = "UploadSmall";
internal const string UploadMedium = "UploadMedium";
internal const string UploadLarge = "UploadLarge";
internal const string TransferFiles = "TransferFiles"; internal const string TransferFiles = "TransferFiles";
internal const string UploadFiles = "UploadFiles";
internal const string RemoveFile = "RemoveFile"; internal const string RemoveFile = "RemoveFile";
internal const string DeleteOriginal = "DeleteOriginal"; internal const string DeleteOriginal = "DeleteOriginal";
internal const string UpdateTrackPicture = "UpdateTrackPicture"; internal const string UpdateTrackPicture = "UpdateTrackPicture";
@@ -1,10 +1,13 @@
using MassTransit; using MassTransit;
using MassTransit.Courier.Contracts; using MassTransit.Courier.Contracts;
using MimeMapping;
using Musify.Application.Events; using Musify.Application.Events;
using Musify.Infrastructure.Configuration; using Musify.Infrastructure.Configuration;
using Musify.Infrastructure.MassTransit.Consumers;
using Musify.Infrastructure.MassTransit.Activities; using Musify.Infrastructure.MassTransit.Activities;
using Musify.Infrastructure.MassTransit.Activities.Arguments; using Musify.Infrastructure.MassTransit.Activities.Arguments;
using Musify.Infrastructure.MassTransit.Activities.Files;
using Musify.Infrastructure.MassTransit.Arguments;
using Musify.Infrastructure.MassTransit.Consumers;
namespace Musify.Infrastructure.MassTransit.RoutingSlip.Builders namespace Musify.Infrastructure.MassTransit.RoutingSlip.Builders
{ {
@@ -15,13 +18,13 @@ namespace Musify.Infrastructure.MassTransit.RoutingSlip.Builders
var routingSlipBuilder = BuildPictureWorkflow( var routingSlipBuilder = BuildPictureWorkflow(
message.SourceBucketName, message.SourceBucketName,
message.SourceKeyName, message.SourceKeyName,
message.SmallPictureKeyName, message.SmallPictureRoute,
message.SmallPictureWidth, message.SmallPictureWidth,
message.SmallPictureHeight, message.SmallPictureHeight,
message.MediumPictureKeyName, message.MediumPictureRoute,
message.MediumPictureWidth, message.MediumPictureWidth,
message.MediumPictureHeight, message.MediumPictureHeight,
message.LargePictureKeyName, message.LargePictureRoute,
message.LargePictureWidth, message.LargePictureWidth,
message.LargePictureHeight, message.LargePictureHeight,
correlationId); correlationId);
@@ -36,9 +39,9 @@ namespace Musify.Infrastructure.MassTransit.RoutingSlip.Builders
new UpdateTrackPictureArguments( new UpdateTrackPictureArguments(
message.TrackId, message.TrackId,
message.SourceKeyName, message.SourceKeyName,
message.SmallPictureKeyName, message.SmallPictureRoute,
message.MediumPictureKeyName, message.MediumPictureRoute,
message.LargePictureKeyName)); message.LargePictureRoute));
return routingSlipBuilder; return routingSlipBuilder;
} }
@@ -73,15 +76,15 @@ namespace Musify.Infrastructure.MassTransit.RoutingSlip.Builders
} }
RoutingSlipBuilder BuildPictureWorkflow( RoutingSlipBuilder BuildPictureWorkflow(
string sourceBucketName, string bucketName,
string sourceKeyName, string sourceKeyName,
string smallPictureKeyName, string destinationSmallPictureRoute,
int smallPictureWidth, int smallPictureWidth,
int smallPictureHeight, int smallPictureHeight,
string mediumPictureKeyName, string destinationMediumPictureRoute,
int mediumPictureWidth, int mediumPictureWidth,
int mediumPictureHeight, int mediumPictureHeight,
string largePictureKeyName, string destinationLargePictureRoute,
int largePictureWidth, int largePictureWidth,
int largePictureHeight, int largePictureHeight,
Guid? correlationId) Guid? correlationId)
@@ -95,37 +98,43 @@ namespace Musify.Infrastructure.MassTransit.RoutingSlip.Builders
MessagingHelper.BuildExecuteActivityUri(GeneratePictureWorkflowPathsActivity.ExecuteEndpointName), MessagingHelper.BuildExecuteActivityUri(GeneratePictureWorkflowPathsActivity.ExecuteEndpointName),
new GeneratePictureWorkflowPathsArguments( new GeneratePictureWorkflowPathsArguments(
workerConfiguration.Routes.TemporaryFilesDirectory, workerConfiguration.Routes.TemporaryFilesDirectory,
sourceKeyName, sourceKeyName));
smallPictureKeyName,
mediumPictureKeyName,
largePictureKeyName));
routingSlipBuilder.AddActivity( routingSlipBuilder.AddActivity(
ActivityNames.DownloadFile, ActivityNames.DownloadFile,
MessagingHelper.BuildExecuteActivityUri(DownloadFileFromBucketActivity.ExecuteEndpointName), MessagingHelper.BuildExecuteActivityUri(DownloadFileFromBucketActivity.ExecuteEndpointName),
new DownloadFileFromBucketArguments( new DownloadFileFromBucketArguments(
sourceBucketName, bucketName,
sourceKeyName, sourceKeyName,
RoutingSlipVariableNames.Picture.OriginalFilePath)); RoutingSlipVariableNames.Picture.OriginalFilePath));
AddResizeActivity( AddResizeActivity(
routingSlipBuilder, routingSlipBuilder,
ActivityNames.ResizeSmall, ActivityNames.ResizeSmall,
ActivityNames.UploadSmall,
bucketName,
RoutingSlipVariableNames.Picture.SmallResizedFilePath, RoutingSlipVariableNames.Picture.SmallResizedFilePath,
destinationSmallPictureRoute,
smallPictureWidth, smallPictureWidth,
smallPictureHeight); smallPictureHeight);
AddResizeActivity( AddResizeActivity(
routingSlipBuilder, routingSlipBuilder,
ActivityNames.ResizeMedium, ActivityNames.ResizeMedium,
ActivityNames.ResizeMedium,
bucketName,
RoutingSlipVariableNames.Picture.MediumResizedFilePath, RoutingSlipVariableNames.Picture.MediumResizedFilePath,
destinationMediumPictureRoute,
mediumPictureWidth, mediumPictureWidth,
mediumPictureHeight); mediumPictureHeight);
AddResizeActivity( AddResizeActivity(
routingSlipBuilder, routingSlipBuilder,
ActivityNames.ResizeLarge, ActivityNames.ResizeLarge,
ActivityNames.UploadLarge,
bucketName,
RoutingSlipVariableNames.Picture.LargeResizedFilePath, RoutingSlipVariableNames.Picture.LargeResizedFilePath,
destinationLargePictureRoute,
largePictureWidth, largePictureWidth,
largePictureHeight); largePictureHeight);
@@ -134,19 +143,30 @@ namespace Musify.Infrastructure.MassTransit.RoutingSlip.Builders
static void AddResizeActivity( static void AddResizeActivity(
RoutingSlipBuilder routingSlipBuilder, RoutingSlipBuilder routingSlipBuilder,
string activityName, string resizeActivityName,
string uploadActivityName,
string bucketName,
string destinationFilePathVariableName, string destinationFilePathVariableName,
string destinationBucketRoute,
int width, int width,
int height) int height)
{ {
routingSlipBuilder.AddActivity( routingSlipBuilder.AddActivity(
activityName, resizeActivityName,
MessagingHelper.BuildExecuteActivityUri(ResizePictureActivity.ExecuteEndpointName), MessagingHelper.BuildExecuteActivityUri(ResizePictureActivity.ExecuteEndpointName),
new ResizePictureLocalArguments( new ResizePictureLocalArguments(
RoutingSlipVariableNames.Picture.OriginalFilePath, RoutingSlipVariableNames.Picture.OriginalFilePath,
destinationFilePathVariableName, destinationFilePathVariableName,
width, width,
height)); height));
routingSlipBuilder.AddActivity(
uploadActivityName,
MessagingHelper.BuildExecuteActivityUri(UploadFileToBucketActivity.ExecuteEndpointName),
new UploadFileToBucketArguments(
destinationFilePathVariableName,
bucketName,
destinationBucketRoute));
} }
} }
} }
@@ -22,6 +22,10 @@ namespace Musify.Infrastructure.MassTransit
internal const string MediumResizedFilePath = "Picture.MediumResizedFilePath"; internal const string MediumResizedFilePath = "Picture.MediumResizedFilePath";
internal const string LargeResizedFilePath = "Picture.LargeResizedFilePath"; internal const string LargeResizedFilePath = "Picture.LargeResizedFilePath";
internal const string DestinationFolderName = "Picture.DestinationFolderName"; internal const string DestinationFolderName = "Picture.DestinationFolderName";
internal const string SmallPictureKeyName = "Picture.SmallPictureKeyName";
internal const string MediumPictureKeyName = "Picture.MediumPictureKeyName";
internal const string LargePictureKeyName = "Picture.LargePictureKeyName";
} }
} }
} }
+16
View File
@@ -3,6 +3,7 @@ using Amazon.S3.Model;
using Amazon.S3.Transfer; using Amazon.S3.Transfer;
using Ardalis.Result; using Ardalis.Result;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using MimeMapping;
using Musify.Application.Contracts.Infrastructure; using Musify.Application.Contracts.Infrastructure;
using Musify.Domain.Entities; using Musify.Domain.Entities;
using Musify.Infrastructure.Configuration; using Musify.Infrastructure.Configuration;
@@ -111,6 +112,21 @@ namespace Musify.Infrastructure.Storage
return Result.Success(); return Result.Success();
} }
public async Task<Result<string>> UploadFileAsync(string filePath, string bucketName, string keyName, CancellationToken cancellationToken)
{
try
{
using var fileStream = File.OpenRead(filePath);
var contentType = MimeUtility.GetMimeMapping(filePath);
return await UploadFileAsync(fileStream, contentType, bucketName, keyName, cancellationToken);
}
catch (Exception exception)
{
logger.LogError(exception, "Failed to upload file to S3 with bucket name {BucketName} and key name {KeyName}", bucketName, keyName);
return Result.Error($"Failed to upload file to S3 with bucket name {bucketName} and key name {keyName}");
}
}
public async Task<Result<string>> UploadFileAsync(Stream sourceStream, string contentType, string bucketName, string keyName, CancellationToken cancellationToken) public async Task<Result<string>> UploadFileAsync(Stream sourceStream, string contentType, string bucketName, string keyName, CancellationToken cancellationToken)
{ {
var request = new PutObjectRequest var request = new PutObjectRequest