diff --git a/EnvelopeGenerator.ServiceHost/EnvelopeGenerator.ServiceHost.csproj b/EnvelopeGenerator.ServiceHost/EnvelopeGenerator.ServiceHost.csproj
index f861646b..c330ae92 100644
--- a/EnvelopeGenerator.ServiceHost/EnvelopeGenerator.ServiceHost.csproj
+++ b/EnvelopeGenerator.ServiceHost/EnvelopeGenerator.ServiceHost.csproj
@@ -27,7 +27,6 @@
-
diff --git a/EnvelopeGenerator.ServiceHost/Extensions/ServiceCollectionExtensions.cs b/EnvelopeGenerator.ServiceHost/Extensions/ServiceCollectionExtensions.cs
new file mode 100644
index 00000000..036e3e27
--- /dev/null
+++ b/EnvelopeGenerator.ServiceHost/Extensions/ServiceCollectionExtensions.cs
@@ -0,0 +1,16 @@
+using EnvelopeGenerator.ServiceHost.Jobs;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+
+namespace EnvelopeGenerator.ServiceHost.Extensions;
+
+public static class ServiceCollectionExtensions
+{
+ public static IServiceCollection AddFinalizeDocumentJob(this IServiceCollection services, IConfiguration configuration)
+ {
+ services.Configure(configuration.GetSection("FinalizeDocumentJob"));
+ services.AddSingleton();
+ services.AddSingleton();
+ return services;
+ }
+}
diff --git a/EnvelopeGenerator.ServiceHost/Jobs/FinalizeDocumentJobOptions.cs b/EnvelopeGenerator.ServiceHost/Jobs/FinalizeDocumentJobOptions.cs
new file mode 100644
index 00000000..9b71e19c
--- /dev/null
+++ b/EnvelopeGenerator.ServiceHost/Jobs/FinalizeDocumentJobOptions.cs
@@ -0,0 +1,11 @@
+using EnvelopeGenerator.ServiceHost.Jobs.FinalizeDocument;
+
+namespace EnvelopeGenerator.ServiceHost.Jobs;
+
+public class FinalizeDocumentJobOptions
+{
+ public string ConnectionString { get; set; } = string.Empty;
+ public string GdPictureLicenseKey { get; set; } = string.Empty;
+ public bool Debug { get; set; }
+ public PDFBurnerParams PdfBurnerParams { get; set; } = new();
+}
diff --git a/EnvelopeGenerator.ServiceHost/Jobs/FinalizeDocumentJobRunner.cs b/EnvelopeGenerator.ServiceHost/Jobs/FinalizeDocumentJobRunner.cs
new file mode 100644
index 00000000..42fa2fb5
--- /dev/null
+++ b/EnvelopeGenerator.ServiceHost/Jobs/FinalizeDocumentJobRunner.cs
@@ -0,0 +1,57 @@
+using DigitalData.Modules.Logging;
+using EnvelopeGenerator.ServiceHost.Jobs.FinalizeDocument;
+using Microsoft.Extensions.Options;
+using Quartz;
+
+namespace EnvelopeGenerator.ServiceHost.Jobs;
+
+public interface IFinalizeDocumentJobRunner
+{
+ Task RunAsync(CancellationToken cancellationToken);
+}
+
+public class FinalizeDocumentJobRunner : IFinalizeDocumentJobRunner
+{
+ private readonly FinalizeDocumentJob _job;
+ private readonly IOptions _options;
+ private readonly IConfiguration _configuration;
+ private readonly ILogger _logger;
+
+ public FinalizeDocumentJobRunner(
+ FinalizeDocumentJob job,
+ IOptions options,
+ IConfiguration configuration,
+ ILogger logger)
+ {
+ _job = job;
+ _options = options;
+ _configuration = configuration;
+ _logger = logger;
+ }
+
+ public Task RunAsync(CancellationToken cancellationToken)
+ {
+ var options = _options.Value;
+ var connectionString = options.ConnectionString;
+ if (string.IsNullOrWhiteSpace(connectionString))
+ {
+ connectionString = _configuration.GetConnectionString("Default") ?? string.Empty;
+ }
+
+ if (string.IsNullOrWhiteSpace(connectionString))
+ {
+ _logger.LogWarning("FinalizeDocumentJob skipped: missing connection string.");
+ return Task.CompletedTask;
+ }
+
+ var dataMap = new JobDataMap
+ {
+ { JobDataKeys.GdPicture, options.GdPictureLicenseKey },
+ { JobDataKeys.Database, connectionString },
+ { JobDataKeys.LogConfig, new LogConfig { Debug = options.Debug } },
+ { JobDataKeys.PdfBurnerParams, options.PdfBurnerParams }
+ };
+
+ return _job.Execute(dataMap, cancellationToken);
+ }
+}
diff --git a/EnvelopeGenerator.ServiceHost/Jobs/JobDataKeys.cs b/EnvelopeGenerator.ServiceHost/Jobs/JobDataKeys.cs
new file mode 100644
index 00000000..44139cc2
--- /dev/null
+++ b/EnvelopeGenerator.ServiceHost/Jobs/JobDataKeys.cs
@@ -0,0 +1,9 @@
+namespace EnvelopeGenerator.ServiceHost.Jobs;
+
+public static class JobDataKeys
+{
+ public const string GdPicture = "GDPICTURE";
+ public const string LogConfig = "LOGCONFIG";
+ public const string Database = "DATABASE";
+ public const string PdfBurnerParams = "PDF_BURNER_PARAMS";
+}
diff --git a/EnvelopeGenerator.ServiceHost/Program.cs b/EnvelopeGenerator.ServiceHost/Program.cs
index 1b603678..8941a80f 100644
--- a/EnvelopeGenerator.ServiceHost/Program.cs
+++ b/EnvelopeGenerator.ServiceHost/Program.cs
@@ -1,10 +1,12 @@
using EnvelopeGenerator.ServiceHost;
+using EnvelopeGenerator.ServiceHost.Extensions;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
+builder.Services.AddFinalizeDocumentJob(builder.Configuration);
builder.Services.AddHostedService();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
diff --git a/EnvelopeGenerator.ServiceHost/Worker.cs b/EnvelopeGenerator.ServiceHost/Worker.cs
index f15c02ba..00e8fae8 100644
--- a/EnvelopeGenerator.ServiceHost/Worker.cs
+++ b/EnvelopeGenerator.ServiceHost/Worker.cs
@@ -4,11 +4,13 @@ public class Worker : BackgroundService
{
private readonly ILogger _logger;
private readonly int _delayMilliseconds;
+ private readonly IFinalizeDocumentJobRunner _jobRunner;
- public Worker(ILogger logger, IConfiguration configuration)
+ public Worker(ILogger logger, IConfiguration configuration, IFinalizeDocumentJobRunner jobRunner)
{
_logger = logger;
_delayMilliseconds = Math.Max(1, configuration.GetValue("Worker:DelayMilliseconds", 1000));
+ _jobRunner = jobRunner;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
@@ -19,6 +21,8 @@ public class Worker : BackgroundService
{
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
}
+
+ await _jobRunner.RunAsync(stoppingToken);
await Task.Delay(_delayMilliseconds, stoppingToken);
}
}