using Elsa.Quartz.EntityFrameworkCore.PostgreSql;
using Elsa.Quartz.Features;
using JetBrains.Annotations;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Quartz;
// ReSharper disable once CheckNamespace
namespace Elsa.EntityFrameworkCore.Extensions;
///
/// Provides extensions to configure EF Core to use PostgreSQL.
///
[PublicAPI]
public static class PostgreSqlQuartzExtensions
{
///
/// Configures the to use the PostgreSQL job store.
///
public static QuartzFeature UsePostgreSql(this QuartzFeature feature, string connectionString = Constants.DefaultConnectionString, bool useClustering = true, bool useContextPooling = false)
{
if (useContextPooling)
feature.Services.AddPooledDbContextFactory(options => UseNpgsql(connectionString, options));
else
feature.Services.AddDbContextFactory(options => UseNpgsql(connectionString, options));
feature.ConfigureQuartz += quartz =>
{
quartz.UsePersistentStore(store =>
{
store.UseNewtonsoftJsonSerializer();
store.UsePostgres(options =>
{
options.ConnectionString = connectionString;
options.TablePrefix = "quartz.qrtz_";
});
if (useClustering)
store.UseClustering();
});
};
feature.Module.ConfigureHostedService>(-100);
return feature;
}
private static void UseNpgsql(string connectionString, DbContextOptionsBuilder options)
{
// Use PostgreSQL migrations.
options.UseNpgsql(connectionString, sqlServerDbContextOptionsBuilder => { sqlServerDbContextOptionsBuilder.MigrationsAssembly(typeof(PostgreSqlQuartzDbContext).Assembly.GetName().Name); });
}
}