using Elsa.Elasticsearch.Modules.Management; using Elsa.Elasticsearch.Modules.Runtime; using Elsa.Elasticsearch.Options; using Elsa.EntityFrameworkCore.Extensions; using Elsa.Extensions; using Elsa.Identity.Options; using Elsa.Jobs.Activities.Services; using Elsa.EntityFrameworkCore.Modules.ActivityDefinitions; using Elsa.EntityFrameworkCore.Modules.Labels; using Elsa.EntityFrameworkCore.Modules.Management; using Elsa.EntityFrameworkCore.Modules.Runtime; using Elsa.WorkflowServer.Web.Jobs; using Microsoft.Data.Sqlite; using Proto.Persistence.Sqlite; var builder = WebApplication.CreateBuilder(args); var services = builder.Services; var configuration = builder.Configuration; var sqliteConnectionString = configuration.GetConnectionString("Sqlite")!; var rabbitMqConnectionString = configuration.GetConnectionString("RabbitMq")!; var identityOptions = new IdentityOptions(); var identityTokenOptions = new IdentityTokenOptions(); var identitySection = configuration.GetSection("Identity"); var identityTokenSection = identitySection.GetSection("Tokens"); identitySection.Bind(identityOptions); identityTokenSection.Bind(identityTokenOptions); var elasticOptions = new ElasticsearchOptions(); configuration.GetSection(ElasticsearchOptions.Elasticsearch).Bind(elasticOptions); // Add Elsa services. services .AddElsa(elsa => elsa .AddActivitiesFrom() .UseIdentity(identity => { identity.IdentityOptions = identityOptions; identity.TokenOptions = identityTokenOptions; }) .UseDefaultAuthentication() .UseWorkflowManagement(management => { management.UseEntityFrameworkCore(ef => ef.UseSqlite(sqliteConnectionString)); management.UseWorkflowInstances(w => w.UseElasticsearch(elasticOptions)); }) .UseWorkflowRuntime(runtime => { runtime.UseProtoActor(proto => proto.PersistenceProvider = _ => new SqliteProvider(new SqliteConnectionStringBuilder(sqliteConnectionString))); runtime.UseDefaultRuntime(df => df.UseEntityFrameworkCore(ef => ef.UseSqlite(sqliteConnectionString))); runtime.UseExecutionLogRecords(e => e.UseElasticsearch(elasticOptions)); runtime.UseAsyncWorkflowStateExporter(); runtime.UseMassTransitDispatcher(); }) .UseMassTransit(massTransit => massTransit.UseRabbitMq(rabbitMqConnectionString)) .UseLabels(labels => labels.UseEntityFrameworkCore(ef => ef.UseSqlite(sqliteConnectionString))) .UseActivityDefinitions(feature => feature.UseEntityFrameworkCore(ef => ef.UseSqlite(sqliteConnectionString))) .UseJobs(jobs => jobs.ConfigureOptions = options => options.WorkerCount = 10) .UseJobActivities() .UseScheduling() .UseWorkflowsApi() .UseJavaScript() .UseLiquid() .UseHttp() ); services.AddHandlersFrom(); services.AddHealthChecks(); services.AddCors(cors => cors.AddDefaultPolicy(policy => policy.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin())); services.AddHttpContextAccessor(); // Configure middleware pipeline. var app = builder.Build(); var serviceProvider = app.Services; // Register a dummy job for demo purposes. var jobRegistry = serviceProvider.GetRequiredService(); jobRegistry.Add(typeof(IndexBlockchainJob)); if (app.Environment.IsDevelopment()) app.UseDeveloperExceptionPage(); // CORS. app.UseCors(); // Health checks. app.MapHealthChecks("/"); app.UseAuthentication(); app.UseAuthorization(); // Register Elsa middleware. app.UseWorkflowsApi(); app.UseJsonSerializationErrorHandler(); app.UseWorkflows(); // Run. app.Run();