hrms-api-recruit/Program.cs

182 lines
6.2 KiB
C#
Raw Normal View History

2025-03-31 13:10:57 +07:00
using BMA.EHR.Recruit.Service;
using BMA.EHR.Recruit.Service.Core;
using BMA.EHR.Recruit.Service.Data;
using BMA.EHR.Recruit.Service.Services;
using BMA.EHR.Recurit.Service.Data;
using Microsoft.AspNetCore.Authentication.JwtBearer;
2023-03-13 12:29:56 +07:00
using Microsoft.AspNetCore.Mvc;
2025-03-31 13:10:57 +07:00
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Microsoft.AspNetCore.Mvc.Versioning;
using Microsoft.EntityFrameworkCore;
2023-03-13 12:29:56 +07:00
using Microsoft.IdentityModel.Logging;
using Microsoft.IdentityModel.Tokens;
2025-03-31 13:10:57 +07:00
using MongoDB.Bson;
using MongoDB.Bson.Serialization;
using MongoDB.Bson.Serialization.Serializers;
2023-03-13 12:29:56 +07:00
using Serilog;
using Serilog.Exceptions;
2025-03-31 13:10:57 +07:00
using Serilog.Sinks.Elasticsearch;
using System.Reflection;
using System.Text;
2023-03-13 12:29:56 +07:00
var builder = WebApplication.CreateBuilder(args);
var issuer = builder.Configuration["Jwt:Issuer"];
var key = builder.Configuration["Jwt:Key"];
IdentityModelEventSource.ShowPII = true;
builder.Services.AddHttpContextAccessor();
builder.Services.AddApiVersioning(opt =>
{
2023-03-17 14:24:43 +07:00
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-03-13 12:29:56 +07:00
});
builder.Services.AddVersionedApiExplorer(setup =>
{
2023-03-17 14:24:43 +07:00
setup.GroupNameFormat = "'v'VVV";
setup.SubstituteApiVersionInUrl = true;
2023-03-13 12:29:56 +07:00
});
builder.Services.AddEndpointsApiExplorer();
// Authorization
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(opt =>
{
2023-03-17 14:24:43 +07:00
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))
};
2023-03-13 12:29:56 +07:00
});
builder.Services.AddAuthorization();
2023-03-17 14:24:43 +07:00
// Register Services
builder.Services.AddTransient<RecruitService>();
2023-03-25 20:03:27 +07:00
builder.Services.AddTransient<MinIOService>();
2024-08-20 11:28:47 +07:00
builder.Services.AddTransient<PermissionRepository>();
2023-03-17 14:24:43 +07:00
2023-03-13 12:29:56 +07:00
// use serilog
2025-03-31 13:10:57 +07:00
//ConfigureLogs();
//builder.Host.UseSerilog();
2023-03-13 12:29:56 +07:00
BsonSerializer.RegisterSerializer(new GuidSerializer(BsonType.String));
BsonSerializer.RegisterSerializer(new DateTimeSerializer(BsonType.String));
// Register DbContext
2024-12-19 14:16:25 +07:00
var recruitConnection = builder.Configuration.GetConnectionString("RecruitConnection");
2023-03-13 12:29:56 +07:00
builder.Services.AddDbContext<ApplicationDbContext>(options =>
2024-12-19 14:16:25 +07:00
options.UseMySql(recruitConnection, ServerVersion.AutoDetect(recruitConnection)), ServiceLifetime.Transient);
2025-01-05 21:59:00 +07:00
var orgConnection = builder.Configuration.GetConnectionString("OrgConnection");
builder.Services.AddDbContext<OrgDbContext>(options =>
options.UseMySql(orgConnection, ServerVersion.AutoDetect(orgConnection)), ServiceLifetime.Transient);
2024-12-19 14:16:25 +07:00
var defaultConnection = builder.Configuration.GetConnectionString("DefaultConnection");
2023-05-13 03:51:18 +07:00
builder.Services.AddDbContext<MetadataDbContext>(options =>
2024-12-19 14:16:25 +07:00
options.UseMySql(defaultConnection, ServerVersion.AutoDetect(defaultConnection)), ServiceLifetime.Transient);
2023-03-13 12:29:56 +07:00
// Add config CORS
builder.Services.AddCors(options => options.AddDefaultPolicy(builder =>
{
2023-03-17 14:24:43 +07:00
builder
.AllowAnyOrigin()
//.WithOrigins("http://localhost:8000")
.AllowAnyMethod()
.AllowAnyHeader()
.SetIsOriginAllowedToAllowWildcardSubdomains();
2023-03-13 12:29:56 +07:00
}));
// Add services to the container.
builder.Services.AddControllers(options =>
{
2023-03-17 14:24:43 +07:00
options.SuppressAsyncSuffixInActionNames = false;
2023-03-13 12:29:56 +07:00
})
.AddNewtonsoftJson(x => x.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);
builder.Services.AddSwaggerGen();
builder.Services.ConfigureOptions<ConfigureSwaggerOptions>();
builder.Services.AddHealthChecks();
// Register Service
2023-03-24 14:24:35 +07:00
builder.Services.AddTransient<RecruitService>();
builder.Services.AddTransient<MinIOService>();
2023-03-13 12:29:56 +07:00
var app = builder.Build();
var apiVersionDescriptionProvider = app.Services.GetRequiredService<IApiVersionDescriptionProvider>();
if (app.Environment.IsDevelopment())
{
2023-03-17 14:24:43 +07:00
app.UseSwagger();
app.UseSwaggerUI(options =>
{
foreach (var description in apiVersionDescriptionProvider.ApiVersionDescriptions)
{
options.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json",
description.GroupName.ToUpperInvariant());
}
});
2023-03-13 12:29:56 +07:00
}
app.MapHealthChecks("/health");
app.UseHttpsRedirection();
app.UseCors();
app.UseAuthentication();
app.UseAuthorization();
app.UseDefaultFiles();
app.UseStaticFiles();
app.MapControllers();
2025-03-31 13:10:57 +07:00
app.UseMiddleware<RequestLoggingMiddleware>();
2023-03-13 12:29:56 +07:00
// apply migrations
await using var scope = app.Services.CreateAsyncScope();
await using var db = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
await db.Database.MigrateAsync();
// seed default data
app.Run();
void ConfigureLogs()
{
2023-03-17 14:24:43 +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()
// .WriteTo.Debug()
.MinimumLevel.Error()
.WriteTo.Console()
.Enrich.WithExceptionDetails()
// .Enrich.WithEnvironmentUserName()
.WriteTo.Elasticsearch(ConfigureElasticSink(configuration, environment ?? ""))
.Enrich.WithProperty("Environment", environment)
.ReadFrom.Configuration(configuration)
.CreateLogger();
2023-03-13 12:29:56 +07:00
}
ElasticsearchSinkOptions ConfigureElasticSink(IConfigurationRoot configuration, string environment)
{
2023-03-17 14:24:43 +07:00
return new ElasticsearchSinkOptions(new Uri(configuration["ElasticConfiguration:Uri"] ?? ""))
{
AutoRegisterTemplate = true,
IndexFormat = $"{Assembly.GetExecutingAssembly()?.GetName()?.Name?.ToLower().Replace(".", "-")}-{environment?.ToLower().Replace(".", "-")}"
};
2023-03-13 12:29:56 +07:00
}