📄 src/Api/UploadJob.cs
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Quartz;
using Slopper.Domain;

namespace Slopper.Api;

public sealed class UploadJob(ILogger<UploadJob> logger, Uploader uploader) : IJob
{
    public static JobKey Key { get; } = new(nameof(UploadJob));

    public async Task Execute(IJobExecutionContext context)
    {
        var platform =
            context.MergedJobDataMap.GetString("platform")
            ?? throw new Exception("No platform defined for upload job.");
        logger.LogDebug("Running upload job for platform {Platform}", platform);
        await uploader.Upload(platform, context.CancellationToken);
    }
}

public static class UploadJobExtensions
{
    extension(IServiceCollectionQuartzConfigurator quartz)
    {
        public IServiceCollectionQuartzConfigurator AddUploadJob() =>
            quartz.AddJob<UploadJob>(UploadJob.Key, options => options.StoreDurably());
    }
}