practicekea_backend/microservices/teacher/Startup.cs

267 lines
10 KiB
C#
Raw Normal View History

2024-12-02 13:24:34 +00:00
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using AutoMapper;
using FluentValidation.AspNetCore;
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.Extensions.PlatformAbstractions;
using Microsoft.IdentityModel.Tokens;
using OnlineAssessment.Common;
using OnlineAssessment.Data;
using OnlineAssessment.Data.EFCore;
using Swashbuckle.AspNetCore.SwaggerGen;
using FirebaseAdmin;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Services;
namespace OnlineAssessment
{
public class Startup
{
public IConfiguration Configuration { get; }
public Startup(IConfiguration configuration, IWebHostEnvironment env)
{
//Getting Response Messages From Config File (appresponsemessages.json)
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;
}
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"
});
*/
// Enable middleware to serve generated Swagger as a JSON endpoint.
app.UseSwagger();
// Enable middleware to serve swagger-ui
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());
}
});
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseCors();
app.UseAuthentication();
app.UseAuthorization();
app.UseMiddleware(typeof(ErrorHandlingMiddleware));
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
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);
//
services
.AddScoped<EfCoreCommonRepository>()
.AddScoped<EFCoreInstituteRepository>()
.AddScoped<EFCoreQuestionRepository>()
.AddScoped<EFCoreExamRepository>()
.AddScoped<EFCorePracticeRepository>();
//
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<Startup>())
.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<IConfigureOptions<SwaggerGenOptions>, SwaggerConfigureOptions>();
services.AddSwaggerGen(
options =>
{
// add a custom operation filter which sets default values
options.OperationFilter<SwaggerDefaultValues>();
// integrate xml comments
options.IncludeXmlComments(XmlCommentsFilePath);
});
//
services.AddSingleton(Configuration.GetSection("ResponseMessage").Get<ResponseMessage>());
services.Configure<ResponseMessage>((setting) =>
{
Configuration.GetSection("ResponseMessage").Bind(setting);
});
services.Configure<ApiBehaviorOptions>(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)
)
));
});
}
static string XmlCommentsFilePath
{
get
{
var basePath = PlatformServices.Default.Application.ApplicationBasePath;
var fileName = typeof(Startup).GetTypeInfo().Assembly.GetName().Name + ".xml";
return Path.Combine(basePath, fileName);
}
}
}
}