Files
blazor-saas-crm/Program.cs
T
2026-07-21 14:14:44 +07:00

127 lines
3.0 KiB
C#

using Indotalent.ConfigBackEnd;
using Indotalent.ConfigBackEnd.Middleware;
using Indotalent.ConfigFrontEnd;
using Indotalent.ConfigFrontEnd.Filter;
using Indotalent.Data.Entities;
using Indotalent.Features;
using Indotalent.Features.Account;
using Indotalent.Features.Root;
using Indotalent.Infrastructure;
using Indotalent.Infrastructure.Database;
using Indotalent.Infrastructure.Logging.Serilog;
using Microsoft.OpenApi;
using MudBlazor.Services;
using QuestPDF.Infrastructure;
using Serilog;
//private and non profit. commercial less than 1 million USD
//ref: https://www.questpdf.com/license/
QuestPDF.Settings.License = LicenseType.Community;
var builder = WebApplication.CreateBuilder(args);
builder.AddSerilogBuilder();
builder.Services.AddHttpContextAccessor();
builder.Services.AddConfigBackEndDI();
builder.Services.AddInfrastructureDI(builder.Configuration);
builder.Services.AddRazorComponents()
.AddInteractiveServerComponents()
.AddHubOptions(options =>
{
options.MaximumReceiveMessageSize = null; //null => for unlimited
});
builder.Services.AddMudServices();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(options =>
{
options.SwaggerDoc("v1", new OpenApiInfo { Title = "API", Version = "v1" });
options.CustomSchemaIds(type => type.FullName);
});
builder.Services.AddConfigFrontEndDI();
builder.Services.AddFeaturesDI();
builder.Services.AddRazorPages(options =>
{
options.RootDirectory = "/Features";
});
var app = builder.Build();
app.MapRazorPages();
app.UseMiddleware<ExceptionHandlingMiddleware>();
app.MapGroup("/api/account").WithTags("Account").MapIdentityApi<ApplicationUser>();
using (var scope = app.Services.CreateScope())
{
var settings = app.Configuration.GetSection("DatabaseSettings").Get<DatabaseSettingsModel>();
if (settings?.MsSQL?.IsUsed == true ||
settings?.PostgreSQL?.IsUsed == true ||
settings?.MySQL?.IsUsed == true)
{
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
context.Database.EnsureCreated();
await DatabaseSeeder.SeedAsync(scope.ServiceProvider);
}
}
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error", createScopeForErrors: true);
app.UseHsts();
}
app.MapSwagger().RequireAuthorization();
app.UseStatusCodePagesWithReExecute("/not-found", createScopeForStatusCodePages: true);
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseAntiforgery();
app.MapStaticAssets();
app.MapRazorComponents<App>()
.AddInteractiveServerRenderMode();
app.MapControllers();
var apiGroup = app.MapGroup("/api").AddEndpointFilter<CurrentUserFilter>();
apiGroup.MapAccountEndpoints();
apiGroup.MapFeaturesEndpoint();
try
{
Log.Information("Starting Web Application...");
app.Run();
}
catch (Exception ex)
{
Log.Fatal(ex, "Application terminated unexpectedly");
}
finally
{
Log.CloseAndFlush();
}