using ColaFlow.Modules.Identity.Domain.Aggregates.Tenants; using Microsoft.AspNetCore.Http; namespace ColaFlow.Modules.Identity.Infrastructure.Services; /// /// Tenant context implementation (Scoped lifetime - one instance per request) /// public class TenantContext : ITenantContext { private readonly IHttpContextAccessor _httpContextAccessor; private TenantId? _tenantId; private string? _tenantSlug; public TenantContext(IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor; InitializeFromHttpContext(); } public TenantId? TenantId => _tenantId; public string? TenantSlug => _tenantSlug; public bool IsSet => _tenantId != null; public void SetTenant(TenantId tenantId, string tenantSlug) { _tenantId = tenantId; _tenantSlug = tenantSlug; } public void Clear() { _tenantId = null; _tenantSlug = null; } /// /// Initialize from HTTP Context (extract tenant info from JWT Claims) /// private void InitializeFromHttpContext() { var httpContext = _httpContextAccessor.HttpContext; if (httpContext?.User?.Identity?.IsAuthenticated == true) { // Extract tenant_id from JWT Claims var tenantIdClaim = httpContext.User.FindFirst("tenant_id"); var tenantSlugClaim = httpContext.User.FindFirst("tenant_slug"); if (tenantIdClaim != null && Guid.TryParse(tenantIdClaim.Value, out var tenantIdGuid)) { _tenantId = TenantId.Create(tenantIdGuid); _tenantSlug = tenantSlugClaim?.Value; } } } }