feat: add iana-accreditations API endpoint

This commit is contained in:
Maël Gangloff
2025-09-12 23:22:15 +02:00
parent ca2f7e15a5
commit 71e23ca83d
4 changed files with 71 additions and 8 deletions

View File

@@ -0,0 +1,28 @@
<?php
namespace App\Api\Extension;
use ApiPlatform\Doctrine\Orm\Extension\QueryCollectionExtensionInterface;
use ApiPlatform\Doctrine\Orm\Util\QueryNameGeneratorInterface;
use ApiPlatform\Metadata\Operation;
use App\Entity\Entity;
use Doctrine\ORM\QueryBuilder;
class NotNullAccreditationIanaExtension implements QueryCollectionExtensionInterface
{
public function applyToCollection(
QueryBuilder $queryBuilder,
QueryNameGeneratorInterface $queryNameGenerator,
string $resourceClass,
?Operation $operation = null,
array $context = [],
): void {
if (Entity::class !== $resourceClass) {
return;
}
if ($operation && 'iana_accreditations_collection' === $operation->getName()) {
$rootAlias = $queryBuilder->getRootAliases()[0];
$queryBuilder->andWhere(sprintf('%s.ianaAccreditation.status IS NOT NULL', $rootAlias));
}
}
}

View File

@@ -2,7 +2,10 @@
namespace App\Entity;
use ApiPlatform\Doctrine\Orm\Filter\SearchFilter;
use ApiPlatform\Metadata\ApiFilter;
use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\GetCollection;
use App\Repository\EntityRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
@@ -17,6 +20,31 @@ use Symfony\Component\Serializer\Attribute\SerializedName;
)]
#[ApiResource(
operations: [
new GetCollection(
uriTemplate: '/entities/iana-accreditations',
openapiContext: [
'parameters' => [
[
'name' => 'ianaAccreditation.status',
'in' => 'query',
'required' => true,
'schema' => [
'type' => 'array',
'items' => [
'type' => 'string',
'enum' => ['Accredited', 'Terminated', 'Reserved'],
],
],
'style' => 'form',
'explode' => true,
'description' => 'Filter by IANA accreditation status',
],
],
],
description: 'IANA Registrar IDs list',
normalizationContext: ['groups' => ['entity:list']],
name: 'iana_accreditations_collection'
),
/*
new GetCollection(
uriTemplate: '/entities',
@@ -39,6 +67,12 @@ use Symfony\Component\Serializer\Attribute\SerializedName;
*/
]
)]
#[ApiFilter(
SearchFilter::class,
properties: [
'ianaAccreditation.status' => 'exact',
]
)]
class Entity
{
#[ORM\Id]
@@ -75,7 +109,7 @@ class Entity
* @var Collection<int, EntityEvent>
*/
#[ORM\OneToMany(targetEntity: EntityEvent::class, mappedBy: 'entity', cascade: ['persist'], orphanRemoval: true)]
#[Groups(['entity:list', 'entity:item', 'entity:list', 'domain:item'])]
#[Groups(['entity:item', 'domain:item'])]
private Collection $events;
#[ORM\Column]
@@ -87,8 +121,8 @@ class Entity
private ?array $remarks = null;
#[Embedded(class: IanaAccreditation::class, columnPrefix: 'iana_')]
#[Groups(['entity:item', 'domain:item'])]
private IanaAccreditation $ianaAccreditation;
#[Groups(['entity:list', 'entity:item', 'domain:item'])]
private ?IanaAccreditation $ianaAccreditation = null;
public function __construct()
{
@@ -248,12 +282,12 @@ class Entity
return $this;
}
public function getIanaAccreditation(): IanaAccreditation
public function getIanaAccreditation(): ?IanaAccreditation
{
return $this->ianaAccreditation;
return null === $this->ianaAccreditation->getStatus() ? null : $this->ianaAccreditation;
}
public function setIanaAccreditation(IanaAccreditation $ianaAccreditation): void
public function setIanaAccreditation(?IanaAccreditation $ianaAccreditation): void
{
$this->ianaAccreditation = $ianaAccreditation;
}

View File

@@ -12,7 +12,7 @@ use Symfony\Component\Serializer\Attribute\Groups;
class IanaAccreditation
{
#[ORM\Column(length: 255, nullable: true)]
#[Groups(['entity:item', 'domain:item'])]
#[Groups(['entity:item', 'entity:list', 'domain:item'])]
private ?string $registrarName = null;
#[ORM\Column(length: 255, nullable: true)]
@@ -20,7 +20,7 @@ class IanaAccreditation
private ?string $rdapBaseUrl = null;
#[ORM\Column(nullable: true, enumType: RegistrarStatus::class)]
#[Groups(['entity:item', 'domain:item'])]
#[Groups(['entity:item', 'entity:list', 'domain:item'])]
private ?RegistrarStatus $status = null;
#[ORM\Column(type: Types::DATE_IMMUTABLE, nullable: true)]

View File

@@ -16,6 +16,7 @@ use Symfony\Component\Serializer\Attribute\Groups;
#[ORM\Entity(repositoryClass: EventTriggerRepository::class)]
#[ApiResource(
uriTemplate: '/watchlists/{watchListId}/triggers/{action}/{event}',
shortName: 'Watchlist Trigger',
operations: [
new Get(),
new GetCollection(