using CShells.Features;
using Elsa.Common.Multitenancy;
using Elsa.Common.RecurringTasks;
using Elsa.Extensions;
using Elsa.Scheduling.Bookmarks;
using Elsa.Scheduling.Handlers;
using Elsa.Scheduling.HostedServices;
using Elsa.Scheduling.Services;
using Elsa.Scheduling.TriggerPayloadValidators;
using JetBrains.Annotations;
using Microsoft.Extensions.DependencyInjection;
namespace Elsa.Scheduling.ShellFeatures;
///
/// Provides scheduling features to the system.
///
[ShellFeature(
DisplayName = "Scheduling",
Description = "Provides scheduling capabilities for workflows including cron and delay-based triggers",
DependsOn = ["SystemClock"])]
[UsedImplicitly]
public class SchedulingFeature : IShellFeature
{
///
/// Gets or sets the trigger scheduler factory.
///
public Func WorkflowScheduler { get; set; } = sp => sp.GetRequiredService();
///
/// Gets or sets the CRON parser factory.
///
public Func CronParser { get; set; } = sp => sp.GetRequiredService();
public void ConfigureServices(IServiceCollection services)
{
services
.AddSingleton()
.AddSingleton(sp => sp.GetRequiredService())
.AddSingleton(sp => sp.GetRequiredService())
.AddSingleton()
.AddSingleton()
.AddSingleton(CronParser)
.AddScoped()
.AddScoped()
.AddScoped()
.AddScoped(WorkflowScheduler)
.AddBackgroundTask()
.AddHandlersFrom()
//Trigger payload validators.
.AddTriggerPayloadValidator();
}
}