DRAB/Drab.Logic/Utils/DbFetcher.cs
2025-07-11 10:50:46 +02:00

54 lines
1.7 KiB
C#

using Microsoft.Extensions.Hosting;
namespace Drab.Logic.Utils;
public class DbFetcher : BackgroundService
{
private readonly IDrabSettings _drabSettings;
private readonly IServiceScopeFactory _serviceScopeFactory;
private readonly IOrderProcessor _orderProcessor;
private readonly ILogger<DbFetcher> _logger;
public DbFetcher(IDrabSettings drabSettings, IServiceScopeFactory serviceScopeFactory, IOrderProcessor orderProcessor, ILogger<DbFetcher> logger)
{
_drabSettings = drabSettings;
_serviceScopeFactory = serviceScopeFactory;
_orderProcessor = orderProcessor;
_logger = logger;
}
protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
Start();
return Task.CompletedTask;
}
private async Task Start()
{
await Task.Delay(TimeSpan.FromSeconds(2));
while (true)
{
_logger.LogInformation("Fetch database for new orders");
try
{
using var scope = _serviceScopeFactory.CreateScope();
using var orderStore = scope.ServiceProvider.GetService<IOrdersStore>();
var result = await orderStore.FetchOrders();
if (result.IsNotOk)
_logger.LogWarning($"Fetch orders result failed: {result.Error}");
result.Value.ToList()
.ForEach(x => _orderProcessor.ProcessOrder(x));
}
catch (Exception e)
{
_logger.LogError(e, "Error on fetching new orders data:");
}
finally
{
await Task.Delay(TimeSpan.FromSeconds(_drabSettings.DbPollingFrequencyInSeconds));
}
}
}
}