Files
Aberwyn/Aberwyn/Program.cs
elias 256ce76af1
All checks were successful
continuous-integration/drone/push Build is passing
Pizza notice
2025-06-06 12:57:49 +02:00

250 lines
6.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Microsoft.EntityFrameworkCore;
using Aberwyn.Data;
using System.Text;
using System.Globalization;
using Microsoft.AspNetCore.Localization;
using Aberwyn.Models;
using Microsoft.AspNetCore.Identity;
using System.Text.Json;
using Aberwyn.Services;
var config = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false)
.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", optional: true)
.AddEnvironmentVariables()
.Build();
var builder = WebApplication.CreateBuilder(new WebApplicationOptions
{
Args = args,
EnvironmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"
});
builder.Configuration.AddConfiguration(config);
// Läser setup.json eller skapar en ny tom om den inte finns
var setupFilePath = Path.Combine("infrastructure", "setup.json");
if (!File.Exists(setupFilePath))
{
var initialSettings = new SetupSettings
{
IsConfigured = false,
DbPort = 3306
};
var initialJson = JsonSerializer.Serialize(initialSettings, new JsonSerializerOptions { WriteIndented = true });
Directory.CreateDirectory(Path.GetDirectoryName(setupFilePath)!); // säkerställ att mappen finns
File.WriteAllText(setupFilePath, initialJson);
}
SetupSettings setup;
try
{
using var jsonStream = File.OpenRead(setupFilePath);
setup = JsonSerializer.Deserialize<SetupSettings>(jsonStream)!;
if (setup.IsConfigured)
{
if (string.IsNullOrWhiteSpace(setup.DbHost) ||
string.IsNullOrWhiteSpace(setup.DbName) ||
string.IsNullOrWhiteSpace(setup.DbUser) ||
string.IsNullOrWhiteSpace(setup.DbPassword))
{
throw new Exception("Databasinställningarna är ofullständiga.");
}
}
}
catch (Exception ex)
{
Console.WriteLine($"❌ Fel vid läsning av setup.json: {ex.Message}");
setup = new SetupSettings { IsConfigured = false };
}
// Add services to the container
builder.Services.AddControllersWithViews()
.AddJsonOptions(opts =>
{
opts.JsonSerializerOptions.PropertyNamingPolicy = null;
opts.JsonSerializerOptions.IgnoreNullValues = true;
});
builder.Services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromDays(30);
options.Cookie.HttpOnly = true;
options.Cookie.IsEssential = true;
});
builder.Services.AddRazorPages();
builder.Services.AddHttpClient();
// Registrera rätt databas och identity beroende på om setup är klar
if (setup.IsConfigured)
{
var csBuilder = new MySqlConnector.MySqlConnectionStringBuilder
{
Server = setup.DbHost,
Port = (uint)setup.DbPort,
Database = setup.DbName,
UserID = setup.DbUser,
Password = setup.DbPassword,
AllowUserVariables = true // valfritt ta bort om du inte använder det
};
var connectionString = csBuilder.ConnectionString;
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString)));
builder.Services.AddIdentity<ApplicationUser, IdentityRole>(options =>
{
options.SignIn.RequireConfirmedAccount = false;
})
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
}
else
{
builder.Services.AddDbContext<ApplicationDbContext>(options =>
options.UseInMemoryDatabase("TempSetup"));
builder.Services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
}
// Identity inställningar
builder.Services.Configure<IdentityOptions>(options =>
{
options.Password.RequireDigit = false;
options.Password.RequiredLength = 6;
options.Password.RequireLowercase = false;
options.Password.RequireNonAlphanumeric = false;
options.Password.RequireUppercase = false;
});
// Appens övriga tjänster
builder.Services.AddScoped<MenuService>();
builder.Services.AddScoped<PushNotificationService>(sp =>
{
var config = sp.GetRequiredService<IConfiguration>();
return new PushNotificationService(
config["VapidKeys:Subject"],
config["VapidKeys:PublicKey"],
config["VapidKeys:PrivateKey"]
);
});
builder.Services.AddScoped<PizzaNotificationService>();
builder.Services.Configure<VapidOptions>(builder.Configuration.GetSection("Vapid"));
builder.Services.ConfigureApplicationCookie(options =>
{
options.LoginPath = "/Identity/Account/Login";
});
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
builder.Services.Configure<RequestLocalizationOptions>(options =>
{
var supportedCultures = new[] { new CultureInfo("sv-SE") };
options.DefaultRequestCulture = new RequestCulture("sv-SE");
options.SupportedCultures = supportedCultures;
options.SupportedUICultures = supportedCultures;
});
builder.Services.AddSingleton<SetupService>();
var app = builder.Build();
app.UseStaticFiles();
// Middleware: om ej konfigurerad → redirect till /setup
app.Use(async (context, next) =>
{
var setupService = context.RequestServices.GetRequiredService<SetupService>();
var currentSetup = setupService.GetSetup();
var path = context.Request.Path;
var method = context.Request.Method;
if (!currentSetup.IsConfigured &&
!path.StartsWithSegments("/setup") &&
!(path == "/setup" && method == "POST") && // 👈 tillåt POST till /setup
!path.StartsWithSegments("/api/setup"))
{
context.Response.Redirect("/setup");
return;
}
await next();
});
// Configure the HTTP request pipeline
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseRouting();
app.UseSession();
app.UseAuthentication();
app.UseAuthorization();
// Routing
app.MapControllers();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapRazorPages();
// Init: migrera databas och skapa admin
if (setup.IsConfigured)
{
using var scope = app.Services.CreateScope();
var services = scope.ServiceProvider;
var context = services.GetRequiredService<ApplicationDbContext>();
int retries = 10;
while (retries > 0)
{
try
{
context.Database.OpenConnection();
context.Database.CloseConnection();
break;
}
catch
{
retries--;
Console.WriteLine("⏳ Väntar på databas...");
Thread.Sleep(3000);
}
}
context.Database.Migrate();
var userManager = services.GetRequiredService<UserManager<ApplicationUser>>();
var anyUsers = await userManager.Users.AnyAsync();
if (!anyUsers)
{
Console.WriteLine("🧩 Ingen användare hittades skapar admin...");
await IdentityDataInitializer.SeedData(services, setup);
}
}
app.Run();