subject_key => policy_id. * * @var array>> */ private array $policyIdIndex = []; public function resolve( Tenant $tenant, string $policyType, string $subjectKey, ?string $observedAt, ): ?int { $tenantId = (int) $tenant->getKey(); $policyType = trim($policyType); $subjectKey = trim($subjectKey); if ($tenantId <= 0 || $policyType === '' || $subjectKey === '') { return null; } $observedAtCarbon = $this->parseObservedAt($observedAt); if (! $observedAtCarbon instanceof CarbonImmutable) { return null; } $policyId = $this->resolvePolicyId($tenantId, $policyType, $subjectKey); if ($policyId === null) { return null; } $rangeStart = $observedAtCarbon; $rangeEnd = $observedAtCarbon->addSecond(); $versionId = PolicyVersion::query() ->where('tenant_id', $tenantId) ->where('policy_id', $policyId) ->whereNull('deleted_at') ->where('captured_at', '>=', $rangeStart) ->where('captured_at', '<', $rangeEnd) ->orderByDesc('captured_at') ->orderByDesc('version_number') ->orderByDesc('id') ->value('id'); return is_numeric($versionId) ? (int) $versionId : null; } private function parseObservedAt(?string $observedAt): ?CarbonImmutable { if (! is_string($observedAt)) { return null; } $observedAt = trim($observedAt); if ($observedAt === '') { return null; } try { return CarbonImmutable::parse($observedAt); } catch (Throwable) { return null; } } private function resolvePolicyId(int $tenantId, string $policyType, string $subjectKey): ?int { if (! array_key_exists($tenantId, $this->policyIdIndex) || ! array_key_exists($policyType, $this->policyIdIndex[$tenantId])) { $this->policyIdIndex[$tenantId][$policyType] = $this->buildIndex($tenantId, $policyType); } $policyId = $this->policyIdIndex[$tenantId][$policyType][$subjectKey] ?? null; return is_numeric($policyId) ? (int) $policyId : null; } /** * Build a subject_key => policy_id map for a given tenant + policy_type. * * If multiple policies map to the same subject_key, that key is treated as ambiguous and excluded. * * @return array */ private function buildIndex(int $tenantId, string $policyType): array { $policies = Policy::query() ->where('tenant_id', $tenantId) ->where('policy_type', $policyType) ->get(['id', 'display_name']); /** @var array $index */ $index = []; /** @var array $ambiguous */ $ambiguous = []; foreach ($policies as $policy) { if (! $policy instanceof Policy) { continue; } $key = BaselineSubjectKey::fromDisplayName($policy->display_name); if ($key === null) { continue; } if (array_key_exists($key, $index)) { $ambiguous[$key] = true; continue; } $index[$key] = (int) $policy->getKey(); } foreach (array_keys($ambiguous) as $key) { unset($index[$key]); } return $index; } }