using System.IO; using System.Linq; using System.Text; using AutoMapper; using FirebaseAdmin; using FluentValidation.AspNetCore; using Google.Apis.Auth.OAuth2; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.ApiExplorer; using Microsoft.AspNetCore.Mvc.Versioning; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Options; using Microsoft.IdentityModel.Tokens; using OnlineAssessment.Common; using OnlineAssessment.Data; using OnlineAssessment.Data.EFCore; using Swashbuckle.AspNetCore.SwaggerGen; namespace OnlineAssessment { public class Startup { public IConfiguration Configuration { get; } //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // Start up //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx public Startup(IConfiguration configuration, IWebHostEnvironment env) { dynamic builder; if (env.EnvironmentName.Equals("Development")) { builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.Development.json", optional: true, reloadOnChange: true) .AddJsonFile("appresponsemessages.json", optional: false, reloadOnChange: true) .AddEnvironmentVariables(); } else { builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile("appresponsemessages.json", optional: false, reloadOnChange: true) .AddEnvironmentVariables(); } configuration = builder.Build(); Configuration = configuration; } //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IApiVersionDescriptionProvider provider) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } /* app.UseStaticFiles(); app.UseStaticFiles(new StaticFileOptions() { FileProvider = new PhysicalFileProvider( Path.Combine(Directory.GetCurrentDirectory(), "Content")), RequestPath = "/Content" }); */ app.UseSwagger(); app.UseSwaggerUI( options => { options.InjectStylesheet("/Content/custom.css"); // build a swagger endpoint for each discovered API version foreach (var description in provider.ApiVersionDescriptions) { options.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json", description.GroupName.ToUpperInvariant()); } }); app.UseRouting(); app.UseCors(); app.UseAuthentication(); app.UseAuthorization(); app.UseMiddleware(typeof(ErrorHandlingMiddleware)); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx // This method gets called by the runtime. Use this method to add services to the container. //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx public void ConfigureServices(IServiceCollection services) { //Firebase FirebaseApp.Create(new AppOptions { Credential = GoogleCredential.FromFile(@"Firebase/practice-kea-7cb5b-firebase-adminsdk-e4h19-6e05200a3f.json") }); services.AddAutoMapper(typeof(AutoMapping)); //------------------------------------------------------------------------------------ // services.AddDbConnections(Configuration); //------------------------------------------------------------------------------------ // Adding below services, it makes them available within the application via dependency injection services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); //------------------------------------------------------------------------------------ // //------------------------------------------------------------------------------------ services.AddCors(o => o.AddPolicy("OdiwarePolicy", builder => { builder.AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader() //.AllowCredentials() .Build(); })); //------------------------------------------------------------------------------------ // //------------------------------------------------------------------------------------ //Firebase services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Authority = "https://securetoken.google.com/practice-kea-7cb5b"; options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidIssuer = "https://securetoken.google.com/practice-kea-7cb5b", ValidateAudience = true, ValidAudience = "practice-kea-7cb5b", ValidateLifetime = true, ValidateIssuerSigningKey = true }; }); /* services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = false, ValidateAudience = false, ValidateLifetime = true, ValidateIssuerSigningKey = true, //ValidIssuer = Configuration["Jwt:Issuer"], //ValidAudience = Configuration["Jwt:Issuer"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:Key"])) }; }); */ //------------------------------------------------------------------------------------ // //------------------------------------------------------------------------------------ services.AddControllers() .AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining()) .AddNewtonsoftJson(option => option.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore); //------------------------------------------------------------------------------------ // //------------------------------------------------------------------------------------ services.AddApiVersioning( options => { // reporting api versions will return the headers "api-supported-versions" and "api-deprecated-versions" //options.ReportApiVersions = true; // Specify the default API Version as 1.0 options.DefaultApiVersion = new ApiVersion(1, 0); // If the client hasn't specified the API version in the request, use the default API version number options.AssumeDefaultVersionWhenUnspecified = true; // Advertise the API versions supported for the particular endpoint // Reporting api versions will return the headers "api-supported-versions" and "api-deprecated-versions" options.ReportApiVersions = true; // Supporting multiple versioning scheme //config.ApiVersionReader = ApiVersionReader.Combine(new HeaderApiVersionReader("X-version"), new QueryStringApiVersionReader("api-version")); options.ApiVersionReader = ApiVersionReader.Combine(new HeaderApiVersionReader("X-version")); }); //------------------------------------------------------------------------------------ // //------------------------------------------------------------------------------------ services.AddVersionedApiExplorer( options => { // add the versioned api explorer, which also adds IApiVersionDescriptionProvider service // note: the specified format code will format the version as "'v'major[.minor][-status]" options.GroupNameFormat = "'v'VVV"; // note: this option is only necessary when versioning by url segment. the SubstitutionFormat // can also be used to control the format of the API version in route templates options.SubstituteApiVersionInUrl = true; }); //------------------------------------------------------------------------------------ // //------------------------------------------------------------------------------------ services.AddTransient, SwaggerConfigurationOptions>(); services.AddSwaggerGen( options => { // add a custom operation filter which sets default values options.OperationFilter(); // integrate xml comments //options.IncludeXmlComments(XmlCommentsFilePath); }); //------------------------------------------------------------------------------------ // //------------------------------------------------------------------------------------ services.AddSingleton(Configuration.GetSection("ResponseMessage").Get()); services.Configure((setting) => { Configuration.GetSection("ResponseMessage").Bind(setting); }); services.Configure(a => a.InvalidModelStateResponseFactory = actionContext => { return new BadRequestObjectResult(new ReturnResponse(string.Empty, new ReturnStatus( "-1", actionContext.ModelState.Values.SelectMany(x => x.Errors) .Select(x => x.ErrorMessage) ) )); }); } } }