Refactor
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user