2024-08-25 16:31:12 -05:00
|
|
|
namespace SanctionsSearch.Worker.Workers;
|
|
|
|
|
|
|
|
|
|
public class DatabaseWorker(
|
|
|
|
|
ILogger<DatabaseWorker> logger,
|
|
|
|
|
TimeProvider timeProvider,
|
|
|
|
|
IServiceScopeFactory serviceScopeFactory
|
|
|
|
|
) : IHostedService, IDisposable
|
|
|
|
|
{
|
|
|
|
|
private readonly TimeProvider _timeProvider = timeProvider;
|
|
|
|
|
private readonly ILogger<DatabaseWorker> _logger = logger;
|
|
|
|
|
private readonly IServiceScopeFactory _serviceScopeFactory = serviceScopeFactory;
|
|
|
|
|
private ITimer? _timer;
|
|
|
|
|
|
|
|
|
|
public async Task StartAsync(CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
_logger.LogInformation("Database worker started");
|
|
|
|
|
|
|
|
|
|
await UpdateDatabase();
|
|
|
|
|
|
2024-08-26 15:26:16 -05:00
|
|
|
using var scope = _serviceScopeFactory.CreateAsyncScope();
|
2024-08-25 17:12:26 -05:00
|
|
|
var dbOptions = scope.ServiceProvider.GetRequiredService<DbOptions>();
|
|
|
|
|
|
2024-08-25 16:31:12 -05:00
|
|
|
_timer = _timeProvider.CreateTimer(
|
|
|
|
|
callback: async _ => await UpdateDatabase(),
|
|
|
|
|
state: null,
|
2024-08-25 17:12:26 -05:00
|
|
|
dueTime: TimeSpan.FromHours(dbOptions.RefreshIntervalInHours),
|
|
|
|
|
period: TimeSpan.FromHours(dbOptions.RefreshIntervalInHours)
|
2024-08-25 16:31:12 -05:00
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public Task StopAsync(CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
_logger.LogInformation("Database worker stopped");
|
|
|
|
|
|
|
|
|
|
_timer?.Change(Timeout.InfiniteTimeSpan, TimeSpan.Zero);
|
|
|
|
|
|
|
|
|
|
return Task.CompletedTask;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Dispose()
|
|
|
|
|
{
|
|
|
|
|
_timer?.Dispose();
|
2024-08-26 15:26:16 -05:00
|
|
|
|
|
|
|
|
GC.SuppressFinalize(this);
|
2024-08-25 16:31:12 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private async Task UpdateDatabase()
|
|
|
|
|
{
|
2024-08-26 15:26:16 -05:00
|
|
|
var updateIdProperty = LogContext.PushProperty("DatabaseUpdateId", Guid.NewGuid());
|
|
|
|
|
|
2024-08-25 16:31:12 -05:00
|
|
|
_logger.LogInformation("Updating database");
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
using var scope = _serviceScopeFactory.CreateAsyncScope();
|
|
|
|
|
var databaseMaintainer = scope.ServiceProvider.GetRequiredService<IDatabaseMaintainer>();
|
|
|
|
|
|
|
|
|
|
await databaseMaintainer.BuildSdnTableAsync();
|
|
|
|
|
await databaseMaintainer.BuildAddressTableAsync();
|
|
|
|
|
await databaseMaintainer.BuiltAliasTableAsync();
|
|
|
|
|
await databaseMaintainer.BuildCommentTableAsync();
|
2024-08-25 17:08:44 -05:00
|
|
|
await databaseMaintainer.CleanupTablesAsync();
|
2024-08-25 16:31:12 -05:00
|
|
|
|
|
|
|
|
_logger.LogInformation("Database updated");
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
_logger.LogError(ex, "Error updating database");
|
|
|
|
|
}
|
2024-08-26 15:26:16 -05:00
|
|
|
finally
|
|
|
|
|
{
|
|
|
|
|
updateIdProperty.Dispose();
|
|
|
|
|
}
|
2024-08-25 16:31:12 -05:00
|
|
|
}
|
|
|
|
|
}
|