<?php
namespace App\Manager;
use App\Models\Heimdall\Metadata;
use Psr\Log\LoggerInterface;
class ConfigurationManager implements ConfigurationManagerInterface
{
private LoggerInterface $logger;
private HeimdallManager $heimdallManager;
private string $defaultIdp;
public function __construct(LoggerInterface $logger, HeimdallManager $heimdallManager, string $defaultIdp)
{
$this->logger = $logger;
$this->heimdallManager = $heimdallManager;
$this->defaultIdp = $defaultIdp;
}
public function getRealm(string $domainName): Metadata
{
$defaultRealmMetadata = (new Metadata())
->setKey('realm')
->setValue($this->defaultIdp)
;
[$contracts] = $this->heimdallManager->getContracts(1, 2, '', ['contractUrl'], [$domainName]);
$countContracts = \count($contracts);
switch ($countContracts) {
case '0':
$this->logger->info('Use default idp "{defaultIdp}" for domain name "{domainName}".', [
'defaultIdp' => $this->defaultIdp,
'domainName' => $domainName,
]);
return $defaultRealmMetadata;
case '1':
$contractId = $contracts[0]['id'];
$contractMetadata = $contracts[0]['contractMetadatas'];
// applies filter on metadata list to only get "realm" property
$filteredRealmMetadata = \array_filter(
$contractMetadata,
static fn (array $metadatum): bool => 'realm' === $metadatum['key'],
);
if (empty($filteredRealmMetadata)) {
$this->logger->info('Realm not found for contract "{contract}".', [
'contract' => $contractId,
'domainName' => $domainName,
]);
return $defaultRealmMetadata;
}
if (1 < \count($filteredRealmMetadata)) {
$this->logger->error($msg = \sprintf(
'Found more than a single realm metadata for the contract "%s", expected only one. List of realms "%s".',
$contractId,
\implode(', ', \array_column($filteredRealmMetadata, 'value')),
), ['domainName' => $domainName]);
throw new \LengthException($msg);
}
return (new Metadata())
->setKey('realm')
->setValue(\array_shift($filteredRealmMetadata)['value'])
;
default:
$this->logger->error($msg = \sprintf(
'Too many contracts found (%s), expected only one.',
$countContracts,
), ['domainName' => $domainName, 'contractsId' => \array_column($contracts, 'id')]);
throw new \LengthException($msg);
}
}
}