using Microsoft.AspNetCore.Mvc; using System.Security.Claims; namespace EnvelopeGenerator.GeneratorAPI.Controllers { /// /// Provides extension methods for extracting user information from a . /// public static class ControllerExtensions { /// /// Attempts to retrieve the user's ID from the claims. Returns null if the ID is not found or invalid. /// /// The representing the user. /// The user's ID as an integer, or null if not found or invalid. public static int? GetIdOrDefault(this ClaimsPrincipal user) => int.TryParse(user.FindFirstValue(ClaimTypes.NameIdentifier) ?? user.FindFirstValue("sub"), out int result) ? result : null; /// /// Retrieves the user's ID from the claims. Throws an exception if the ID is missing or invalid. /// /// The representing the user. /// The user's ID as an integer. /// Thrown if the user ID claim is missing or invalid. public static int GetId(this ClaimsPrincipal user) => user.GetIdOrDefault() ?? throw new InvalidOperationException("User ID claim is missing or invalid. This may indicate a misconfigured or forged JWT token."); /// /// Retrieves the username from the claims, if available. /// /// The representing the user. /// The username as a string, or null if not found. public static string? GetUsernameOrDefault(this ClaimsPrincipal user) => user.FindFirst(ClaimTypes.Name)?.Value; /// /// Retrieves the user's surname (last name) from the claims, if available. /// /// The representing the user. /// The surname as a string, or null if not found. public static string? GetNameOrDefault(this ClaimsPrincipal user) => user.FindFirst(ClaimTypes.Surname)?.Value; /// /// Retrieves the user's given name (first name) from the claims, if available. /// /// The representing the user. /// The given name as a string, or null if not found. public static string? GetPrenameOrDefault(this ClaimsPrincipal user) => user.FindFirst(ClaimTypes.GivenName)?.Value; /// /// Retrieves the user's email address from the claims, if available. /// /// The representing the user. /// The email address as a string, or null if not found. public static string? GetEmailOrDefault(this ClaimsPrincipal user) => user.FindFirst(ClaimTypes.Email)?.Value; } }