Added inital job entity and services. Added released works API integration.
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
using JSMR.Application.Jobs;
|
||||
using JSMR.Domain.Entities;
|
||||
using JSMR.Domain.Enums;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace JSMR.Infrastructure.Data.Repositories.Jobs;
|
||||
|
||||
public sealed class JobProgressWriter(AppDbContext dbContext) : IJobProgressWriter
|
||||
{
|
||||
public async Task SetStepAsync(int jobId, string step, CancellationToken canellationToken)
|
||||
{
|
||||
Job? job = await dbContext.Jobs.FirstOrDefaultAsync(x => x.Id == jobId, canellationToken);
|
||||
|
||||
if (job is null)
|
||||
return;
|
||||
|
||||
job.CurrentStep = step;
|
||||
job.HeartbeatUtc = DateTime.UtcNow;
|
||||
|
||||
await dbContext.SaveChangesAsync(canellationToken);
|
||||
}
|
||||
|
||||
public async Task SetProgressAsync(int jobId, int? current, int? total, CancellationToken canellationToken)
|
||||
{
|
||||
Job? job = await dbContext.Jobs.FirstOrDefaultAsync(x => x.Id == jobId, canellationToken);
|
||||
|
||||
if (job is null)
|
||||
return;
|
||||
|
||||
job.ProgressCurrent = current;
|
||||
job.ProgressTotal = total;
|
||||
job.HeartbeatUtc = DateTime.UtcNow;
|
||||
|
||||
await dbContext.SaveChangesAsync(canellationToken);
|
||||
}
|
||||
|
||||
public async Task SetHeartbeatAsync(int jobId, CancellationToken canellationToken)
|
||||
{
|
||||
Job? job = await dbContext.Jobs.FirstOrDefaultAsync(x => x.Id == jobId, canellationToken);
|
||||
|
||||
if (job is null)
|
||||
return;
|
||||
|
||||
job.HeartbeatUtc = DateTime.UtcNow;
|
||||
|
||||
await dbContext.SaveChangesAsync(canellationToken);
|
||||
}
|
||||
|
||||
public async Task CompleteAsync(int jobId, string? summary, CancellationToken canellationToken)
|
||||
{
|
||||
Job? job = await dbContext.Jobs.FirstOrDefaultAsync(x => x.Id == jobId, canellationToken);
|
||||
|
||||
if (job is null)
|
||||
return;
|
||||
|
||||
job.Status = JobStatus.Succeeded;
|
||||
job.CompletedUtc = DateTime.UtcNow;
|
||||
job.HeartbeatUtc = DateTime.UtcNow;
|
||||
job.ResultSummary = summary;
|
||||
job.CurrentStep = "Completed";
|
||||
|
||||
await dbContext.SaveChangesAsync(canellationToken);
|
||||
}
|
||||
|
||||
public async Task FailAsync(int jobId, string error, CancellationToken canellationToken)
|
||||
{
|
||||
Job? job = await dbContext.Jobs.FirstOrDefaultAsync(x => x.Id == jobId, canellationToken);
|
||||
|
||||
if (job is null)
|
||||
return;
|
||||
|
||||
job.Status = JobStatus.Failed;
|
||||
job.CompletedUtc = DateTime.UtcNow;
|
||||
job.HeartbeatUtc = DateTime.UtcNow;
|
||||
job.Error = error;
|
||||
job.CurrentStep = "Failed";
|
||||
|
||||
await dbContext.SaveChangesAsync(canellationToken);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user