Skip to content

Commit aa802d1

Browse files
committed
Create seeder
1 parent 2553c9d commit aa802d1

8 files changed

Lines changed: 112 additions & 44 deletions

File tree

API/Program.cs

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using Microsoft.AspNetCore.Http.Connections;
2-
using Microsoft.EntityFrameworkCore;
32
using Microsoft.Extensions.Options;
43
using OpenShock.API.Realtime;
54
using OpenShock.API.Services;
@@ -9,7 +8,6 @@
98
using OpenShock.Common.Extensions;
109
using OpenShock.Common.Hubs;
1110
using OpenShock.Common.JsonSerialization;
12-
using OpenShock.Common.OpenShockDb;
1311
using OpenShock.Common.Options;
1412
using OpenShock.Common.Services.Device;
1513
using OpenShock.Common.Services.LCGNodeProvisioner;
@@ -32,7 +30,9 @@
3230

3331
#endregion
3432

35-
builder.Services.AddOpenShockServices(databaseConfig, redisConfig);
33+
builder.Services.AddOpenShockMemDB(redisConfig);
34+
builder.Services.AddOpenShockDB(databaseConfig);
35+
builder.Services.AddOpenShockServices();
3636

3737
builder.Services.AddSignalR()
3838
.AddOpenShockStackExchangeRedis(options => { options.Configuration = redisConfig; })
@@ -64,25 +64,7 @@
6464

6565
if (!databaseConfig.SkipMigration)
6666
{
67-
Log.Information("Running database migrations...");
68-
using var scope = app.Services.CreateScope();
69-
70-
await using var migrationContext = new MigrationOpenShockContext(
71-
databaseConfig.Conn,
72-
databaseConfig.Debug,
73-
scope.ServiceProvider.GetRequiredService<ILoggerFactory>());
74-
var pendingMigrations = migrationContext.Database.GetPendingMigrations().ToArray();
75-
76-
if (pendingMigrations.Length > 0)
77-
{
78-
Log.Information("Found pending migrations, applying [{@Migrations}]", pendingMigrations);
79-
migrationContext.Database.Migrate();
80-
Log.Information("Applied database migrations... proceeding with startup");
81-
}
82-
else
83-
{
84-
Log.Information("No pending migrations found, proceeding with startup");
85-
}
67+
await app.ApplyPendingOpenShockMigrations(databaseConfig);
8668
}
8769
else
8870
{

Common/OpenShockMiddlewareHelper.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
using Microsoft.AspNetCore.HttpOverrides;
2+
using Microsoft.EntityFrameworkCore;
3+
using Microsoft.Extensions.Logging;
24
using Microsoft.Extensions.Options;
5+
using OpenShock.Common.OpenShockDb;
36
using OpenShock.Common.Options;
47
using OpenShock.Common.Redis;
58
using OpenShock.Common.Utils;
@@ -86,4 +89,30 @@ public static async Task<IApplicationBuilder> UseCommonOpenShockMiddleware(this
8689

8790
return app;
8891
}
92+
93+
public static async Task<IApplicationBuilder> ApplyPendingOpenShockMigrations(this IApplicationBuilder app, DatabaseOptions options)
94+
{
95+
using var scope = app.ApplicationServices.CreateScope();
96+
var loggerFactory = scope.ServiceProvider.GetRequiredService<ILoggerFactory>();
97+
var logger = loggerFactory.CreateLogger("MigrationHelper");
98+
99+
logger.LogInformation("Running database migrations...");
100+
101+
await using var migrationContext = new MigrationOpenShockContext(options.Conn, options.Debug, loggerFactory);
102+
103+
var pendingMigrations = migrationContext.Database.GetPendingMigrations().ToArray();
104+
105+
if (pendingMigrations.Length > 0)
106+
{
107+
logger.LogInformation("Found pending migrations, applying [{@Migrations}]", pendingMigrations);
108+
await migrationContext.Database.MigrateAsync();
109+
logger.LogInformation("Applied database migrations... proceeding with startup");
110+
}
111+
else
112+
{
113+
logger.LogInformation("No pending migrations found, proceeding with startup");
114+
}
115+
116+
return app;
117+
}
89118
}

Common/OpenShockServiceHelper.cs

Lines changed: 28 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -69,14 +69,39 @@ public static ConfigurationOptions GetRedisConfigurationOptions(this Configurati
6969
return configurationOptions;
7070
}
7171

