diff --git a/AAIntegration.SimmonsBank.API/Processes/IPuppeteerProcess.cs b/AAIntegration.SimmonsBank.API/Processes/IPuppeteerProcess.cs new file mode 100644 index 0000000..9d3ad5e --- /dev/null +++ b/AAIntegration.SimmonsBank.API/Processes/IPuppeteerProcess.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; +using AAIntegration.SimmonsBank.API.Services; + +namespace AAIntegration.SimmonsBank.API.Processes; + +public interface IPuppeteerProcess +{ + Task FundEnvelopes(); +} diff --git a/AAIntegration.SimmonsBank.API/Processes/PuppeteerProcess.cs b/AAIntegration.SimmonsBank.API/Processes/PuppeteerProcess.cs new file mode 100644 index 0000000..f424249 --- /dev/null +++ b/AAIntegration.SimmonsBank.API/Processes/PuppeteerProcess.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using AAIntegration.SimmonsBank.API.Configs; +using AAIntegration.SimmonsBank.API.Entities; +using AAIntegration.SimmonsBank.API.Models.Transactions; +using AAIntegration.SimmonsBank.API.Services; +using Internal; +using Microsoft.Extensions.Options; + +namespace AAIntegration.SimmonsBank.API.Processes; + +public class PuppeteerProcess : IPuppeteerProcess +{ + private readonly EnvelopeFundConfig _config; + private readonly ILogger _logger; + + public PuppeteerProcess( + IOptions config, + ILogger logger) + { + _config = config.Value; + _logger = logger; + } + + public async Task FundEnvelopes() + { + _logger.LogInformation($"Starting envelope funding..."); + + // Grab envelopes + /*List envelopes = envelopeService.GetAll().ToList(); + + bool anyTriggered = false; + + foreach (Envelope env in envelopes) + { + // Check if needs triggering + if (env.Enabled && !envelopeService.HasBeenFundedThisMonth(env.Id)) + { + _logger.LogInformation($"Envelope '{env.Name}' (id={env.Id}) needs funding - Has now been triggered."); + anyTriggered = true; + + // Fund Envelope + envelopeService.FundEnvelopeForThisMonth(env.Id); + } + }*/ + + if (false) + _logger.LogInformation($"No action taken."); + else + _logger.LogInformation($"Envelope funding complete."); + } +} diff --git a/AAIntegration.SimmonsBank.API/Program.cs b/AAIntegration.SimmonsBank.API/Program.cs index 9b4d164..450ebfd 100644 --- a/AAIntegration.SimmonsBank.API/Program.cs +++ b/AAIntegration.SimmonsBank.API/Program.cs @@ -11,6 +11,8 @@ using Microsoft.IdentityModel.Tokens; using System.Text; //using Microsoft.Build.Framework; using Microsoft.AspNetCore.Authorization; +using AAIntegration.SimmonsBank.API.Processes; +using AAIntegration.SimmonsBank.API.Workers; internal class Program { @@ -85,6 +87,10 @@ internal class Program builder.Services.AddScoped(); + builder.Services.AddSingleton(); + + builder.Services.AddHostedService(); + var app = builder.Build(); // Apply Database Migrations - This is NOT recommended for multi-node deployment!!! diff --git a/AAIntegration.SimmonsBank.API/Workers/PuppeteerWorker.cs b/AAIntegration.SimmonsBank.API/Workers/PuppeteerWorker.cs new file mode 100644 index 0000000..c84f5cd --- /dev/null +++ b/AAIntegration.SimmonsBank.API/Workers/PuppeteerWorker.cs @@ -0,0 +1,53 @@ +using System; +using AAIntegration.SimmonsBank.API.Configs; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using AAIntegration.SimmonsBank.API.Processes; +using AAIntegration.SimmonsBank.API.Services; + +namespace AAIntegration.SimmonsBank.API.Workers; + +public class PuppeteerWorker : BackgroundService +{ + private readonly EnvelopeFundConfig _config; + private readonly IPuppeteerProcess _puppeteerProcess; + private readonly ILogger _logger; + private readonly IServiceScopeFactory _serviceScopeFactory; + + public PuppeteerWorker( + IOptions config, + IPuppeteerProcess puppeteerProcess, + ILogger logger, + IServiceScopeFactory serviceScopeFactory) + { + _config = config.Value; + _puppeteerProcess = puppeteerProcess; + _logger = logger; + _serviceScopeFactory = serviceScopeFactory; + } + + protected override async Task ExecuteAsync(CancellationToken stoppingToken) + { + DateTime? lastExecutedOn = null; + + using (var scope = _serviceScopeFactory.CreateScope()) + { + //IEnvelopeService envelopeService = scope.ServiceProvider.GetService(); + + // This is how we keep the app running (in the background) + while (!stoppingToken.IsCancellationRequested) + { + if (lastExecutedOn != null) + { + int minutesRemaining = _config.CheckIntervalInMinutes - (int)DateTime.UtcNow.Subtract(lastExecutedOn.Value).TotalMinutes; + await Task.Delay(TimeSpan.FromMinutes(minutesRemaining < 0 ? 0 : minutesRemaining), stoppingToken); + } + + lastExecutedOn = DateTime.UtcNow; + _logger.LogInformation("EnvelopeFundWorker running at: {time}", DateTimeOffset.Now); + + //await _puppeteerProcess.FundEnvelopes(envelopeService); + } + } + } +}