using BusinessERP.ConHelper; using BusinessERP.Data; using BusinessERP.Helpers; using BusinessERP.Models; using BusinessERP.Models.CommonViewModel; using BusinessERP.Services; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.EntityFrameworkCore; using Microsoft.OpenApi.Models; using Newtonsoft.Json.Serialization; using Microsoft.AspNetCore.Server.IISIntegration; using System.Globalization; using Microsoft.Extensions.Options; using Microsoft.AspNetCore.Localization; using Microsoft.AspNetCore.DataProtection; var builder = WebApplication.CreateBuilder(args); builder.Services.AddRazorPages().AddRazorRuntimeCompilation(); builder.Services.AddLocalization(options => options.ResourcesPath = "Resources"); builder.Services.AddControllersWithViews().AddViewLocalization().AddDataAnnotationsLocalization(); builder.Services.Configure(options => { const string defaultCulture = "en"; var supportedCultures = new[] { new CultureInfo(defaultCulture), new CultureInfo("ar") }; options.DefaultRequestCulture = new RequestCulture(defaultCulture); //options.SupportedCultures = supportedCultures; options.SupportedUICultures = supportedCultures; }); builder.Services.AddScoped(); var _ApplicationInfo = builder.Configuration.GetSection("ApplicationInfo").Get(); string _GetConnStringName = ControllerExtensions.GetConnectionString(builder.Configuration); if (_ApplicationInfo.DBConnectionStringName == ConnectionStrings.connMySQL) { builder.Services.AddDbContextPool(options => options.UseMySql(_GetConnStringName, ServerVersion.AutoDetect(_GetConnStringName))); } else if(_ApplicationInfo.DBConnectionStringName == ConnectionStrings.connPostgreSQL) { builder.Services.AddDbContext(options => options.UseNpgsql(_GetConnStringName)); } else { builder.Services.AddDbContext(options => options.UseSqlServer(_GetConnStringName)); } builder.Services.AddDistributedMemoryCache(); builder.Services.AddSession(options => { options.IdleTimeout = TimeSpan.FromMinutes(60); }); builder.Services.AddAuthentication(IISDefaults.AuthenticationScheme); //Set Identity Options var _IServiceScopeFactory = builder.Services.BuildServiceProvider().GetRequiredService(); var _CreateScope = _IServiceScopeFactory.CreateScope(); var _ServiceProvider = _CreateScope.ServiceProvider; var _context = _ServiceProvider.GetRequiredService(); bool IsDBCanConnect = _context.Database.CanConnect(); if (IsDBCanConnect && _context.DefaultIdentityOptions.Count() > 0) { var _DefaultIdentityOptions = _context.DefaultIdentityOptions.Where(x => x.Id == 1).SingleOrDefault(); AddIdentityOptions.SetOptions(builder.Services, _DefaultIdentityOptions); } else { IConfigurationSection _IConfigurationSection = builder.Configuration.GetSection("IdentityDefaultOptions"); builder.Services.Configure(_IConfigurationSection); var _DefaultIdentityOptions = _IConfigurationSection.Get(); AddIdentityOptions.SetOptions(builder.Services, _DefaultIdentityOptions); } //AddJWTOptions.SetOptions(builder.Services, builder.Configuration); //Get Super Admin Default options builder.Services.Configure(builder.Configuration.GetSection("SuperAdminDefaultOptions")); builder.Services.Configure(builder.Configuration.GetSection("ApplicationInfo")); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddControllers().AddNewtonsoftJson(options => { options.SerializerSettings.ContractResolver = new DefaultContractResolver(); }); builder.Services.AddDataProtection() .SetApplicationName("Business ERP Solution") .AddKeyManagementOptions(options => { options.NewKeyLifetime = new TimeSpan(180, 0, 0, 0); options.AutoGenerateKeys = true; }); builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "Business ERP Solution/Product/POS/Company Management", Version = "v1" }); c.AddSecurityDefinition("BearerAuth", new OpenApiSecurityScheme { Type = SecuritySchemeType.Http, Scheme = JwtBearerDefaults.AuthenticationScheme.ToLowerInvariant(), In = ParameterLocation.Header, Name = "Authorization", BearerFormat = "JWT", Description = "JWT Authorization header using the Bearer scheme." }); c.OperationFilter(); }); builder.Services.AddCors(options => { options.AddPolicy("Open", builder => builder.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod()); }); var app = builder.Build(); if (app.Environment.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseSwagger(); app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "AMS v1")); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseRequestLocalization(app.Services.GetRequiredService>().Value); app.UseHttpsRedirection(); app.UseAuthentication(); app.UseSession(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.UseCors("Open"); app.MapControllerRoute(name: "default", pattern: "{controller=Dashboard}/{action=Index}"); ProgramTaskExtension.SeedingData(app); app.Run();