src/Manager/ConfigurationManager.php line 21

Open in your IDE?
  1. <?php
  2. namespace App\Manager;
  3. use App\Models\Heimdall\Metadata;
  4. use Psr\Log\LoggerInterface;
  5. class ConfigurationManager implements ConfigurationManagerInterface
  6. {
  7.     private LoggerInterface $logger;
  8.     private HeimdallManager $heimdallManager;
  9.     private string $defaultIdp;
  10.     public function __construct(LoggerInterface $loggerHeimdallManager $heimdallManagerstring $defaultIdp)
  11.     {
  12.         $this->logger $logger;
  13.         $this->heimdallManager $heimdallManager;
  14.         $this->defaultIdp $defaultIdp;
  15.     }
  16.     public function getRealm(string $domainName): Metadata
  17.     {
  18.         $defaultRealmMetadata = (new Metadata())
  19.             ->setKey('realm')
  20.             ->setValue($this->defaultIdp)
  21.         ;
  22.         [$contracts] = $this->heimdallManager->getContracts(12'', ['contractUrl'], [$domainName]);
  23.         $countContracts = \count($contracts);
  24.         switch ($countContracts) {
  25.             case '0':
  26.                 $this->logger->info('Use default idp "{defaultIdp}" for domain name "{domainName}".', [
  27.                     'defaultIdp' => $this->defaultIdp,
  28.                     'domainName' => $domainName,
  29.                 ]);
  30.                 return $defaultRealmMetadata;
  31.             case '1':
  32.                 $contractId $contracts[0]['id'];
  33.                 $contractMetadata $contracts[0]['contractMetadatas'];
  34.                 // applies filter on metadata list to only get "realm" property
  35.                 $filteredRealmMetadata = \array_filter(
  36.                     $contractMetadata,
  37.                     static fn (array $metadatum): bool => 'realm' === $metadatum['key'],
  38.                 );
  39.                 if (empty($filteredRealmMetadata)) {
  40.                     $this->logger->info('Realm not found for contract "{contract}".', [
  41.                         'contract' => $contractId,
  42.                         'domainName' => $domainName,
  43.                     ]);
  44.                     return $defaultRealmMetadata;
  45.                 }
  46.                 if (< \count($filteredRealmMetadata)) {
  47.                     $this->logger->error($msg = \sprintf(
  48.                         'Found more than a single realm metadata for the contract "%s", expected only one. List of realms "%s".',
  49.                         $contractId,
  50.                         \implode(', ', \array_column($filteredRealmMetadata'value')),
  51.                     ), ['domainName' => $domainName]);
  52.                     throw new \LengthException($msg);
  53.                 }
  54.                 return (new Metadata())
  55.                     ->setKey('realm')
  56.                     ->setValue(\array_shift($filteredRealmMetadata)['value'])
  57.                 ;
  58.             default:
  59.                 $this->logger->error($msg = \sprintf(
  60.                     'Too many contracts found (%s), expected only one.',
  61.                     $countContracts,
  62.                 ), ['domainName' => $domainName'contractsId' => \array_column($contracts'id')]);
  63.                 throw new \LengthException($msg);
  64.         }
  65.     }
  66. }