diff --git a/EnvelopeGenerator.WorkerService/Configuration/WorkerSettings.cs b/EnvelopeGenerator.WorkerService/Configuration/WorkerSettings.cs deleted file mode 100644 index dc4d2c91..00000000 --- a/EnvelopeGenerator.WorkerService/Configuration/WorkerSettings.cs +++ /dev/null @@ -1,14 +0,0 @@ -using EnvelopeGenerator.Jobs.FinalizeDocument; - -namespace EnvelopeGenerator.WorkerService.Configuration; - -public sealed class WorkerSettings -{ - public string ConnectionString { get; set; } = string.Empty; - - public bool Debug { get; set; } - - public int IntervalMinutes { get; set; } = 1; - - public PDFBurnerParams PdfBurner { get; set; } = new(); -} diff --git a/EnvelopeGenerator.WorkerService/EnvelopeGenerator.WorkerService.csproj b/EnvelopeGenerator.WorkerService/EnvelopeGenerator.WorkerService.csproj deleted file mode 100644 index aec7186d..00000000 --- a/EnvelopeGenerator.WorkerService/EnvelopeGenerator.WorkerService.csproj +++ /dev/null @@ -1,22 +0,0 @@ - - - - net8.0 - enable - enable - dotnet-EnvelopeGenerator.WorkerService-0636abb8-6085-477d-9f56-1a9787e84dde - - - - - - - - - - - - - - - diff --git a/EnvelopeGenerator.WorkerService/Program.cs b/EnvelopeGenerator.WorkerService/Program.cs deleted file mode 100644 index 03e8e055..00000000 --- a/EnvelopeGenerator.WorkerService/Program.cs +++ /dev/null @@ -1,67 +0,0 @@ -using EnvelopeGenerator.Domain.Constants; -using EnvelopeGenerator.Jobs.APIBackendJobs; -using EnvelopeGenerator.Jobs.FinalizeDocument; -using EnvelopeGenerator.WorkerService; -using EnvelopeGenerator.WorkerService.Configuration; -using EnvelopeGenerator.WorkerService.Services; -using Quartz; - -var builder = Host.CreateApplicationBuilder(args); - -builder.Services.Configure(builder.Configuration.GetSection("WorkerSettings")); - -builder.Services.AddSingleton(); -builder.Services.AddSingleton(provider => -{ - var settings = provider.GetRequiredService>().Value; - var logger = provider.GetRequiredService>(); - return new PDFBurner(logger, settings.PdfBurner); -}); -builder.Services.AddSingleton(); -builder.Services.AddSingleton(); - -builder.Services.AddQuartz(q => -{ - q.UseMicrosoftDependencyInjectionJobFactory(); - q.UseDefaultThreadPool(tp => tp.MaxConcurrency = 5); - - var settings = new WorkerSettings(); - builder.Configuration.GetSection("WorkerSettings").Bind(settings); - var intervalMinutes = Math.Max(1, settings.IntervalMinutes); - - var finalizeJobKey = new JobKey("FinalizeDocumentJob"); - q.AddJob(opts => opts - .WithIdentity(finalizeJobKey) - .UsingJobData(Value.DATABASE, settings.ConnectionString)); - - q.AddTrigger(opts => opts - .ForJob(finalizeJobKey) - .WithIdentity("FinalizeDocumentJob-trigger") - .StartNow() - .WithSimpleSchedule(x => x - .WithIntervalInMinutes(intervalMinutes) - .RepeatForever())); - - var apiJobKey = new JobKey("APIEnvelopeJob"); - q.AddJob(opts => opts - .WithIdentity(apiJobKey) - .UsingJobData(Value.DATABASE, settings.ConnectionString)); - - q.AddTrigger(opts => opts - .ForJob(apiJobKey) - .WithIdentity("APIEnvelopeJob-trigger") - .StartNow() - .WithSimpleSchedule(x => x - .WithIntervalInMinutes(intervalMinutes) - .RepeatForever())); -}); - -builder.Services.AddQuartzHostedService(options => -{ - options.WaitForJobsToComplete = true; -}); - -builder.Services.AddHostedService(); - -var host = builder.Build(); -host.Run(); diff --git a/EnvelopeGenerator.WorkerService/Properties/launchSettings.json b/EnvelopeGenerator.WorkerService/Properties/launchSettings.json deleted file mode 100644 index ddb5ece8..00000000 --- a/EnvelopeGenerator.WorkerService/Properties/launchSettings.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "$schema": "http://json.schemastore.org/launchsettings.json", - "profiles": { - "EnvelopeGenerator.WorkerService": { - "commandName": "Project", - "dotnetRunMessages": true, - "environmentVariables": { - "DOTNET_ENVIRONMENT": "Development" - } - } - } -} diff --git a/EnvelopeGenerator.WorkerService/Services/TempFileManager.cs b/EnvelopeGenerator.WorkerService/Services/TempFileManager.cs deleted file mode 100644 index f98e1c09..00000000 --- a/EnvelopeGenerator.WorkerService/Services/TempFileManager.cs +++ /dev/null @@ -1,74 +0,0 @@ -using System.IO; -using Microsoft.Extensions.Logging; - -namespace EnvelopeGenerator.WorkerService.Services; - -public sealed class TempFileManager -{ - private readonly ILogger _logger; - - public TempFileManager(ILogger logger) - { - _logger = logger; - TempPath = Path.Combine(Path.GetTempPath(), "EnvelopeGenerator"); - } - - public string TempPath { get; } - - public Task CreateAsync(CancellationToken cancellationToken = default) - { - try - { - if (!Directory.Exists(TempPath)) - { - Directory.CreateDirectory(TempPath); - _logger.LogDebug("Created temp folder {TempPath}", TempPath); - } - else - { - CleanUpFiles(); - } - } - catch (Exception ex) - { - _logger.LogError(ex, "Failed to create temp folder {TempPath}", TempPath); - throw; - } - - return Task.CompletedTask; - } - - public Task CleanupAsync(CancellationToken cancellationToken = default) - { - try - { - if (Directory.Exists(TempPath)) - { - _logger.LogDebug("Deleting temp folder {TempPath}", TempPath); - Directory.Delete(TempPath, recursive: true); - } - } - catch (Exception ex) - { - _logger.LogError(ex, "Failed to clean up temp folder {TempPath}", TempPath); - } - - return Task.CompletedTask; - } - - private void CleanUpFiles() - { - foreach (var file in Directory.GetFiles(TempPath)) - { - try - { - _logger.LogDebug("Deleting temp file {File}", file); - File.Delete(file); - } - catch (Exception ex) - { - _logger.LogWarning(ex, "Failed to delete temp file {File}", file); - } - } - } -} diff --git a/EnvelopeGenerator.WorkerService/Worker.cs b/EnvelopeGenerator.WorkerService/Worker.cs deleted file mode 100644 index d88c3e63..00000000 --- a/EnvelopeGenerator.WorkerService/Worker.cs +++ /dev/null @@ -1,71 +0,0 @@ -using EnvelopeGenerator.WorkerService.Configuration; -using EnvelopeGenerator.WorkerService.Services; -using Microsoft.Data.SqlClient; -using Microsoft.Extensions.Options; - -namespace EnvelopeGenerator.WorkerService; - -public class Worker : BackgroundService -{ - private readonly ILogger _logger; - private readonly WorkerSettings _settings; - private readonly TempFileManager _tempFiles; - - public Worker( - ILogger logger, - IOptions settings, - TempFileManager tempFiles) - { - _logger = logger; - _settings = settings.Value; - _tempFiles = tempFiles; - } - - public override async Task StartAsync(CancellationToken cancellationToken) - { - _logger.LogInformation("Starting EnvelopeGenerator worker..."); - _logger.LogInformation("Debug mode: {Debug}", _settings.Debug); - - ValidateConfiguration(); - await EnsureDatabaseConnectionAsync(cancellationToken); - await _tempFiles.CreateAsync(cancellationToken); - - await base.StartAsync(cancellationToken); - } - - protected override async Task ExecuteAsync(CancellationToken stoppingToken) - { - _logger.LogInformation("EnvelopeGenerator worker is running. Jobs are scheduled every {Interval} minute(s).", Math.Max(1, _settings.IntervalMinutes)); - await Task.Delay(Timeout.Infinite, stoppingToken); - } - - public override async Task StopAsync(CancellationToken cancellationToken) - { - _logger.LogInformation("Stopping EnvelopeGenerator worker..."); - await _tempFiles.CleanupAsync(cancellationToken); - await base.StopAsync(cancellationToken); - } - - private void ValidateConfiguration() - { - if (string.IsNullOrWhiteSpace(_settings.ConnectionString)) - { - throw new InvalidOperationException("Connection string cannot be empty. Configure 'WorkerSettings:ConnectionString'."); - } - } - - private async Task EnsureDatabaseConnectionAsync(CancellationToken cancellationToken) - { - try - { - await using var connection = new SqlConnection(_settings.ConnectionString); - await connection.OpenAsync(cancellationToken); - _logger.LogInformation("Database connection established successfully."); - } - catch (Exception ex) - { - _logger.LogError(ex, "Database connection could not be established."); - throw; - } - } -} diff --git a/EnvelopeGenerator.WorkerService/appsettings.Development.json b/EnvelopeGenerator.WorkerService/appsettings.Development.json deleted file mode 100644 index cfa751f3..00000000 --- a/EnvelopeGenerator.WorkerService/appsettings.Development.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Debug", - "Microsoft.Hosting.Lifetime": "Information" - } - }, - "WorkerSettings": { - "ConnectionString": "Server=SDD-VMP04-SQL17\\DD_DEVELOP01;Database=DD_ECM;User Id=sa;Password=dd;Encrypt=false;TrustServerCertificate=True;", - "Debug": true, - "IntervalMinutes": 1, - "PdfBurner": { - "IgnoredLabels": [ - "Date", - "Datum", - "ZIP", - "PLZ", - "Place", - "Ort", - "Position", - "Stellung" - ], - "TopMargin": 0.1, - "YOffset": -0.3, - "FontName": "Arial", - "FontSize": 8, - "FontStyle": "Italic" - } - } -} diff --git a/EnvelopeGenerator.WorkerService/appsettings.json b/EnvelopeGenerator.WorkerService/appsettings.json deleted file mode 100644 index abd01790..00000000 --- a/EnvelopeGenerator.WorkerService/appsettings.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.Hosting.Lifetime": "Information" - } - }, - "WorkerSettings": { - "ConnectionString": "Server=SDD-VMP04-SQL17\\DD_DEVELOP01;Database=DD_ECM;User Id=sa;Password=dd;Encrypt=false;TrustServerCertificate=True;", - "Debug": false, - "IntervalMinutes": 1, - "PdfBurner": { - "IgnoredLabels": ["Date", "Datum", "ZIP", "PLZ", "Place", "Ort", "Position", "Stellung"], - "TopMargin": 0.1, - "YOffset": -0.3, - "FontName": "Arial", - "FontSize": 8, - "FontStyle": "Italic" - } - } -} diff --git a/EnvelopeGenerator.sln b/EnvelopeGenerator.sln index 1b4e2a82..fe942d58 100644 --- a/EnvelopeGenerator.sln +++ b/EnvelopeGenerator.sln @@ -35,8 +35,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EnvelopeGenerator.Tests", " EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EnvelopeGenerator.Jobs", "EnvelopeGenerator.Jobs\EnvelopeGenerator.Jobs.csproj", "{3D0514EA-2681-4B13-AD71-35CC6363DBD7}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EnvelopeGenerator.WorkerService", "EnvelopeGenerator.WorkerService\EnvelopeGenerator.WorkerService.csproj", "{E3676510-7030-4E85-86E1-51E483E2A3B6}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EnvelopeGenerator.API", "EnvelopeGenerator.API\EnvelopeGenerator.API.csproj", "{EC768913-6270-14F4-1DD3-69C87A659462}" EndProject Global @@ -89,10 +87,6 @@ Global {3D0514EA-2681-4B13-AD71-35CC6363DBD7}.Debug|Any CPU.Build.0 = Debug|Any CPU {3D0514EA-2681-4B13-AD71-35CC6363DBD7}.Release|Any CPU.ActiveCfg = Release|Any CPU {3D0514EA-2681-4B13-AD71-35CC6363DBD7}.Release|Any CPU.Build.0 = Release|Any CPU - {E3676510-7030-4E85-86E1-51E483E2A3B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E3676510-7030-4E85-86E1-51E483E2A3B6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E3676510-7030-4E85-86E1-51E483E2A3B6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E3676510-7030-4E85-86E1-51E483E2A3B6}.Release|Any CPU.Build.0 = Release|Any CPU {EC768913-6270-14F4-1DD3-69C87A659462}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EC768913-6270-14F4-1DD3-69C87A659462}.Debug|Any CPU.Build.0 = Debug|Any CPU {EC768913-6270-14F4-1DD3-69C87A659462}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -116,7 +110,6 @@ Global {211619F5-AE25-4BA5-A552-BACAFE0632D3} = {9943209E-1744-4944-B1BA-4F87FC1A0EEB} {224C4845-1CDE-22B7-F3A9-1FF9297F70E8} = {0CBC2432-A561-4440-89BC-671B66A24146} {3D0514EA-2681-4B13-AD71-35CC6363DBD7} = {9943209E-1744-4944-B1BA-4F87FC1A0EEB} - {E3676510-7030-4E85-86E1-51E483E2A3B6} = {9943209E-1744-4944-B1BA-4F87FC1A0EEB} {EC768913-6270-14F4-1DD3-69C87A659462} = {E3C758DC-914D-4B7E-8457-0813F1FDB0CB} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution