- Flatten nested per-repo folders into flat Musify.* projects at root - Rename assemblies/csproj: Domain->Musify.Domain, Application->Musify.Application, Infrastructure->Musify.Infrastructure, WebApi->Musify.Api, Worker->Musify.Worker, StreamingGateway->Musify.StreamingGateway - Rename WebApi.* namespaces to Musify.Api.* - Update all ProjectReference paths and the solution file - Consolidate stray per-repo dotfiles; add root .gitattributes - Move flutter client out to _archive Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
62 lines
2.5 KiB
C#
62 lines
2.5 KiB
C#
using MassTransit;
|
|
using Microsoft.Extensions.Logging;
|
|
using Musify.Application.Contracts;
|
|
using Musify.Infrastructure.MassTransit.Arguments;
|
|
using Musify.Infrastructure.MassTransit.Logs;
|
|
|
|
namespace Musify.Infrastructure.MassTransit.Activities.Files
|
|
{
|
|
internal class CopyFileInBucketActivity(
|
|
IStorageService storageHandler,
|
|
ILogger<CopyFileInBucketActivity> logger)
|
|
: IActivity<CopyFileInBucketArguments, CopyFileInBucketLog>
|
|
{
|
|
public const string ExecuteEndpointName = "copy-file-in-bucket";
|
|
|
|
public async Task<ExecutionResult> Execute(ExecuteContext<CopyFileInBucketArguments> executeContext)
|
|
{
|
|
try
|
|
{
|
|
await storageHandler.CopyFileAsync(
|
|
executeContext.Arguments.SourceBucket,
|
|
executeContext.Arguments.SourceKey,
|
|
executeContext.Arguments.DestinationBucket,
|
|
executeContext.Arguments.DestinationKey,
|
|
executeContext.CancellationToken);
|
|
|
|
return executeContext.Completed(new CopyFileInBucketLog(
|
|
executeContext.Arguments.DestinationBucket,
|
|
executeContext.Arguments.DestinationKey));
|
|
}
|
|
catch (Exception exception)
|
|
{
|
|
logger.LogError(exception, "Failed to copy {SourceBucket}/{SourceKey} to {DestinationBucket}/{DestinationKey}",
|
|
executeContext.Arguments.SourceBucket,
|
|
executeContext.Arguments.SourceKey,
|
|
executeContext.Arguments.DestinationBucket,
|
|
executeContext.Arguments.DestinationKey);
|
|
throw;
|
|
}
|
|
}
|
|
|
|
public async Task<CompensationResult> Compensate(CompensateContext<CopyFileInBucketLog> compensateContext)
|
|
{
|
|
try
|
|
{
|
|
await storageHandler.RemoveFileAsync(
|
|
compensateContext.Log.DestinationBucket,
|
|
compensateContext.Log.DestinationKey,
|
|
compensateContext.CancellationToken);
|
|
return compensateContext.Compensated();
|
|
}
|
|
catch (Exception exception)
|
|
{
|
|
logger.LogError(exception, "Failed to compensate copied file {Bucket}/{Key}",
|
|
compensateContext.Log.DestinationBucket,
|
|
compensateContext.Log.DestinationKey);
|
|
return compensateContext.Failed(exception);
|
|
}
|
|
}
|
|
}
|
|
}
|