From 3ed521350e9f675ccdd3248533d46028fea75ea1 Mon Sep 17 00:00:00 2001 From: Guillermo Marcel Date: Wed, 26 Mar 2025 15:38:04 -0300 Subject: [PATCH] feat: extract chainer builder and add clean job --- src/CasaBot/AutoScan/AutoScanApp.cs | 40 +++++++++++------ .../Listener/ChainerListenerBuilder.cs | 43 +++++++++++++++++++ .../AutoScan/Listener/CharinerFactory.cs | 8 ++++ .../AutoScan/Options/AutoScanOptions.cs | 2 + 4 files changed, 81 insertions(+), 12 deletions(-) create mode 100644 src/CasaBot/AutoScan/Listener/ChainerListenerBuilder.cs diff --git a/src/CasaBot/AutoScan/AutoScanApp.cs b/src/CasaBot/AutoScan/AutoScanApp.cs index 81fd6cd..85d9dea 100644 --- a/src/CasaBot/AutoScan/AutoScanApp.cs +++ b/src/CasaBot/AutoScan/AutoScanApp.cs @@ -10,6 +10,10 @@ namespace AutoScan; public class AutoScanApp { + private const string GROUP_NAME = "ScanGroup"; + private const string JOBKEY_DOWNLOADER = "downloader"; + private const string JOBKEY_SCANNER = "scanner"; + private const string JOBKEY_CLEANER = "cleaner"; private readonly AutoScanOptions _options; private readonly ILogger _logger; private readonly IScheduler _scheduler; @@ -35,37 +39,43 @@ public class AutoScanApp _logger.LogInformation("DryRun: {RunDry} | Scan DryRun: {scanRunDry}", _options.RunDry, _options.Scanner?.RunDry); _logger.LogInformation("AutoScanApp is running..."); - var at = DateTime.Now.AddSeconds(10); + // var at = DateTime.Now.AddSeconds(10); // var cron = $"{at.Second} {at.Minute} {at.Hour} * * ?"; var cron = CronFromAt(_options.At); - _logger.LogInformation("Waiting for next scan at {At} [{cron}].", at, cron); + _logger.LogInformation("Waiting for next scan at {At} [{cron}].", _options.At, cron); await _scheduler.Start(cancellationToken); _logger.LogDebug("Scheduler started successfully!"); - - const string groupName = "ScanGroup"; - + IJobDetail downloaderJob = JobBuilder.Create() - .WithIdentity("downloader", groupName) + .WithIdentity(JOBKEY_DOWNLOADER, GROUP_NAME) .Build(); //Job with no trigger but tied to the chainer to be executed after the downloader job IJobDetail scannerJob = JobBuilder.Create() - .WithIdentity("scanner", groupName) + .WithIdentity(JOBKEY_SCANNER, GROUP_NAME) + .StoreDurably() + .Build(); + + IJobDetail cleanJob = JobBuilder.Create() + .WithIdentity(JOBKEY_CLEANER, GROUP_NAME) .StoreDurably() .Build(); ITrigger trigger = TriggerBuilder.Create() - .WithIdentity("trigger1", groupName) + .WithIdentity("trigger1", GROUP_NAME) .WithCronSchedule(cron) .StartNow() .Build(); - var chainer = _chainerListenerFactory.CreateChainerListener("Scan Chainer"); - chainer.AddJobChainLink(downloaderJob.Key, scannerJob.Key); - chainer.OnJobChainFinished = async () => await OnScanCompleted?.Invoke(_options); + var chainer = _chainerListenerFactory.Start("Scan Chainer") + .AddJob(downloaderJob) + .AddJob(scannerJob) + .AddJob(cleanJob) + .OnFinish(async () => await OnScanCompleted?.Invoke(_options)) + .Build(); - _scheduler.ListenerManager.AddJobListener(chainer, GroupMatcher.GroupEquals(groupName)); + _scheduler.ListenerManager.AddJobListener(chainer, GroupMatcher.GroupEquals(GROUP_NAME)); await _scheduler.ScheduleJob(downloaderJob, trigger, cancellationToken); await _scheduler.AddJob(scannerJob, false, true, cancellationToken); @@ -73,6 +83,12 @@ public class AutoScanApp _logger.LogDebug("Scheduled job successfully!"); } + public async Task StartNewScan() + { + var jobKey = new JobKey(JOBKEY_DOWNLOADER, "ScanGroup"); + await _scheduler.TriggerJob(jobKey); + } + private string CronFromAt(string at) { diff --git a/src/CasaBot/AutoScan/Listener/ChainerListenerBuilder.cs b/src/CasaBot/AutoScan/Listener/ChainerListenerBuilder.cs new file mode 100644 index 0000000..d367054 --- /dev/null +++ b/src/CasaBot/AutoScan/Listener/ChainerListenerBuilder.cs @@ -0,0 +1,43 @@ +using Quartz; + +namespace AutoScan.Listener; + +public class ChainerListenerBuilder +{ + private readonly ChainerListener _chainerListener; + + private readonly List _chain = []; + + private Func _finishCallback = () => Task.CompletedTask; + + public ChainerListenerBuilder(ChainerListener chainerListener) + { + _chainerListener = chainerListener; + } + + public ChainerListenerBuilder AddJob(IJobDetail job) + { + _chain.Add(job); + return this; + } + + public ChainerListenerBuilder OnFinish(Func callback) + { + _finishCallback = callback; + return this; + } + + public ChainerListener Build() + { + if(_chain.Count < 2) + { + throw new Exception("ChainerListenerBuilder requires at least 2 jobs to chain."); + } + for (var i = 0; i < _chain.Count -1; i++) + { + _chainerListener.AddJobChainLink(_chain[i].Key, _chain[i + 1].Key); + } + _chainerListener.OnJobChainFinished = _finishCallback; + return _chainerListener; + } +} \ No newline at end of file diff --git a/src/CasaBot/AutoScan/Listener/CharinerFactory.cs b/src/CasaBot/AutoScan/Listener/CharinerFactory.cs index b1e0076..fa9ddb5 100644 --- a/src/CasaBot/AutoScan/Listener/CharinerFactory.cs +++ b/src/CasaBot/AutoScan/Listener/CharinerFactory.cs @@ -6,6 +6,7 @@ namespace AutoScan.Listener; public interface IChainerListenerFactory { ChainerListener CreateChainerListener(string name); + ChainerListenerBuilder Start(string name); } public class ChainerListenerFactory : IChainerListenerFactory @@ -22,4 +23,11 @@ public class ChainerListenerFactory : IChainerListenerFactory var logger = _loggerFactory.CreateLogger(); return new ChainerListener(name, logger); } + + public ChainerListenerBuilder Start(string name) + { + var logger = _loggerFactory.CreateLogger(); + return new ChainerListenerBuilder(new ChainerListener(name, logger)); + } } + diff --git a/src/CasaBot/AutoScan/Options/AutoScanOptions.cs b/src/CasaBot/AutoScan/Options/AutoScanOptions.cs index fe5bbcf..740e9f9 100644 --- a/src/CasaBot/AutoScan/Options/AutoScanOptions.cs +++ b/src/CasaBot/AutoScan/Options/AutoScanOptions.cs @@ -11,4 +11,6 @@ public record AutoScanOptions public int MaxAmount { get; set; } public string? MediaFolder { get; set; } public ScannerOptions? Scanner { get; set; } + public bool RemoveOriginalFiles { get; set; } + public bool RemoveDetectionFiles { get; set; } } \ No newline at end of file