feat: implement OpenProvider

This commit is contained in:
Maël Gangloff
2025-10-27 23:36:48 +01:00
parent aff37f7a81
commit fee3f3af44
8 changed files with 150 additions and 22 deletions

View File

@@ -5,14 +5,13 @@ namespace App\Service\Provider;
use App\Dto\Connector\DefaultProviderDto;
use App\Dto\Connector\OpenProviderProviderDto;
use App\Entity\Domain;
use App\Service\Provider\AbstractProvider;
use App\Exception\Provider\DomainOrderFailedExeption;
use App\Exception\Provider\InvalidLoginException;
use Psr\Cache\CacheItemInterface;
use Psr\Cache\CacheItemPoolInterface;
use Symfony\Component\DependencyInjection\Attribute\Autoconfigure;
use Symfony\Component\HttpClient\HttpOptions;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
use Symfony\Component\Validator\Validator\ValidatorInterface;
@@ -28,7 +27,7 @@ class OpenProviderProvider extends AbstractProvider
/** @var OpenProviderProviderDto */
protected DefaultProviderDto $authData;
private const string BASE_URL = 'https://api.openprovider.eu/v1beta';
private const string BASE_URL = 'https://api.openprovider.eu';
public function __construct(
CacheItemPoolInterface $cacheItemPool,
@@ -54,49 +53,73 @@ class OpenProviderProvider extends AbstractProvider
}
$payload = [
'accept_eap_fee' => 0,
'accept_premium_fee' => 0,
// additional_data
'admin_handle' => $this->authData->adminHandle,
// application_mode
// application_notice_id
// application_smd
// auth_code
'autorenew' => 'default',
'billing_handle' => $this->authData->billingHandle,
'owner_handle' => $this->authData->ownerHandle,
'tech_handle' => $this->authData->techHandle,
'comments' => 'Ordered with Domain Watchdog',
// dnssec_keys
'domain' => [
'name' => explode('.', $domain->getLdhName(), 2)[0],
'extension' => explode('.', $domain->getLdhName(), 2)[1],
],
'period' => '1',
// is_dnssec_enabled
// is_easy_dmarc_enabled
// is_private_whois_enabled
// is_sectigo_dns_enabled
// is_spamexperts_enabled
// name_servers
'ns_group' => $this->authData->nsGroup,
'autorenew' => 'default',
// ns_template_id
// ns_template_name
'owner_handle' => $this->authData->ownerHandle,
'period' => $this->authData->period,
// promo_code
// provider
'tech_handle' => $this->authData->techHandle,
// unit
// use_domicile
];
if (null !== $this->authData->resellerHandle) {
$payload['resellerHandle'] = $this->authData->resellerHandle;
}
$res = $this->client->request('POST', '/domain', (new HttpOptions())
if ($dryRun) {
return;
}
$res = $this->client->request('POST', '/v1beta/domain', (new HttpOptions())
->setAuthBearer($this->authData->token)
->setHeader('Accept', 'application/json')
->setBaseUri(self::BASE_URL)
->setJson($payload)->toArray());
if ((!$dryRun && Response::HTTP_ACCEPTED !== $res->getStatusCode())
|| ($dryRun && Response::HTTP_OK !== $res->getStatusCode())) {
throw new HttpException($res->toArray()['message']);
if (Response::HTTP_OK !== $res->getStatusCode()) {
throw new DomainOrderFailedExeption($res->toArray()['message']);
}
}
/**
* @throws TransportExceptionInterface
* @throws InvalidLoginException
*/
protected function assertAuthentication(): void
{
$response = $this->client->request('GET', '/customers', (new HttpOptions())
$response = $this->client->request('GET', '/v1beta/customers', (new HttpOptions())
->setAuthBearer($this->authData->token)
->setHeader('Accept', 'application/json')
->setBaseUri(self::BASE_URL)
->toArray()
);
if (Response::HTTP_OK !== $response->getStatusCode()) {
throw new BadRequestHttpException('The status of these credentials is not valid');
throw new InvalidLoginException();
}
}