hrms-api-backend/BMA.EHR.MetaData.Service/Program.cs

180 lines
6.1 KiB
C#
Raw Normal View History

2023-06-05 20:22:51 +07:00
using BMA.EHR.Application;
2023-07-12 21:50:11 +07:00
using BMA.EHR.Domain.Middlewares;
2023-06-05 20:22:51 +07:00
using BMA.EHR.Infrastructure;
2023-06-25 18:36:02 +07:00
using BMA.EHR.Infrastructure.Persistence;
using BMA.EHR.MetaData.Service;
2024-12-21 01:11:42 +07:00
using BMA.EHR.MetaData.Service.Services;
2023-06-25 18:36:02 +07:00
using Microsoft.AspNetCore.Authentication.JwtBearer;
2023-06-05 20:22:51 +07:00
using Microsoft.AspNetCore.Mvc;
2023-06-25 18:36:02 +07:00
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Microsoft.AspNetCore.Mvc.Versioning;
using Microsoft.EntityFrameworkCore;
2023-06-05 20:22:51 +07:00
using Microsoft.IdentityModel.Logging;
using Microsoft.IdentityModel.Tokens;
using Serilog;
using Serilog.Exceptions;
2023-06-25 18:36:02 +07:00
using Serilog.Sinks.Elasticsearch;
using System.Reflection;
using System.Text;
2023-06-05 20:22:51 +07:00
var builder = WebApplication.CreateBuilder(args);
{
2024-12-24 05:14:31 +07:00
var issuer = builder.Configuration["Jwt:Issuer"];
var key = builder.Configuration["Jwt:Key"];
2023-06-05 20:22:51 +07:00
2024-12-24 05:14:31 +07:00
IdentityModelEventSource.ShowPII = true;
2023-06-05 20:22:51 +07:00
2024-12-24 05:14:31 +07:00
builder.Services.AddHttpContextAccessor();
2023-06-05 20:22:51 +07:00
2024-12-24 05:14:31 +07:00
builder.Services.AddApiVersioning(opt =>
{
opt.DefaultApiVersion = new ApiVersion(1, 0);
opt.AssumeDefaultVersionWhenUnspecified = true;
opt.ReportApiVersions = true;
opt.ApiVersionReader = ApiVersionReader.Combine(new UrlSegmentApiVersionReader(),
new HeaderApiVersionReader("x-api-version"),
new MediaTypeApiVersionReader("x-api-version"));
});
2023-06-05 20:22:51 +07:00
2024-12-24 05:14:31 +07:00
builder.Services.AddVersionedApiExplorer(setup =>
{
setup.GroupNameFormat = "'v'VVV";
setup.SubstituteApiVersionInUrl = true;
});
2023-06-05 20:22:51 +07:00
2024-12-24 05:14:31 +07:00
builder.Services.AddEndpointsApiExplorer();
2023-06-05 20:22:51 +07:00
2024-12-24 05:14:31 +07:00
// Authorization
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(opt =>
{
opt.RequireHttpsMetadata = false; //false for dev
opt.Authority = issuer;
opt.TokenValidationParameters = new()
{
ValidateIssuer = true,
ValidateAudience = false,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = issuer,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key))
};
});
2024-12-24 05:14:31 +07:00
builder.Services.AddAuthorization();
2023-06-05 20:22:51 +07:00
2024-12-24 05:14:31 +07:00
// use serilog
ConfigureLogs();
builder.Host.UseSerilog();
2023-06-05 20:22:51 +07:00
2024-12-24 05:14:31 +07:00
// Add config CORS
builder.Services.AddCors(options => options.AddDefaultPolicy(builder =>
{
builder
.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader()
.SetIsOriginAllowedToAllowWildcardSubdomains();
}));
2023-06-05 20:22:51 +07:00
2024-12-24 05:14:31 +07:00
// Add services to the container.
builder.Services.AddApplication();
builder.Services.AddPersistence(builder.Configuration);
2023-06-05 20:22:51 +07:00
2024-12-21 01:11:42 +07:00
builder.Services.AddTransient<HolidayService>();
2024-12-24 05:14:31 +07:00
builder.Services.AddTransient<PositionExecutiveService>();
builder.Services.AddTransient<PositionExecutiveSideService>();
builder.Services.AddTransient<PositionLevelService>();
builder.Services.AddTransient<PositionLineService>();
builder.Services.AddTransient<PositionPathService>();
builder.Services.AddTransient<PositionPathSideService>();
builder.Services.AddTransient<PositionTypeService>();
2024-12-25 10:21:31 +07:00
builder.Services.AddTransient<BloodGroupService>();
builder.Services.AddTransient<EducationLevelService>();
builder.Services.AddTransient<GenderService>();
builder.Services.AddTransient<ProvinceService>();
builder.Services.AddTransient<PrefixService>();
builder.Services.AddTransient<RelationshipService>();
builder.Services.AddTransient<ReligionService>();
2024-12-24 05:14:31 +07:00
builder.Services.AddControllers(options =>
{
options.SuppressAsyncSuffixInActionNames = false;
})
.AddNewtonsoftJson(x => x.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);
builder.Services.AddSwaggerGen();
builder.Services.ConfigureOptions<ConfigureSwaggerOptions>();
builder.Services.AddHealthChecks();
2023-06-05 20:22:51 +07:00
}
var app = builder.Build();
{
2024-12-24 05:14:31 +07:00
var apiVersionDescriptionProvider = app.Services.GetRequiredService<IApiVersionDescriptionProvider>();
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI(options =>
{
foreach (var description in apiVersionDescriptionProvider.ApiVersionDescriptions)
{
options.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json",
description.GroupName.ToUpperInvariant());
}
});
}
app.MapHealthChecks("/health");
2023-06-25 18:48:28 +07:00
app.UseHttpsRedirection();
2024-12-24 05:14:31 +07:00
app.UseCors();
app.UseMiddleware<CombinedErrorHandlerAndLoggingMiddleware>();
2024-12-24 05:14:31 +07:00
app.UseAuthentication();
app.UseAuthorization();
app.UseDefaultFiles();
app.UseStaticFiles();
app.MapControllers();
//app.UseMiddleware<ErrorHandlerMiddleware>();
2023-06-05 20:22:51 +07:00
// apply migrations
await using var scope = app.Services.CreateAsyncScope();
2024-12-24 05:14:31 +07:00
await using var db = scope.ServiceProvider.GetRequiredService<ApplicationDBContext>();
await db.Database.MigrateAsync();
2023-06-05 20:22:51 +07:00
2024-12-24 05:14:31 +07:00
app.Run();
2023-06-05 20:22:51 +07:00
}
void ConfigureLogs()
{
2024-12-24 05:14:31 +07:00
var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile(
$"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json",
optional: true)
.Build();
Log.Logger = new LoggerConfiguration()
.Enrich.FromLogContext()
.MinimumLevel.Error()
.WriteTo.Console()
.Enrich.WithExceptionDetails()
.WriteTo.Elasticsearch(ConfigureElasticSink(configuration, environment ?? ""))
.Enrich.WithProperty("Environment", environment)
.ReadFrom.Configuration(configuration)
.CreateLogger();
2023-06-05 20:22:51 +07:00
}
ElasticsearchSinkOptions ConfigureElasticSink(IConfigurationRoot configuration, string environment)
{
2024-12-24 05:14:31 +07:00
return new ElasticsearchSinkOptions(new Uri(configuration["ElasticConfiguration:Uri"] ?? ""))
{
AutoRegisterTemplate = true,
IndexFormat = $"{Assembly.GetExecutingAssembly()?.GetName()?.Name?.ToLower().Replace(".", "-")}-{environment?.ToLower().Replace(".", "-")}"
};
2023-06-05 20:22:51 +07:00
}