Files
romrepomgr/RomRepoMgr.Blazor/Program.cs

141 lines
4.0 KiB
C#
Raw Normal View History

2025-07-26 21:16:23 +01:00
using System.Diagnostics;
2025-07-26 17:55:02 +01:00
using Microsoft.FluentUI.AspNetCore.Components;
2025-07-26 19:04:34 +01:00
using RomRepoMgr.Blazor;
2025-07-26 17:55:02 +01:00
using RomRepoMgr.Blazor.Components;
2025-07-26 21:16:23 +01:00
using RomRepoMgr.Database;
2025-07-27 03:29:21 +01:00
using RomRepoMgr.Settings;
2025-07-26 17:59:18 +01:00
using Serilog;
Log.Logger = new LoggerConfiguration()
#if DEBUG
.MinimumLevel.Debug()
#else
.MinimumLevel.Information()
#endif
.WriteTo.Console()
.Enrich.FromLogContext()
.CreateLogger();
Log.Information("Welcome to ROM Repository Manager!");
2025-07-26 18:44:39 +01:00
Log.Information("Copyright © 2020-2025 Natalia Portillo");
2025-07-26 17:55:02 +01:00
2025-07-26 19:04:34 +01:00
// Ensure the folders exist
Log.Information("Ensuring folders exist...");
string[] folders =
[
Consts.DbFolder, Consts.DatFolder, Consts.IncomingDatFolder, Consts.RepositoryFolder, Consts.IncomingRomsFolder
];
foreach(string folder in folders)
{
if(!Directory.Exists(folder))
{
Log.Debug("Creating folder: {Folder}", folder);
Directory.CreateDirectory(folder);
}
else
Log.Debug("Folder already exists: {Folder}", folder);
}
// Ensure the temporary folder exists but it can also be a symlink
if(!Directory.Exists(Consts.TemporaryFolder) && !File.Exists(Consts.TemporaryFolder))
{
Log.Debug("Creating folder: {TemporaryFolder}", Consts.TemporaryFolder);
Directory.CreateDirectory(Consts.TemporaryFolder);
}
else
Log.Debug("Folder already exists: {TemporaryFolder}", Consts.TemporaryFolder);
2025-07-26 18:44:39 +01:00
Log.Debug("Creating the builder...");
2025-07-26 19:04:34 +01:00
WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
2025-07-26 17:55:02 +01:00
2025-07-26 17:59:18 +01:00
builder.Host.UseSerilog(); // ✅ Plug Serilog into the host
2025-07-26 17:55:02 +01:00
// Add services to the container.
builder.Services.AddRazorComponents().AddInteractiveServerComponents();
builder.Services.AddFluentUIComponents();
2025-07-27 17:19:25 +01:00
// Localization
builder.Services.AddLocalization();
2025-07-26 21:16:23 +01:00
Log.Debug("Creating database context...");
builder.Services.AddDbContextFactory<Context>(options =>
{
options.UseSqlite($"Data Source={Consts.DbFolder}/database.db");
#if DEBUG
options.EnableSensitiveDataLogging();
options.LogTo(Log.Debug);
#else
options.LogTo(Log.Information, LogLevel.Information);
#endif
});
2025-07-27 04:02:17 +01:00
builder.Services.AddDataGridEntityFrameworkAdapter();
2025-07-27 03:29:21 +01:00
Log.Debug("Setting the settings...");
Settings.Current = new SetSettings
{
DatabasePath = Path.Combine(Environment.CurrentDirectory, Consts.DbFolder, "database.db"),
TemporaryFolder = Path.Combine(Environment.CurrentDirectory, Consts.TemporaryFolder),
RepositoryPath = Path.Combine(Environment.CurrentDirectory, Consts.RepositoryFolder),
UseInternalDecompressor = true,
Compression = CompressionType.Zstd // Todo: Read from configuration
};
2025-07-26 18:44:39 +01:00
Log.Debug("Building the application...");
2025-07-26 19:04:34 +01:00
WebApplication app = builder.Build();
2025-07-26 17:55:02 +01:00
// Configure the HTTP request pipeline.
if(!app.Environment.IsDevelopment())
{
2025-07-26 19:04:34 +01:00
app.UseExceptionHandler("/Error", true);
2025-07-26 17:55:02 +01:00
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseAntiforgery();
app.MapStaticAssets();
app.MapRazorComponents<App>().AddInteractiveServerRenderMode();
2025-07-27 17:19:25 +01:00
// Localization
string[] supportedCultures = new[]
{
"en", "es"
};
RequestLocalizationOptions localizationOptions = new RequestLocalizationOptions().SetDefaultCulture("en")
.AddSupportedCultures(supportedCultures)
.AddSupportedUICultures(supportedCultures);
app.UseRequestLocalization(localizationOptions);
2025-07-26 21:16:23 +01:00
Stopwatch stopwatch = new();
using(IServiceScope scope = app.Services.CreateScope())
{
IServiceProvider services = scope.ServiceProvider;
try
{
Log.Information("Updating the database...");
stopwatch.Start();
Context dbContext = services.GetRequiredService<Context>();
await dbContext.Database.MigrateAsync();
stopwatch.Stop();
Log.Debug("Database migration: {Elapsed} seconds", stopwatch.Elapsed.TotalSeconds);
}
catch(Exception ex)
{
Log.Error(ex, "An error occurred while updating the database");
return;
}
}
2025-07-26 18:44:39 +01:00
Log.Debug("Running the application...");
2025-07-26 17:55:02 +01:00
app.Run();