Files
ApplianceRepair/Program.cs
2026-05-01 19:48:34 -05:00

130 lines
4.4 KiB
C#

using ApplianceRepair;
using ApplianceRepair.Components;
using Microsoft.EntityFrameworkCore;
using ApplianceRepair.Components.Account;
using Microsoft.AspNetCore.Components.Authorization;
using Microsoft.AspNetCore.Identity;
var builder = WebApplication.CreateBuilder(args);
var connectionString = builder.Configuration.GetConnectionString("DefaultConnection") ?? throw new InvalidOperationException("Connection string 'DefaultConnection' not found.");
// Add services to the container.
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents();
builder.Services.AddDbContext<DatabaseContext>(options =>
options.UseSqlite(connectionString));
builder.Services.AddMemoryCache();
builder.Services.AddLogging();
builder.Services.AddScoped<BusinessConfigReader>();
builder.Services.AddScoped<ContentCardReader>();
builder.Services.AddScoped<HomePageReader>();
builder.Services.AddScoped<RepairRequestReader>();
builder.Services.AddScoped<RepairRequestMediaReader>();
builder.Services.AddCascadingAuthenticationState();
builder.Services.AddScoped<IdentityUserAccessor>();
builder.Services.AddScoped<IdentityRedirectManager>();
builder.Services.AddScoped<AuthenticationStateProvider, IdentityRevalidatingAuthenticationStateProvider>();
builder.Services.AddAuthentication(options =>
{
options.DefaultScheme = IdentityConstants.ApplicationScheme;
options.DefaultSignInScheme = IdentityConstants.ExternalScheme;
})
.AddIdentityCookies();
builder.Services.AddIdentityCore<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<DatabaseContext>()
.AddSignInManager()
.AddDefaultTokenProviders();
builder.Services.AddServerSideBlazor()
.AddHubOptions(options =>
{
options.MaximumReceiveMessageSize = 10 * 1024 * 1024; // 10MB
});
builder.Services.AddSingleton<IEmailSender<IdentityUser>, IdentityNoOpEmailSender>();
var app = builder.Build();
using (var scope = app.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
var context = services.GetRequiredService<DatabaseContext>();
await context.Database.MigrateAsync();
await DatabaseContext.Initialize(context);
var roleManager = scope.ServiceProvider.GetRequiredService<RoleManager<IdentityRole>>();
var userManager = scope.ServiceProvider.GetRequiredService<UserManager<IdentityUser>>();
var logger = scope.ServiceProvider.GetRequiredService<ILogger<Program>>();
if (!await roleManager.RoleExistsAsync("Admin"))
{
await roleManager.CreateAsync(new IdentityRole("Admin"));
}
var domain = builder.Configuration.GetValue<string>("SiteDomain");
var adminEmail = $"admin@{domain}";
var adminUser = await userManager.FindByEmailAsync(adminEmail);
if (adminUser == null)
{
adminUser = new IdentityUser
{
UserName = adminEmail,
Email = adminEmail,
EmailConfirmed = true
};
const string chars = "ABCDEFGHJKLMNOPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz0123456789!@#$%^&*?";
var random = new Random();
var pass = new string(Enumerable.Repeat(chars, 16)
.Select(s => s[random.Next(s.Length)]).ToArray()) + "1aA!";
var result = await userManager.CreateAsync(adminUser, pass);
if (result.Succeeded)
{
await userManager.AddToRoleAsync(adminUser, "Admin");
logger.LogCritical("****************************************************");
logger.LogCritical($"ADMIN USER CREATED. Email: {adminEmail}");
logger.LogCritical($"TEMPORARY PASSWORD: {pass}");
logger.LogCritical("****************************************************");
}
}
}
catch (Exception ex)
{
var logger = services.GetRequiredService<ILogger<Program>>();
logger.LogError(ex, "An error occurred while migrating or seeding the database.");
}
}
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error", createScopeForErrors: true);
}
app.UseAntiforgery();
app.MapStaticAssets();
app.MapRazorComponents<App>()
.AddInteractiveServerRenderMode();
app.MapAdditionalIdentityEndpoints();;
app.Run();