using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using ReZero.SuperAPI; using System; using System.Collections.Generic; using System.IdentityModel.Tokens.Jwt; using System.Linq; using System.Security.Claims; using System.Text; namespace ReZero.DependencyInjection { public class DependencyResolver { public static ServiceProvider Provider { get => ServiceLocator.Services!.BuildServiceProvider(); } public static IHttpContextAccessor? httpContextAccessor = null; public static ILogger? logger = null; public static T GetService() where T : class { return Provider!.GetService(); } public static ILogger GetLogger() { if (logger == null) { logger = ReZero.DependencyInjection.DependencyResolver.GetService>(); } return logger; } public static ClaimsPrincipal GetClaims() { if (httpContextAccessor == null) { if (Provider!.GetService()?.HttpContext == null) { throw new Exception("Requires builder.Services.AddHttpContextAccessor()"); } httpContextAccessor = Provider!.GetService(); } HttpContext httpContext = httpContextAccessor!.HttpContext; var authHeader = httpContext.Request.Headers["Authorization"].FirstOrDefault(); if (authHeader != null && authHeader.StartsWith("Bearer ")) { var token = authHeader.Substring("Bearer ".Length).Trim(); var handler = new JwtSecurityTokenHandler(); try { var jwtToken = handler.ReadJwtToken(token); var claimsPrincipal = new ClaimsPrincipal(new ClaimsIdentity(jwtToken.Claims)); return claimsPrincipal; } catch (Exception) { // Handle token parsing error return null; } } return null; } public static T GetHttpContextService() where T : class { if (httpContextAccessor == null) { if (Provider!.GetService()?.HttpContext == null) { throw new Exception("Requires builder.Services.AddHttpContextAccessor()"); } httpContextAccessor = Provider!.GetService(); } return httpContextAccessor!.HttpContext!.RequestServices!.GetService(); } public static T GetHttpContextRequiredService() where T : class { if (httpContextAccessor == null) { if (Provider!.GetService()?.HttpContext == null) { throw new Exception("Requires builder.Services.AddHttpContextAccessor()"); } httpContextAccessor = Provider!.GetService(); } return httpContextAccessor!.HttpContext!.RequestServices!.GetRequiredService(); } public static T GetRequiredService() where T : class { return Provider?.GetRequiredService(); } public static T GetNewService() where T : class { using var scope = Provider?.CreateScope(); return scope?.ServiceProvider?.GetService(); } public static T GetNewRequiredService() where T : class { using var scope = Provider?.CreateScope(); return scope?.ServiceProvider?.GetRequiredService(); } public static string GetLoggedInUser() { var claimsPrincipal = GetClaims(); if (claimsPrincipal == null) { return null; } var usernameClaim = claimsPrincipal.Claims.FirstOrDefault(c => c.Type == "unique_name"); if (usernameClaim == null) { return null; } return usernameClaim.Value; ; } } }