zcbot/windows-node/Zcbot.WindowsNode/Jobs/JobRecoveryService.cs

39 lines
1.0 KiB
C#

using System.Text.Json;
namespace Zcbot.WindowsNode;
internal enum JobRecoveryAction
{
ResumeExecution,
ResumeOutputUpload,
ReplayTerminal,
None,
}
internal sealed record JobRecoveryDecision(
RecoverableJob Job,
JobRecoveryAction Action);
internal sealed class JobRecoveryService(JobRepository repository)
{
internal IReadOnlyList<JobRecoveryDecision> Scan() =>
repository.ReadRecoverableJobs()
.Select(job => new JobRecoveryDecision(job, Decide(job)))
.ToArray();
internal static JobRecoveryAction Decide(RecoverableJob job)
{
if (job.Terminal is not JsonElement terminal)
{
return JobRecoveryAction.ResumeExecution;
}
if (terminal.GetProperty("status").GetString() != JobStateMachine.Succeeded)
{
return JobRecoveryAction.ReplayTerminal;
}
return job.UploadComplete || job.CloudTerminal
? JobRecoveryAction.None
: JobRecoveryAction.ResumeOutputUpload;
}
}