using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Nest;
using System.Diagnostics;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text.Encodings.Web;
using System.Text.Json;
using JsonSerializer = System.Text.Json.JsonSerializer;
namespace BMA.EHR.Recruit.Service.Core
{
public class RequestLoggingMiddleware
{
private readonly RequestDelegate _next;
private readonly IConfiguration _configuration;
private string Uri = "";
private string IndexFormat = "";
private string SystemName = "";
public RequestLoggingMiddleware(RequestDelegate next, IConfiguration configuration)
{
_next = next;
_configuration = configuration;
Uri = _configuration["ElasticConfiguration:Uri"] ?? "http://192.168.1.40:9200";
IndexFormat = _configuration["ElasticConfiguration:IndexFormat"] ?? "bma-ehr-log-index";
SystemName = "recruiting";
}
///
/// แกะ JWT token เพื่อดึง claims ต่างๆ
///
private JwtSecurityToken? ParseToken(string token)
{
try
{
var tokenHandler = new JwtSecurityTokenHandler();
var jwtToken = tokenHandler.ReadJwtToken(token.Replace("Bearer ", ""));
return jwtToken;
}
catch
{
return null;
}
}
///
/// ดึงค่า claim จาก token โดยลองชื่อหลายแบบ
///
private string? GetClaimValue(JwtSecurityToken? token, params string[] claimNames)
{
if (token == null) return null;
foreach (var name in claimNames)
{
var claim = token.Claims.FirstOrDefault(c => c.Type == name);
if (claim != null)
return claim.Value;
}
return null;
}
///
/// ดึงค่า Guid claim จาก token
///
private Guid? GetGuidClaim(JwtSecurityToken? token, params string[] claimNames)
{
var value = GetClaimValue(token, claimNames);
if (Guid.TryParse(value, out var guid))
return guid;
return null;
}
public async Task Invoke(HttpContext context)
{
var settings = new ConnectionSettings(new Uri(Uri))
.DefaultIndex(IndexFormat);
var client = new ElasticClient(settings);
var startTime = DateTime.UtcNow;
var stopwatch = Stopwatch.StartNew();
string? responseBodyJson = null;
string? requestBodyJson = null;
string requestBody = await ReadRequestBodyAsync(context);
if (requestBody != "")
{
if (context.Request.HasFormContentType)
{
var form = await context.Request.ReadFormAsync();
var formData = new Dictionary();
foreach (var field in form)
{
formData[field.Key] = field.Value.ToString();
}
if (form.Files.Count > 0)
{
var fileDataList = new List