72+
public static IServiceCollection AddOpenShockMemDB(this IServiceCollection services, ConfigurationOptions options)
73+
{
74+
// <---- Redis ---->
75+
services.AddSingleton<IConnectionMultiplexer>(ConnectionMultiplexer.Connect(options));
76+
services.AddSingleton<IRedisConnectionProvider, RedisConnectionProvider>();
77+
services.AddSingleton<IRedisPubService, RedisPubService>();
78+
79+
return services;
80+
}
81+
82+
public static IServiceCollection AddOpenShockDB(this IServiceCollection services, DatabaseOptions options)
83+
{
84+
// <---- Postgres EF Core ---->
85+
services.AddDbContextPool<OpenShockContext>(builder => OpenShockContext.ConfigureOptionsBuilder(builder, options.Conn, options.Debug));
86+
services.AddPooledDbContextFactory<OpenShockContext>(builder =>
87+
{
88+
builder.UseNpgsql(options.Conn);
89+
if (options.Debug)
90+
{
91+
builder.EnableSensitiveDataLogging();
92+
builder.EnableDetailedErrors();
93+
}
94+
});
95+
96+
return services;
97+
}
98+
7299
/// <summary>
73100
/// Register all OpenShock services for PRODUCTION use
74101
/// </summary>
75102
/// <param name="services"></param>
76-
/// <param name="databaseOptions"></param>
77-
/// <param name="redisConfigurationOptions"></param>
78103
/// <returns></returns>
79-
public static IServiceCollection AddOpenShockServices(this IServiceCollection services, DatabaseOptions databaseOptions, ConfigurationOptions redisConfigurationOptions)
104+
public static IServiceCollection AddOpenShockServices(this IServiceCollection services)
80105
{
81106
// <---- ASP.NET ---->
82107
services.AddExceptionHandler<OpenShockExceptionHandler>();
@@ -169,23 +194,6 @@ public static IServiceCollection AddOpenShockServices(this IServiceCollection se
169194
.AddAspNetCoreInstrumentation()
170195
.AddHttpClientInstrumentation()
171196
.AddPrometheusExporter());
172-
173-
// <---- Redis ---->
174-
services.AddSingleton<IConnectionMultiplexer>(ConnectionMultiplexer.Connect(redisConfigurationOptions));
175-
services.AddSingleton<IRedisConnectionProvider, RedisConnectionProvider>();
176-
services.AddSingleton<IRedisPubService, RedisPubService>();
177-
178-
// <---- Postgres EF Core ---->
179-
services.AddDbContextPool<OpenShockContext>(builder => OpenShockContext.ConfigureOptionsBuilder(builder, databaseOptions.Conn, databaseOptions.Debug));
180-
services.AddPooledDbContextFactory<OpenShockContext>(builder =>
181-
{
182-
builder.UseNpgsql(databaseOptions.Conn);
183-
if (databaseOptions.Debug)
184-
{
185-
builder.EnableSensitiveDataLogging();
186-
builder.EnableDetailedErrors();
187-
}
188-
});
189197

190198
// <---- OpenShock Services ---->
191199

Cron/Program.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313
var databaseConfig = builder.Configuration.GetDatabaseOptions();
1414
var redisConfig = builder.Configuration.GetRedisConfigurationOptions();
1515

16-
builder.Services.AddOpenShockServices(databaseConfig, redisConfig);
16+
builder.Services.AddOpenShockMemDB(redisConfig);
17+
builder.Services.AddOpenShockDB(databaseConfig);
18+
builder.Services.AddOpenShockServices();
1719

1820
builder.Services.AddHangfire(hangfire =>
1921
hangfire.UsePostgreSqlStorage(c =>

LiveControlGateway/Program.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020
var databaseConfig = builder.Configuration.GetDatabaseOptions();
2121
var redisConfig = builder.Configuration.GetRedisConfigurationOptions();
2222

23-
builder.Services.AddOpenShockServices(databaseConfig, redisConfig);
23+
builder.Services.AddOpenShockMemDB(redisConfig);
24+
builder.Services.AddOpenShockDB(databaseConfig);
25+
builder.Services.AddOpenShockServices();
2426

2527
builder.Services.AddSignalR()
2628
.AddOpenShockStackExchangeRedis(options => { options.Configuration = redisConfig; })

OpenShockBackend.slnx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@
66
<Project Path="LiveControlGateway\LiveControlGateway.csproj" Type="Classic C#" />
77
<Project Path="Cron\Cron.csproj" Type="Classic C#" />
88
<Project Path="MigrationHelper\MigrationHelper.csproj" Type="Classic C#" />
9+
<Project Path="SeedE2E/SeedE2E.csproj" Type="Classic C#" />
910
</Solution>

SeedE2E/Program.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
using Microsoft.Extensions.Configuration;
2+
using Microsoft.Extensions.DependencyInjection;
3+
using Microsoft.Extensions.Hosting;
4+
using Microsoft.Extensions.Options;
5+
using OpenShock.Common;
6+
using OpenShock.Common.Extensions;
7+
using OpenShock.Common.Options;
8+
9+
var builder = OpenShockApplication.CreateDefaultBuilder<Program>(args);
10+
11+
if (builder.Environment.IsDevelopment())
12+
{
13+
Console.WriteLine(builder.Configuration.GetDebugView());
14+
}
15+
16+
builder.RegisterCommonOpenShockOptions();
17+
18+
builder.Services.Configure<FrontendOptions>(builder.Configuration.GetRequiredSection(FrontendOptions.SectionName));
19+
builder.Services.AddSingleton<IValidateOptions<FrontendOptions>, FrontendOptionsValidator>();
20+
21+
var databaseConfig = builder.Configuration.GetDatabaseOptions();
22+
var redisConfig = builder.Configuration.GetRedisConfigurationOptions();
23+
24+
builder.Services.AddOpenShockMemDB(redisConfig);
25+
builder.Services.AddOpenShockDB(databaseConfig);
26+
builder.Services.AddOpenShockServices();
27+
28+
var app = builder.Build();
29+
30+
await app.ApplyPendingOpenShockMigrations(databaseConfig);
31+
32+
await app.RunAsync();

SeedE2E/SeedE2E.csproj

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
<Import Project="../Framework.props" />
3+
<Import Project="../Shared.props" />
4+
5+
<PropertyGroup>
6+
<OutputType>Exe</OutputType>
7+
</PropertyGroup>
8+
9+
<ItemGroup>
10+
<ProjectReference Include="..\Common\Common.csproj" />
11+
</ItemGroup>
12+
</Project>

0 commit comments

Comments
 (0)