This commit is contained in:
2026-03-20 12:10:54 +01:00
parent dac5096998
commit 17944b5344
2 changed files with 98 additions and 38 deletions
@@ -15,47 +15,109 @@ namespace Musify.Infrastructure.Messaging.Consumers
public async Task Consume(ConsumeContext<RemoveFileEvent> consumeContext)
{
var payload = JsonSerializer.Serialize(consumeContext.Message);
var message = consumeContext.Message;
var cancellationToken = consumeContext.CancellationToken;
var job = await database.Jobs
.SingleOrDefaultAsync(j => j.Id == consumeContext.Message.JobId);
var job = await GetOrCreateJobAsync(message, cancellationToken);
var jobOperation = await CreateJobOperationAsync(job.Id, cancellationToken);
await database.SaveChangesAsync(cancellationToken);
if (job is null)
try
{
job = new Job
jobOperation.JobState = JobState.InProgress;
await database.SaveChangesAsync(cancellationToken);
var removeResult = await storageHandler.RemoveFileAsync(
message.BucketName,
message.KeyName,
cancellationToken);
if (!removeResult.IsSuccess)
{
JobType = JobType.RemoveFile,
Payload = payload
};
await database.Jobs.AddAsync(job, consumeContext.CancellationToken);
logger.LogInformation("Created new job with id {JobId} for removing file {BucketName}/{KeyName}", job.Id, consumeContext.Message.BucketName, consumeContext.Message.KeyName);
MarkAsFailed(jobOperation, string.Join("; ", removeResult.Errors));
logger.LogError(
"Failed to remove file {BucketName}/{KeyName} for JobId={JobId}, JobOperationId={JobOperationId}. Error: {ErrorMessage}",
message.BucketName,
message.KeyName,
job.Id,
jobOperation.Id,
jobOperation.ErrorMessage);
await database.SaveChangesAsync(cancellationToken);
return;
}
jobOperation.JobState = JobState.Completed;
jobOperation.FinishedAt = DateTime.UtcNow;
logger.LogInformation(
"Successfully removed file {BucketName}/{KeyName} for JobId={JobId}, JobOperationId={JobOperationId}.",
message.BucketName,
message.KeyName,
job.Id,
jobOperation.Id);
await database.SaveChangesAsync(cancellationToken);
}
catch (Exception exception)
{
logger.LogError(exception,
"An error occurred while consuming RemoveFileConsumer message for JobId={JobId}, BucketName={BucketName}, KeyName={KeyName}",
message.JobId,
message.BucketName,
message.KeyName);
MarkAsFailed(jobOperation, exception.Message);
await database.SaveChangesAsync(cancellationToken);
throw;
}
}
async Task<Job> GetOrCreateJobAsync(RemoveFileEvent message, CancellationToken cancellationToken)
{
var job = await database.Jobs
.SingleOrDefaultAsync(j => j.Id == message.JobId, cancellationToken);
if (job is not null)
{
return job;
}
var jobExecution = new JobOperation
job = new Job
{
JobId = job.Id
Id = message.JobId,
JobType = JobType.RemoveFile,
Payload = JsonSerializer.Serialize(message)
};
await database.JobOperations.AddAsync(jobExecution, consumeContext.CancellationToken);
var removeFile = await storageHandler.RemoveFileAsync(
consumeContext.Message.BucketName,
consumeContext.Message.KeyName,
consumeContext.CancellationToken);
await database.Jobs.AddAsync(job, cancellationToken);
if (!removeFile.IsSuccess)
logger.LogInformation(
"Created new job with id {JobId} for removing file {BucketName}/{KeyName}",
job.Id,
message.BucketName,
message.KeyName);
return job;
}
async Task<JobOperation> CreateJobOperationAsync(Guid jobId, CancellationToken cancellationToken)
{
var jobOperation = new JobOperation
{
jobExecution.JobState = JobState.Failed;
logger.LogInformation("Failed to remove file {BucketName}/{KeyName} for jobId={JobId}, JobExecutionId={jobExecutionId}. Error: {ErrorMessage}",
consumeContext.Message.BucketName, consumeContext.Message.KeyName, job.Id, jobExecution.Id, string.Join("; ", removeFile.Errors));
}
else
{
logger.LogInformation("Successfully removed file {BucketName}/{KeyName} for jobId={JobId}, JobExecutionId={jobExecutionId}.",
consumeContext.Message.BucketName, consumeContext.Message.KeyName, job.Id, jobExecution.Id);
}
JobId = jobId
};
jobExecution.FinishedAt = DateTime.UtcNow;
await database.SaveChangesAsync(consumeContext.CancellationToken);
await database.JobOperations.AddAsync(jobOperation, cancellationToken);
return jobOperation;
}
void MarkAsFailed(JobOperation jobOperation, string errorMessage)
{
jobOperation.JobState = JobState.Failed;
jobOperation.ErrorMessage = errorMessage;
jobOperation.FinishedAt = DateTime.UtcNow;
}
}
}