SubdomainAvailabilityProvider.php 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. <?php
  2. namespace App\State\Provider\Organization\Subdomain;
  3. use ApiPlatform\Metadata\GetCollection;
  4. use ApiPlatform\Metadata\Operation;
  5. use ApiPlatform\State\ProviderInterface;
  6. use App\ApiResources\Organization\Subdomain\SubdomainAvailability;
  7. use App\Service\File\Exception\FileNotFoundException;
  8. use App\Service\Typo3\SubdomainService;
  9. use Symfony\Component\HttpFoundation\Response;
  10. /**
  11. * Custom provider permettant de tester la disponibilité d'un sous-domaine.
  12. */
  13. final class SubdomainAvailabilityProvider implements ProviderInterface
  14. {
  15. public function __construct(
  16. private readonly SubdomainService $subdomainService,
  17. ) {
  18. }
  19. /**
  20. * @param array<mixed> $uriVariables
  21. * @param array<mixed> $context
  22. *
  23. * @throws FileNotFoundException
  24. */
  25. public function provide(Operation $operation, array $uriVariables = [], array $context = []): ?SubdomainAvailability
  26. {
  27. if ($operation instanceof GetCollection) {
  28. throw new \RuntimeException('not supported', Response::HTTP_METHOD_NOT_ALLOWED);
  29. }
  30. $filters = $context['filters'] ?? [];
  31. $subdomain = $filters['subdomain'] ?? null;
  32. if ($subdomain === null) {
  33. throw new \RuntimeException('missing parameter: subdomain', Response::HTTP_BAD_REQUEST);
  34. }
  35. $available =
  36. !$this->subdomainService->isRegistered($subdomain)
  37. && !$this->subdomainService->isReservedSubdomain($subdomain);
  38. $subdomainAvailability = new SubdomainAvailability();
  39. $subdomainAvailability->setSubdomain($subdomain);
  40. $subdomainAvailability->setAvailable($available);
  41. return $subdomainAvailability;
  42. }
  43. }