using System.Security.Claims; using DXPBLL.Auth; namespace DXPSL.Common; // Everything a DXP endpoint (or DXPHub) knows about the caller, taken ONLY from validated JWT // claims (HttpContext.User.Claims after JWT bearer middleware verifies the signature) — never // from request body/headers/hub-method parameters. See Part 2 of the DXP plan and // DXPBLL.Auth.DXPClaimTypes. public class DXPCallerContext { public int DxpUserId { get; set; } public int DxpPartyId { get; set; } public int TenantId { get; set; } public string DatabaseName { get; set; } = string.Empty; public byte DatabaseType { get; set; } public int LocalPartyId { get; set; } public string RoleCode { get; set; } = string.Empty; // Shared by DXPBaseEndpoint.GetCaller() and DXPHub's connection lifecycle so both parse the // exact same claim set the exact same way. public static DXPCallerContext FromClaims(IEnumerable claims) { var dict = claims.ToDictionary(c => c.Type, c => c.Value); int GetInt(string key) => dict.TryGetValue(key, out var v) && int.TryParse(v, out var i) ? i : 0; byte GetByte(string key) => dict.TryGetValue(key, out var v) && byte.TryParse(v, out var b) ? b : (byte)0; string GetStr(string key) => dict.TryGetValue(key, out var v) ? v : string.Empty; return new DXPCallerContext { DxpUserId = GetInt(DXPClaimTypes.DxpUserId), DxpPartyId = GetInt(DXPClaimTypes.DxpPartyId), TenantId = GetInt(DXPClaimTypes.TenantId), DatabaseName = GetStr(DXPClaimTypes.DatabaseName), DatabaseType = GetByte(DXPClaimTypes.DatabaseType), LocalPartyId = GetInt(DXPClaimTypes.LocalPartyId), RoleCode = GetStr(DXPClaimTypes.RoleCode) }; } }