void.cat/VoidCat/Program.cs

185 lines
5.7 KiB
C#
Raw Normal View History

using Microsoft.EntityFrameworkCore;
2022-02-21 09:39:59 +00:00
using Newtonsoft.Json;
2022-02-10 16:36:53 +00:00
using Prometheus;
2022-01-25 17:57:07 +00:00
using VoidCat.Model;
using VoidCat.Services;
2022-09-07 11:40:52 +00:00
using VoidCat.Services.Analytics;
2022-02-17 15:52:49 +00:00
using VoidCat.Services.Migrations;
2022-02-27 13:54:25 +00:00
namespace VoidCat;
2022-01-28 10:32:00 +00:00
static class Program
2022-08-30 21:07:10 +00:00
{
[Flags]
enum RunModes
{
Webserver = 1,
BackgroundJobs = 2,
Migrations = 4,
All = 255
}
2022-08-30 21:07:10 +00:00
public static async Task Main(string[] args)
{
JsonConvert.DefaultSettings = () => VoidStartup.ConfigJsonSettings(new());
2022-02-16 23:19:31 +00:00
RunModes mode = args.Length == 0 ? RunModes.All : 0;
if (args.Contains("--run-webserver"))
{
mode |= RunModes.Webserver;
}
2022-06-06 21:51:25 +00:00
if (args.Contains("--run-migrations"))
{
mode |= RunModes.Migrations;
}
2022-06-06 21:51:25 +00:00
if (args.Contains("--run-background-jobs"))
2022-03-08 13:47:42 +00:00
{
mode |= RunModes.BackgroundJobs;
2022-03-08 13:47:42 +00:00
}
2022-01-28 00:18:27 +00:00
Console.WriteLine($"Running with modes: {mode}");
2022-02-21 22:35:06 +00:00
async Task RunMigrations(IServiceProvider services)
{
using var migrationScope = services.CreateScope();
var migrations = migrationScope.ServiceProvider.GetServices<IMigration>();
var logger = migrationScope.ServiceProvider.GetRequiredService<ILogger<IMigration>>();
foreach (var migration in migrations.OrderBy(a => a.Order))
{
logger.LogInformation("Running migration: {Migration}", migration.GetType().Name);
var res = await migration.Migrate(args);
logger.LogInformation("== Result: {Result}", res.ToString());
if (res == IMigration.MigrationResult.ExitCompleted)
{
return;
}
}
}
2022-02-21 12:54:57 +00:00
if (mode.HasFlag(RunModes.Webserver))
{
var builder = WebApplication.CreateBuilder(args);
var services = builder.Services;
2022-02-21 12:54:57 +00:00
var configuration = builder.Configuration;
var voidSettings = configuration.GetSection("Settings").Get<VoidSettings>();
services.AddSingleton(voidSettings);
services.AddSingleton(voidSettings.Strike ?? new());
2022-02-21 12:54:57 +00:00
var seqSettings = configuration.GetSection("Seq");
builder.Logging.AddSeq(seqSettings);
2022-02-21 12:54:57 +00:00
ConfigureDb(services, voidSettings);
services.AddBaseServices(voidSettings);
services.AddDatabaseServices(voidSettings);
services.AddWebServices(voidSettings);
2022-02-21 22:35:06 +00:00
if (mode.HasFlag(RunModes.Migrations))
{
services.AddMigrations(voidSettings);
}
if (mode.HasFlag(RunModes.BackgroundJobs))
{
services.AddBackgroundServices(voidSettings);
}
2022-03-07 13:38:53 +00:00
var app = builder.Build();
2022-03-11 15:59:08 +00:00
if (mode.HasFlag(RunModes.Migrations))
{
await RunMigrations(app.Services);
}
2022-06-06 21:51:25 +00:00
app.UseStaticFiles();
app.UseHttpLogging();
app.UseRouting();
2023-10-05 21:31:47 +00:00
app.UseHttpMetrics();
app.UseCors();
app.UseSwagger();
app.UseSwaggerUI();
app.UseAuthentication();
app.UseAuthorization();
app.UseHealthChecks("/healthz");
app.UseMiddleware<AnalyticsMiddleware>();
app.UseEndpoints(ep =>
{
ep.MapControllers();
ep.MapMetrics();
ep.MapRazorPages();
ep.MapFallbackToFile("index.html");
});
2022-08-30 20:59:13 +00:00
await app.RunAsync();
2022-06-06 21:51:25 +00:00
}
else
2022-08-30 20:59:13 +00:00
{
// daemon style, dont run web server
var builder = Host.CreateDefaultBuilder(args);
builder.ConfigureServices((context, services) =>
{
var voidSettings = context.Configuration.GetSection("Settings").Get<VoidSettings>();
services.AddSingleton(voidSettings);
services.AddSingleton(voidSettings.Strike ?? new());
ConfigureDb(services, voidSettings);
services.AddBaseServices(voidSettings);
services.AddDatabaseServices(voidSettings);
if (mode.HasFlag(RunModes.Migrations))
{
services.AddMigrations(voidSettings);
}
if (mode.HasFlag(RunModes.BackgroundJobs))
{
services.AddBackgroundServices(voidSettings);
}
});
builder.ConfigureLogging((context, logging) => { logging.AddSeq(context.Configuration.GetSection("Seq")); });
var app = builder.Build();
if (mode.HasFlag(RunModes.Migrations))
{
await RunMigrations(app.Services);
}
if (mode.HasFlag(RunModes.BackgroundJobs))
{
await app.RunAsync();
}
2022-08-30 20:59:13 +00:00
}
}
2022-02-22 14:20:31 +00:00
private static void ConfigureDb(IServiceCollection services, VoidSettings settings)
2022-08-30 20:59:13 +00:00
{
if (settings.HasPostgres())
{
services.AddDbContext<VoidContext>(o =>
o.UseNpgsql(settings.Postgres!));
}
2022-08-30 20:59:13 +00:00
}
2022-02-22 14:20:31 +00:00
/// <summary>
/// Dummy method for EF core migrations
/// </summary>
/// <param name="args"></param>
/// <returns></returns>
// ReSharper disable once UnusedMember.Global
public static IHostBuilder CreateHostBuilder(string[] args)
2022-08-30 20:59:13 +00:00
{
var dummyHost = Host.CreateDefaultBuilder(args);
dummyHost.ConfigureServices((ctx, svc) =>
{
var settings = ctx.Configuration.GetSection("Settings").Get<VoidSettings>();
ConfigureDb(svc, settings);
});
return dummyHost;
2022-08-30 20:59:13 +00:00
}
}