namespace PostFundManagement.Application.Extensions; public static class General { public static string Clean(this string input) => Patterns.SpaceRegex().Replace(input, string.Empty); public static string ToJson(this TValue obj) where TValue : class => JsonSerializer.Serialize(obj); public static TValue FromJson(this string json) where TValue : class => JsonSerializer.Deserialize(json)!; public static Guid GetUserId(this HttpContext context) => (Guid)context.Items[Domain.Extensions.Constants.UserIdItemKey]!; public static string GetUserEmail(this HttpContext context) => (string)context.Items[Domain.Extensions.Constants.EmailtemKey]!; public static string GetUserRole(this HttpContext context) => (string)context.Items[Domain.Extensions.Constants.UserRoleItemKey]!; public static (bool Decoded, Guid userId) GetUserId(this ClaimsPrincipal principal) { var subClaim = principal.FindFirst(JwtRegisteredClaimNames.Sub)?.Value ?? principal.FindFirst(ClaimTypes.NameIdentifier)?.Value; var decoded = Guid.TryParse(subClaim, out var userId); return (decoded, userId); } public static (bool Decoded, string email) GetUserEmail(this ClaimsPrincipal principal) { var emailClaim = principal.FindFirst("email")?.Value ?? principal.FindFirst(ClaimTypes.Email)?.Value ?? principal.FindFirst("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/emailaddress")?.Value ?? principal.FindFirst("preferred_username")?.Value ?? principal.FindFirst("name")?.Value ?? principal.FindFirst(ClaimTypes.Name)?.Value; var decoded = !string.IsNullOrWhiteSpace(emailClaim); return (decoded, emailClaim ?? string.Empty); } public static (bool Decoded, string role) GetUserRole(this ClaimsPrincipal principal) { var roleClaims = principal.FindAll("role") .Concat(principal.FindAll(ClaimTypes.Role)) .Concat(principal.FindAll("http://schemas.microsoft.com/ws/2008/06/identity/claims/role")) .Concat(principal.FindAll("roles")) .Select(c => c.Value) .Where(v => !string.IsNullOrWhiteSpace(v)) .ToList(); var partnerRole = roleClaims.FirstOrDefault(r => r.Equals("Partner", StringComparison.OrdinalIgnoreCase)); var role = partnerRole ?? roleClaims.FirstOrDefault(); var decoded = !string.IsNullOrWhiteSpace(role); return (decoded, role ?? string.Empty); } public static Microsoft.AspNetCore.Mvc.ProblemDetails ToProblems(this IReadOnlyList errors, int statusCode = StatusCodes.Status400BadRequest) => new() { Detail = string.Join(',', errors.Select(e => e.Message)), Status = statusCode, Title = "Error", }; }