using Microsoft.Extensions.Options; using Serilog; using System.Threading.Channels; using TriliumMind.Data.Entities; using TriliumMind.Models; using TriliumMind.Services; namespace TriliumMind.Workers; public class TriliumWorker : BackgroundService { private readonly Serilog.ILogger _log; private readonly AppConfigs _config; private readonly IServiceScopeFactory _scopeFactory; // Singleton services cannot directly inject Scoped services. private readonly TriliumService _triliumService; private readonly Channel _issueChannel; public TriliumWorker(AppConfigs configs, IServiceScopeFactory serviceScopeFactory, TriliumService triliumService, Channel issueChannel) { _log = Log.ForContext(); _config = configs; _scopeFactory = serviceScopeFactory; _triliumService = triliumService; _issueChannel = issueChannel; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { _log.Debug("Worker running at: {time}", DateTimeOffset.Now); using var scope = _scopeFactory.CreateScope(); var db = scope.ServiceProvider.GetRequiredService(); var unpublishedIssues = await db.GetUnpublishedJiraIssuesAsync(stoppingToken); if (unpublishedIssues != null) { // Publish or update Trilium notes } await Task.Delay(10 *1000, stoppingToken); } } }