using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.IdentityModel.Tokens; using skydiveLogs_api.DomainBusiness.Interfaces; using skydiveLogs_api.Ioc; using skydiveLogs_api.Settings; using System.IO; using System.Linq; using System.Text; namespace skydiveLogs_api { public class Startup { #region Public Constructors public Startup(IConfiguration configuration) { Configuration = configuration; } #endregion Public Constructors #region Public Methods // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.EnvironmentName == "Development") { app.UseDeveloperExceptionPage(); } else { // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseCors(); app.UseAuthentication(); app.UseMvc(); } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddMvc(options => { options.EnableEndpointRouting = false; }); services.AddHttpContextAccessor(); // JWT var jwtSection = Configuration.GetSection("JWT"); services.Configure(jwtSection); var jwtSettings = new JwtSettings(); jwtSection.Bind(jwtSettings); services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.SaveToken = true; options.TokenValidationParameters = new TokenValidationParameters() { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = jwtSettings.Issuer, ValidAudience = jwtSettings.Issuer, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.Passphrase)) }; }); // CORS var corsSettings = new CorsSettings(); Configuration.GetSection("Cors").Bind(corsSettings); services.AddCors(options => { options.AddDefaultPolicy( builder => { builder.WithOrigins(corsSettings.FrontUrl) .AllowAnyHeader() .AllowAnyMethod(); }); }); // IoC var iocService = new IocService(services, Configuration); iocService.Configure(); // AutoMapper services.AddAutoMapper(typeof(Mapper.ModelProfile)); CheckAndInitDb(services); } #endregion Public Methods #region Private Methods private void CheckAndInitDb(IServiceCollection services) { string connectionString = Configuration.GetConnectionString("DefaultConnection"); var dictionary = connectionString.Split(';') .Select(part => part.Split('=')) .Where(part => part.Length == 2) .ToDictionary(sp => sp[0], sp => sp[1]); string dbFile = dictionary["Filename"]; //connectionString.Replace("Filename=", string.Empty); var serviceProvider = services.BuildServiceProvider(); var initDbService = serviceProvider.GetRequiredService(); if (!File.Exists(dbFile)) initDbService.GenerateDb(); else initDbService.Update(); } #endregion Private Methods #region Public Properties public IConfiguration Configuration { get; } #endregion Public Properties } }