179 lines
5.2 KiB
C#
179 lines
5.2 KiB
C#
using Microsoft.AspNetCore.Authentication.Cookies;
|
|
using Microsoft.AspNetCore.Authentication.Google;
|
|
using Microsoft.AspNetCore.Authentication.MicrosoftAccount;
|
|
using Microsoft.AspNetCore.Localization;
|
|
using Microsoft.AspNetCore.StaticFiles;
|
|
using Microsoft.Extensions.Caching.Distributed;
|
|
using Microsoft.Extensions.Localization;
|
|
using MongoDB.Driver;
|
|
using QRRapidoApp.Data;
|
|
using QRRapidoApp.Middleware;
|
|
using QRRapidoApp.Services;
|
|
using StackExchange.Redis;
|
|
using Stripe;
|
|
using System.Globalization;
|
|
|
|
var builder = WebApplication.CreateBuilder(args);
|
|
|
|
// Add services to the container
|
|
builder.Services.AddControllersWithViews();
|
|
|
|
// MongoDB Configuration - optional for development
|
|
var mongoConnectionString = builder.Configuration.GetConnectionString("MongoDB");
|
|
if (!string.IsNullOrEmpty(mongoConnectionString))
|
|
{
|
|
try
|
|
{
|
|
builder.Services.AddSingleton<IMongoClient>(serviceProvider =>
|
|
{
|
|
return new MongoClient(mongoConnectionString);
|
|
});
|
|
builder.Services.AddScoped<MongoDbContext>();
|
|
}
|
|
catch
|
|
{
|
|
// MongoDB not available - services will handle gracefully
|
|
builder.Services.AddScoped<MongoDbContext>();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Development mode without MongoDB
|
|
builder.Services.AddScoped<MongoDbContext>();
|
|
}
|
|
|
|
// Cache Configuration - use Redis if available, otherwise memory cache
|
|
var redisConnectionString = builder.Configuration.GetConnectionString("Redis");
|
|
if (!string.IsNullOrEmpty(redisConnectionString))
|
|
{
|
|
try
|
|
{
|
|
builder.Services.AddStackExchangeRedisCache(options =>
|
|
{
|
|
options.Configuration = redisConnectionString;
|
|
});
|
|
}
|
|
catch
|
|
{
|
|
// Fallback to memory cache if Redis fails
|
|
builder.Services.AddMemoryCache();
|
|
builder.Services.AddSingleton<IDistributedCache, QRRapidoApp.Services.MemoryDistributedCacheWrapper>();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// Use memory cache when Redis is not configured
|
|
builder.Services.AddMemoryCache();
|
|
builder.Services.AddSingleton<IDistributedCache, MemoryDistributedCacheWrapper>();
|
|
}
|
|
|
|
// Authentication Configuration
|
|
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
|
|
.AddCookie(options =>
|
|
{
|
|
options.LoginPath = "/Account/Login";
|
|
options.LogoutPath = "/Account/Logout";
|
|
options.ExpireTimeSpan = TimeSpan.FromDays(30);
|
|
options.SlidingExpiration = true;
|
|
})
|
|
.AddGoogle(GoogleDefaults.AuthenticationScheme, options =>
|
|
{
|
|
options.ClientId = builder.Configuration["Authentication:Google:ClientId"];
|
|
options.ClientSecret = builder.Configuration["Authentication:Google:ClientSecret"];
|
|
})
|
|
.AddMicrosoftAccount(MicrosoftAccountDefaults.AuthenticationScheme, options =>
|
|
{
|
|
options.ClientId = builder.Configuration["Authentication:Microsoft:ClientId"];
|
|
options.ClientSecret = builder.Configuration["Authentication:Microsoft:ClientSecret"];
|
|
});
|
|
|
|
// Stripe Configuration
|
|
StripeConfiguration.ApiKey = builder.Configuration["Stripe:SecretKey"];
|
|
|
|
// Localization
|
|
builder.Services.AddLocalization(options => options.ResourcesPath = "Resources");
|
|
builder.Services.Configure<RequestLocalizationOptions>(options =>
|
|
{
|
|
var supportedCultures = new[]
|
|
{
|
|
new CultureInfo("pt-BR"),
|
|
new CultureInfo("es"),
|
|
new CultureInfo("en")
|
|
};
|
|
|
|
options.DefaultRequestCulture = new RequestCulture("pt-BR");
|
|
options.SupportedCultures = supportedCultures;
|
|
options.SupportedUICultures = supportedCultures;
|
|
|
|
options.RequestCultureProviders.Insert(0, new QueryStringRequestCultureProvider());
|
|
options.RequestCultureProviders.Insert(1, new CookieRequestCultureProvider());
|
|
});
|
|
|
|
// Custom Services
|
|
builder.Services.AddScoped<IQRCodeService, QRRapidoService>();
|
|
builder.Services.AddScoped<IUserService, UserService>();
|
|
builder.Services.AddScoped<AdDisplayService>();
|
|
builder.Services.AddScoped<StripeService>();
|
|
|
|
// Background Services
|
|
builder.Services.AddHostedService<HistoryCleanupService>();
|
|
|
|
// CORS for API endpoints
|
|
builder.Services.AddCors(options =>
|
|
{
|
|
options.AddPolicy("AllowSpecificOrigins", policy =>
|
|
{
|
|
policy.WithOrigins("https://qrrapido.site", "https://www.qrrapido.site")
|
|
.AllowAnyHeader()
|
|
.AllowAnyMethod();
|
|
});
|
|
});
|
|
|
|
// Health checks (basic implementation without external dependencies)
|
|
builder.Services.AddHealthChecks();
|
|
|
|
var app = builder.Build();
|
|
|
|
// Configure the HTTP request pipeline
|
|
if (!app.Environment.IsDevelopment())
|
|
{
|
|
app.UseExceptionHandler("/Home/Error");
|
|
app.UseHsts();
|
|
}
|
|
|
|
app.UseHttpsRedirection();
|
|
|
|
app.UseStaticFiles();
|
|
|
|
app.UseRouting();
|
|
|
|
app.UseCors("AllowSpecificOrigins");
|
|
|
|
// Localization middleware
|
|
app.UseRequestLocalization();
|
|
|
|
app.UseAuthentication();
|
|
app.UseAuthorization();
|
|
|
|
// Custom middleware
|
|
app.UseMiddleware<LastLoginUpdateMiddleware>();
|
|
|
|
// Health check endpoint
|
|
app.MapHealthChecks("/health");
|
|
|
|
// Controller routes
|
|
app.MapControllerRoute(
|
|
name: "default",
|
|
pattern: "{controller=Home}/{action=Index}/{id?}");
|
|
|
|
// API routes
|
|
app.MapControllerRoute(
|
|
name: "api",
|
|
pattern: "api/{controller}/{action=Index}/{id?}");
|
|
|
|
// Language routes
|
|
app.MapControllerRoute(
|
|
name: "localized",
|
|
pattern: "{culture:regex(^(pt-BR|es|en)$)}/{controller=Home}/{action=Index}/{id?}");
|
|
|
|
app.Run(); |