diff --git a/lib/EntityGenerator/src/Attribute/AttributeGenerator.php b/lib/EntityGenerator/src/Attribute/AttributeGenerator.php index 2b880f0e..f2d0fdd9 100644 --- a/lib/EntityGenerator/src/Attribute/AttributeGenerator.php +++ b/lib/EntityGenerator/src/Attribute/AttributeGenerator.php @@ -8,13 +8,13 @@ class AttributeGenerator { protected string $className; /** - * @var array + * @var array */ protected array $parameters; /** * @param string $className - * @param int[]|string[] $parameters + * @param array $parameters */ public function __construct(string $className, array $parameters = []) { @@ -24,7 +24,7 @@ public function __construct(string $className, array $parameters = []) public static function wrapString(string $string): string { - return sprintf('"%s"', $string); + return sprintf('"%s"', str_replace('"', '\\"', $string)); } public function generate(int $currentIndentation = 0): string @@ -32,20 +32,10 @@ public function generate(int $currentIndentation = 0): string $formattedParams = []; if (count($this->parameters) > 3) { foreach ($this->parameters as $name => $parameter) { - if (is_string($name) && !empty($name)) { - $formattedParams[] = sprintf( - '%s%s: %s', - str_repeat(' ', $currentIndentation + 4), - $name, - $parameter - ); - } else { - $formattedParams[] = sprintf( - '%s%s', - str_repeat(' ', $currentIndentation + 4), - $parameter - ); + if (empty($parameter)) { + continue; } + $formattedParams[] = $this->formatProperties($name, $parameter, $currentIndentation); } return str_repeat(' ', $currentIndentation) . @@ -53,26 +43,75 @@ public function generate(int $currentIndentation = 0): string sprintf( '(%s%s%s)', PHP_EOL, - implode(',' . PHP_EOL, $formattedParams), + implode(',' . PHP_EOL, array_filter($formattedParams)), PHP_EOL . str_repeat(' ', $currentIndentation), ); } elseif (count($this->parameters) > 0) { foreach ($this->parameters as $name => $parameter) { - if (is_string($name) && !empty($name)) { - $formattedParams[] = sprintf('%s: %s', $name, $parameter); - } else { - $formattedParams[] = $parameter; + if (empty($parameter)) { + continue; } + $formattedParams[] = $this->formatProperties($name, $parameter, -4); } return str_repeat(' ', $currentIndentation) . $this->className . sprintf( '(%s)', - implode(', ', $formattedParams) + implode(', ', array_filter($formattedParams)) ); } else { return str_repeat(' ', $currentIndentation) . $this->className; } } + + /** + * @param string $name + * @param array $parameter + * @param int $currentIndentation + * @return string + * @throws \JsonException + */ + protected function formatArrayObject(string $name, array $parameter, int $currentIndentation = 0): string + { + $encodedParameterContent = []; + foreach ($parameter as $key => $value) { + if (is_string($key)) { + $encodedParameterContent[] = sprintf( + '%s => %s', + self::wrapString($key), + \json_encode($value, \JSON_THROW_ON_ERROR) + ); + } + } + return sprintf( + '%s%s: %s', + str_repeat(' ', $currentIndentation + 4), + $name, + '[' . implode(', ', $encodedParameterContent) . ']' + ); + } + + protected function formatProperties(string|int $name, mixed $parameter, int $currentIndentation = 0): ?string + { + if (empty($parameter)) { + return null; + } + if (is_string($name) && \is_array($parameter)) { + return $this->formatArrayObject($name, $parameter, $currentIndentation); + } + if (is_string($name) && !empty($name)) { + return sprintf( + '%s%s: %s', + str_repeat(' ', $currentIndentation + 4), + $name, + $parameter + ); + } + return sprintf( + '%s%s', + str_repeat(' ', $currentIndentation + 4), + $parameter + ); + } } diff --git a/lib/EntityGenerator/src/Field/AbstractFieldGenerator.php b/lib/EntityGenerator/src/Field/AbstractFieldGenerator.php index e0a689e7..082dd4a1 100644 --- a/lib/EntityGenerator/src/Field/AbstractFieldGenerator.php +++ b/lib/EntityGenerator/src/Field/AbstractFieldGenerator.php @@ -150,6 +150,27 @@ protected function getFieldAttributes(bool $exclude = false): array $attributes[] = new AttributeGenerator('SymfonySerializer\Groups', [ $this->getSerializationGroups() ]); + + $description = $this->field->getLabel(); + if (!empty($this->field->getDescription())) { + $description .= ': ' . $this->field->getDescription(); + } + if ($this->field->isEnum()) { + $enumValues = explode(',', $this->field->getDefaultValues()); + $enumValues = array_filter(array_map('trim', $enumValues)); + $openapiContext = [ + 'type' => 'string', + 'enum' => $enumValues, + 'example' => $enumValues[0] ?? null, + ]; + } + $attributes[] = new AttributeGenerator('\ApiPlatform\Metadata\ApiProperty', [ + 'description' => AttributeGenerator::wrapString($description), + 'schema' => $openapiContext ?? null, + 'example' => $this->field->getPlaceholder() ? + AttributeGenerator::wrapString($this->field->getPlaceholder()) : + null, + ]); if ($this->getSerializationMaxDepth() > 0) { $attributes[] = new AttributeGenerator('SymfonySerializer\MaxDepth', [ $this->getSerializationMaxDepth() diff --git a/lib/EntityGenerator/tests/mocks/GeneratedNodesSources/NSMock.php b/lib/EntityGenerator/tests/mocks/GeneratedNodesSources/NSMock.php index 0b16aed2..7254541d 100644 --- a/lib/EntityGenerator/tests/mocks/GeneratedNodesSources/NSMock.php +++ b/lib/EntityGenerator/tests/mocks/GeneratedNodesSources/NSMock.php @@ -40,6 +40,7 @@ class NSMock extends \mock\Entity\NodesSources #[ SymfonySerializer\SerializedName(serializedName: "fooDatetime"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default", "foo_datetime"]), + \ApiPlatform\Metadata\ApiProperty(description: "Foo DateTime field"), SymfonySerializer\MaxDepth(2), ApiFilter(OrmFilter\OrderFilter::class), ApiFilter(OrmFilter\DateFilter::class), @@ -79,6 +80,7 @@ public function setFooDatetime(?\DateTime $fooDatetime): static #[ SymfonySerializer\SerializedName(serializedName: "foo"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Foo field: Maecenas sed diam eget risus varius blandit sit amet non magna"), SymfonySerializer\MaxDepth(1), Gedmo\Versioned, ORM\Column( @@ -123,6 +125,7 @@ public function setFoo(?string $foo): static #[ SymfonySerializer\SerializedName(serializedName: "fooIndexed"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Foo indexed field: Maecenas sed diam eget risus varius blandit sit amet non magna"), SymfonySerializer\MaxDepth(1), ApiFilter(OrmFilter\SearchFilter::class, strategy: "partial"), ApiFilter(\RZ\Roadiz\CoreBundle\Api\Filter\NotFilter::class), @@ -169,6 +172,7 @@ public function setFooIndexed(?string $fooIndexed): static #[ SymfonySerializer\SerializedName(serializedName: "boolIndexed"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Bool indexed field: Maecenas sed diam eget risus varius blandit sit amet non magna"), SymfonySerializer\MaxDepth(1), ApiFilter(OrmFilter\OrderFilter::class), ApiFilter(OrmFilter\BooleanFilter::class), @@ -229,6 +233,7 @@ public function setBoolIndexed(bool $boolIndexed): static #[ SymfonySerializer\SerializedName(serializedName: "fooMarkdown"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Foo markdown field: Maecenas sed diam eget risus varius blandit sit amet non magna"), SymfonySerializer\MaxDepth(1), Gedmo\Versioned, ORM\Column(name: "foo_markdown", type: "text", nullable: true), @@ -319,6 +324,7 @@ public function setFooMarkdownExcluded(?string $fooMarkdownExcluded): static #[ SymfonySerializer\SerializedName(serializedName: "fooDecimalExcluded"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Foo expression excluded decimal: Maecenas sed diam eget risus varius blandit sit amet non magna"), SymfonySerializer\MaxDepth(2), ApiFilter(OrmFilter\OrderFilter::class), ApiFilter(OrmFilter\NumericFilter::class), @@ -383,6 +389,7 @@ public function setFooDecimalExcluded(int|float|null $fooDecimalExcluded): stati #[ SymfonySerializer\SerializedName(serializedName: "singleEventReference"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Référence à l'événement: Maecenas sed diam eget risus varius blandit sit amet non magna"), SymfonySerializer\MaxDepth(2), ORM\ManyToOne(targetEntity: \App\Entity\Base\Event::class), ORM\JoinColumn(name: "single_event_reference_id", referencedColumnName: "id", onDelete: "SET NULL"), @@ -436,6 +443,7 @@ public function setSingleEventReference(?\App\Entity\Base\Event $singleEventRefe #[ SymfonySerializer\SerializedName(serializedName: "eventReferences"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Remontée d'événements manuelle: Maecenas sed diam eget risus varius blandit sit amet non magna"), SymfonySerializer\MaxDepth(2), ORM\ManyToMany(targetEntity: \App\Entity\Base\Event::class), ORM\JoinTable(name: "node_type_event_references"), @@ -623,6 +631,7 @@ public function setEventReferencesExcluded(Collection|array $eventReferencesExcl Serializer\Exclude, SymfonySerializer\SerializedName(serializedName: "bar"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default", "nodes_sources_documents"]), + \ApiPlatform\Metadata\ApiProperty(description: "Bar documents field: Maecenas sed diam eget risus varius blandit sit amet non magna"), SymfonySerializer\MaxDepth(1) ] private ?array $bar = null; @@ -697,6 +706,7 @@ public function addBar(\mock\Entity\Document $document): static Serializer\Exclude, SymfonySerializer\SerializedName(serializedName: "theForms"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default", "nodes_sources_custom_forms"]), + \ApiPlatform\Metadata\ApiProperty(description: "Custom forms field"), SymfonySerializer\MaxDepth(2) ] private ?array $theForms = null; @@ -771,6 +781,7 @@ public function addTheForms(\mock\Entity\CustomForm $customForm): static Serializer\Exclude, SymfonySerializer\SerializedName(serializedName: "fooBar"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default", "nodes_sources_nodes"]), + \ApiPlatform\Metadata\ApiProperty(description: "ForBar nodes field: Maecenas sed diam eget risus varius blandit sit amet non magna"), SymfonySerializer\MaxDepth(2) ] private ?array $fooBarSources = null; @@ -886,6 +897,7 @@ public function setFooBarHiddenSources(?array $fooBarHiddenSources): static Serializer\Exclude, SymfonySerializer\SerializedName(serializedName: "fooBarTyped"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default", "nodes_sources_nodes"]), + \ApiPlatform\Metadata\ApiProperty(description: "ForBar nodes typed field"), SymfonySerializer\MaxDepth(2) ] private ?array $fooBarTypedSources = null; @@ -941,6 +953,7 @@ public function setFooBarTypedSources(?array $fooBarTypedSources): static #[ SymfonySerializer\SerializedName(serializedName: "layout"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "ForBar layout enum", schema: ["type" => "string", "enum" => ["light","dark","transparent"], "example" => "light"]), SymfonySerializer\MaxDepth(2), ApiFilter(OrmFilter\SearchFilter::class, strategy: "exact"), ApiFilter(\RZ\Roadiz\CoreBundle\Api\Filter\NotFilter::class), @@ -989,6 +1002,7 @@ public function setLayout(?string $layout): static #[ SymfonySerializer\SerializedName(serializedName: "fooManyToOne"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "For many_to_one field"), SymfonySerializer\MaxDepth(2), ORM\ManyToOne(targetEntity: \MyCustomEntity::class), ORM\JoinColumn(name: "foo_many_to_one_id", referencedColumnName: "id", onDelete: "SET NULL"), @@ -1030,6 +1044,7 @@ public function setFooManyToOne(?\MyCustomEntity $fooManyToOne = null): static #[ SymfonySerializer\SerializedName(serializedName: "fooManyToMany"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "For many_to_many field"), SymfonySerializer\MaxDepth(2), ORM\ManyToMany(targetEntity: \MyCustomEntity::class), ORM\JoinTable(name: "node_type_foo_many_to_many"), diff --git a/lib/EntityGenerator/tests/mocks/GeneratedNodesSourcesWithRepository/NSMock.php b/lib/EntityGenerator/tests/mocks/GeneratedNodesSourcesWithRepository/NSMock.php index 1f25db59..fd3b90d4 100644 --- a/lib/EntityGenerator/tests/mocks/GeneratedNodesSourcesWithRepository/NSMock.php +++ b/lib/EntityGenerator/tests/mocks/GeneratedNodesSourcesWithRepository/NSMock.php @@ -40,6 +40,7 @@ class NSMock extends \mock\Entity\NodesSources #[ SymfonySerializer\SerializedName(serializedName: "fooDatetime"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default", "foo_datetime"]), + \ApiPlatform\Metadata\ApiProperty(description: "Foo DateTime field"), SymfonySerializer\MaxDepth(2), ApiFilter(OrmFilter\OrderFilter::class), ApiFilter(OrmFilter\DateFilter::class), @@ -79,6 +80,7 @@ public function setFooDatetime(?\DateTime $fooDatetime): static #[ SymfonySerializer\SerializedName(serializedName: "foo"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Foo field: Maecenas sed diam eget risus varius blandit sit amet non magna"), SymfonySerializer\MaxDepth(1), Gedmo\Versioned, ORM\Column( @@ -123,6 +125,7 @@ public function setFoo(?string $foo): static #[ SymfonySerializer\SerializedName(serializedName: "fooIndexed"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Foo indexed field: Maecenas sed diam eget risus varius blandit sit amet non magna"), SymfonySerializer\MaxDepth(1), ApiFilter(OrmFilter\SearchFilter::class, strategy: "partial"), ApiFilter(\RZ\Roadiz\CoreBundle\Api\Filter\NotFilter::class), @@ -169,6 +172,7 @@ public function setFooIndexed(?string $fooIndexed): static #[ SymfonySerializer\SerializedName(serializedName: "boolIndexed"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Bool indexed field: Maecenas sed diam eget risus varius blandit sit amet non magna"), SymfonySerializer\MaxDepth(1), ApiFilter(OrmFilter\OrderFilter::class), ApiFilter(OrmFilter\BooleanFilter::class), @@ -229,6 +233,7 @@ public function setBoolIndexed(bool $boolIndexed): static #[ SymfonySerializer\SerializedName(serializedName: "fooMarkdown"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Foo markdown field: Maecenas sed diam eget risus varius blandit sit amet non magna"), SymfonySerializer\MaxDepth(1), Gedmo\Versioned, ORM\Column(name: "foo_markdown", type: "text", nullable: true), @@ -319,6 +324,7 @@ public function setFooMarkdownExcluded(?string $fooMarkdownExcluded): static #[ SymfonySerializer\SerializedName(serializedName: "fooDecimalExcluded"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Foo expression excluded decimal: Maecenas sed diam eget risus varius blandit sit amet non magna"), SymfonySerializer\MaxDepth(2), ApiFilter(OrmFilter\OrderFilter::class), ApiFilter(OrmFilter\NumericFilter::class), @@ -383,6 +389,7 @@ public function setFooDecimalExcluded(int|float|null $fooDecimalExcluded): stati #[ SymfonySerializer\SerializedName(serializedName: "singleEventReference"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Référence à l'événement: Maecenas sed diam eget risus varius blandit sit amet non magna"), SymfonySerializer\MaxDepth(2), ORM\ManyToOne(targetEntity: \App\Entity\Base\Event::class), ORM\JoinColumn(name: "single_event_reference_id", referencedColumnName: "id", onDelete: "SET NULL"), @@ -436,6 +443,7 @@ public function setSingleEventReference(?\App\Entity\Base\Event $singleEventRefe #[ SymfonySerializer\SerializedName(serializedName: "eventReferences"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Remontée d'événements manuelle: Maecenas sed diam eget risus varius blandit sit amet non magna"), SymfonySerializer\MaxDepth(2), ORM\ManyToMany(targetEntity: \App\Entity\Base\Event::class), ORM\JoinTable(name: "node_type_event_references"), @@ -623,6 +631,7 @@ public function setEventReferencesExcluded(Collection|array $eventReferencesExcl Serializer\Exclude, SymfonySerializer\SerializedName(serializedName: "bar"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default", "nodes_sources_documents"]), + \ApiPlatform\Metadata\ApiProperty(description: "Bar documents field: Maecenas sed diam eget risus varius blandit sit amet non magna"), SymfonySerializer\MaxDepth(1) ] private ?array $bar = null; @@ -697,6 +706,7 @@ public function addBar(\mock\Entity\Document $document): static Serializer\Exclude, SymfonySerializer\SerializedName(serializedName: "theForms"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default", "nodes_sources_custom_forms"]), + \ApiPlatform\Metadata\ApiProperty(description: "Custom forms field"), SymfonySerializer\MaxDepth(2) ] private ?array $theForms = null; @@ -771,6 +781,7 @@ public function addTheForms(\mock\Entity\CustomForm $customForm): static Serializer\Exclude, SymfonySerializer\SerializedName(serializedName: "fooBar"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default", "nodes_sources_nodes"]), + \ApiPlatform\Metadata\ApiProperty(description: "ForBar nodes field: Maecenas sed diam eget risus varius blandit sit amet non magna"), SymfonySerializer\MaxDepth(2) ] private ?array $fooBarSources = null; @@ -886,6 +897,7 @@ public function setFooBarHiddenSources(?array $fooBarHiddenSources): static Serializer\Exclude, SymfonySerializer\SerializedName(serializedName: "fooBarTyped"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default", "nodes_sources_nodes"]), + \ApiPlatform\Metadata\ApiProperty(description: "ForBar nodes typed field"), SymfonySerializer\MaxDepth(2) ] private ?array $fooBarTypedSources = null; @@ -941,6 +953,7 @@ public function setFooBarTypedSources(?array $fooBarTypedSources): static #[ SymfonySerializer\SerializedName(serializedName: "layout"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "ForBar layout enum", schema: ["type" => "string", "enum" => ["light","dark","transparent"], "example" => "light"]), SymfonySerializer\MaxDepth(2), ApiFilter(OrmFilter\SearchFilter::class, strategy: "exact"), ApiFilter(\RZ\Roadiz\CoreBundle\Api\Filter\NotFilter::class), @@ -989,6 +1002,7 @@ public function setLayout(?string $layout): static #[ SymfonySerializer\SerializedName(serializedName: "fooManyToOne"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "For many_to_one field"), SymfonySerializer\MaxDepth(2), ORM\ManyToOne(targetEntity: \MyCustomEntity::class), ORM\JoinColumn(name: "foo_many_to_one_id", referencedColumnName: "id", onDelete: "SET NULL"), @@ -1030,6 +1044,7 @@ public function setFooManyToOne(?\MyCustomEntity $fooManyToOne = null): static #[ SymfonySerializer\SerializedName(serializedName: "fooManyToMany"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "For many_to_many field"), SymfonySerializer\MaxDepth(2), ORM\ManyToMany(targetEntity: \MyCustomEntity::class), ORM\JoinTable(name: "node_type_foo_many_to_many"), diff --git a/lib/EntityGenerator/tests/units/EntityGenerator.php b/lib/EntityGenerator/tests/units/EntityGenerator.php index 3f225b5f..a9155b45 100644 --- a/lib/EntityGenerator/tests/units/EntityGenerator.php +++ b/lib/EntityGenerator/tests/units/EntityGenerator.php @@ -19,7 +19,7 @@ public function testGetClassContent() /* * Uncomment for generating a mock file from tests */ -// $dumpInstance = $this->newTestedInstance($mockNodeType, $mockNodeTypeResolver, [ +// $dumpInstance = $this->newTestedInstance($mockNodeType, $mockNodeTypeResolver, $mockDefaultValuesResolver, [ // 'parent_class' => '\mock\Entity\NodesSources', // 'node_class' => '\mock\Entity\Node', // 'translation_class' => '\mock\Entity\Translation', diff --git a/lib/EntityGenerator/tests/units/EntityGeneratorFactory.php b/lib/EntityGenerator/tests/units/EntityGeneratorFactory.php index ba75bd8e..d8fc64fb 100644 --- a/lib/EntityGenerator/tests/units/EntityGeneratorFactory.php +++ b/lib/EntityGenerator/tests/units/EntityGeneratorFactory.php @@ -46,7 +46,7 @@ public function testCreateWithCustomRepository() /* * Uncomment for generating a mock file from tests */ -// $dumpInstance = $this->newTestedInstance($mockNodeTypeResolver, [ +// $dumpInstance = $this->newTestedInstance($mockNodeTypeResolver, $mockDefaultValuesResolver, [ // 'parent_class' => '\mock\Entity\NodesSources', // 'node_class' => '\mock\Entity\Node', // 'translation_class' => '\mock\Entity\Translation', @@ -94,7 +94,7 @@ public function testCreateCustomRepository() /* * Uncomment for generating a mock file from tests */ -// $dumpInstance = $this->newTestedInstance($mockNodeTypeResolver, [ +// $dumpInstance = $this->newTestedInstance($mockNodeTypeResolver, $mockDefaultValuesResolver, [ // 'parent_class' => '\mock\Entity\NodesSources', // 'node_class' => '\mock\Entity\Node', // 'translation_class' => '\mock\Entity\Translation', diff --git a/lib/RoadizCoreBundle/src/Entity/Tag.php b/lib/RoadizCoreBundle/src/Entity/Tag.php index 50c0e331..17ddb640 100644 --- a/lib/RoadizCoreBundle/src/Entity/Tag.php +++ b/lib/RoadizCoreBundle/src/Entity/Tag.php @@ -510,7 +510,8 @@ public function setParent(?LeafInterface $parent = null): static example: 'this-is-a-tag-name', )] #[SymfonySerializer\SerializedName('slug')] - #[SymfonySerializer\Groups(['tag', 'tag_base'])] + #[SymfonySerializer\Groups(['tag', 'tag_base', 'node', 'nodes_sources'])] + #[Serializer\Groups(['tag', 'tag_base', 'node', 'nodes_sources'])] public function getSlug(): string { return $this->getTagName(); diff --git a/src/GeneratedEntity/NSArticle.php b/src/GeneratedEntity/NSArticle.php index d3abce17..b33476ca 100644 --- a/src/GeneratedEntity/NSArticle.php +++ b/src/GeneratedEntity/NSArticle.php @@ -36,6 +36,7 @@ class NSArticle extends \RZ\Roadiz\CoreBundle\Entity\NodesSources #[ SymfonySerializer\SerializedName(serializedName: "content"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Your content"), SymfonySerializer\MaxDepth(2), Gedmo\Versioned, ORM\Column(name: "content", type: "text", nullable: true), @@ -74,6 +75,7 @@ public function setContent(?string $content): static #[ SymfonySerializer\SerializedName(serializedName: "realmBSecret"), SymfonySerializer\Groups(["realm_b"]), + \ApiPlatform\Metadata\ApiProperty(description: "Secret realm_b"), SymfonySerializer\MaxDepth(2), Gedmo\Versioned, ORM\Column( @@ -117,6 +119,7 @@ public function setRealmBSecret(?string $realmBSecret): static #[ SymfonySerializer\SerializedName(serializedName: "realmASecret"), SymfonySerializer\Groups(["realm_a"]), + \ApiPlatform\Metadata\ApiProperty(description: "Secret realm_a"), SymfonySerializer\MaxDepth(2), Gedmo\Versioned, ORM\Column( @@ -160,6 +163,7 @@ public function setRealmASecret(?string $realmASecret): static #[ SymfonySerializer\SerializedName(serializedName: "unpublishedAt"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Date de dépublication"), SymfonySerializer\MaxDepth(2), ApiFilter(OrmFilter\OrderFilter::class), ApiFilter(OrmFilter\DateFilter::class), diff --git a/src/GeneratedEntity/NSArticleFeedBlock.php b/src/GeneratedEntity/NSArticleFeedBlock.php index fd281ddd..a58f5782 100644 --- a/src/GeneratedEntity/NSArticleFeedBlock.php +++ b/src/GeneratedEntity/NSArticleFeedBlock.php @@ -35,6 +35,7 @@ class NSArticleFeedBlock extends \RZ\Roadiz\CoreBundle\Entity\NodesSources #[ SymfonySerializer\SerializedName(serializedName: "listingCount"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Article count"), SymfonySerializer\MaxDepth(2), Gedmo\Versioned, ORM\Column(name: "listing_count", type: "integer", nullable: true), diff --git a/src/GeneratedEntity/NSBasicBlock.php b/src/GeneratedEntity/NSBasicBlock.php index 07c7d0a8..c1beefd5 100644 --- a/src/GeneratedEntity/NSBasicBlock.php +++ b/src/GeneratedEntity/NSBasicBlock.php @@ -35,6 +35,7 @@ class NSBasicBlock extends \RZ\Roadiz\CoreBundle\Entity\NodesSources #[ SymfonySerializer\SerializedName(serializedName: "content"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Content"), SymfonySerializer\MaxDepth(2), Gedmo\Versioned, ORM\Column(name: "content", type: "text", nullable: true), @@ -73,6 +74,7 @@ public function setContent(?string $content): static #[ SymfonySerializer\SerializedName(serializedName: "booleanField"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Boolean field"), SymfonySerializer\MaxDepth(2), Gedmo\Versioned, ORM\Column( @@ -117,6 +119,7 @@ public function setBooleanField(bool $booleanField): static Serializer\Exclude, SymfonySerializer\SerializedName(serializedName: "image"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default", "nodes_sources_documents"]), + \ApiPlatform\Metadata\ApiProperty(description: "Image"), SymfonySerializer\MaxDepth(2) ] private ?array $image = null; diff --git a/src/GeneratedEntity/NSMenuLink.php b/src/GeneratedEntity/NSMenuLink.php index 4ad00fc0..780a9885 100644 --- a/src/GeneratedEntity/NSMenuLink.php +++ b/src/GeneratedEntity/NSMenuLink.php @@ -35,6 +35,7 @@ class NSMenuLink extends \RZ\Roadiz\CoreBundle\Entity\NodesSources #[ SymfonySerializer\SerializedName(serializedName: "linkExternalUrl"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "URL externe"), SymfonySerializer\MaxDepth(2), Gedmo\Versioned, ORM\Column( @@ -84,6 +85,7 @@ public function setLinkExternalUrl(?string $linkExternalUrl): static Serializer\Exclude, SymfonySerializer\SerializedName(serializedName: "linkInternalReference"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default", "nodes_sources_nodes"]), + \ApiPlatform\Metadata\ApiProperty(description: "Référence au nœud (Page ou Bloc de page)"), SymfonySerializer\MaxDepth(2) ] private ?array $linkInternalReferenceSources = null; diff --git a/src/GeneratedEntity/NSNeutral.php b/src/GeneratedEntity/NSNeutral.php index f57780ae..8e82a232 100644 --- a/src/GeneratedEntity/NSNeutral.php +++ b/src/GeneratedEntity/NSNeutral.php @@ -36,6 +36,7 @@ class NSNeutral extends \RZ\Roadiz\CoreBundle\Entity\NodesSources #[ SymfonySerializer\SerializedName(serializedName: "number"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Number"), SymfonySerializer\MaxDepth(2), ApiFilter(OrmFilter\OrderFilter::class), ApiFilter(OrmFilter\NumericFilter::class), diff --git a/src/GeneratedEntity/NSOffer.php b/src/GeneratedEntity/NSOffer.php index 82625911..011b26aa 100644 --- a/src/GeneratedEntity/NSOffer.php +++ b/src/GeneratedEntity/NSOffer.php @@ -37,6 +37,7 @@ class NSOffer extends \RZ\Roadiz\CoreBundle\Entity\NodesSources #[ SymfonySerializer\SerializedName(serializedName: "price"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Price"), SymfonySerializer\MaxDepth(2), ApiFilter(OrmFilter\OrderFilter::class), ApiFilter(OrmFilter\NumericFilter::class), @@ -78,6 +79,7 @@ public function setPrice(int|float|null $price): static #[ SymfonySerializer\SerializedName(serializedName: "vat"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "VAT"), SymfonySerializer\MaxDepth(2), Gedmo\Versioned, ORM\Column( @@ -120,6 +122,7 @@ public function setVat(int|float|null $vat): static #[ SymfonySerializer\SerializedName(serializedName: "geolocation"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Geolocation"), SymfonySerializer\MaxDepth(2), Gedmo\Versioned, ORM\Column(name: "geolocation", type: "json", nullable: true), @@ -155,6 +158,7 @@ public function setGeolocation($geolocation): static #[ SymfonySerializer\SerializedName(serializedName: "multiGeolocation"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Multi geolocations"), SymfonySerializer\MaxDepth(2), Gedmo\Versioned, ORM\Column(name: "multi_geolocation", type: "json", nullable: true), @@ -191,6 +195,7 @@ public function setMultiGeolocation($multiGeolocation): static #[ SymfonySerializer\SerializedName(serializedName: "layout"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Layout", schema: ["type" => "string", "enum" => ["dark"], "example" => "dark"], example: "light"), SymfonySerializer\MaxDepth(2), ApiFilter(OrmFilter\SearchFilter::class, strategy: "exact"), ApiFilter(\RZ\Roadiz\CoreBundle\Api\Filter\NotFilter::class), diff --git a/src/GeneratedEntity/NSPage.php b/src/GeneratedEntity/NSPage.php index 33cef4bb..3ad62023 100644 --- a/src/GeneratedEntity/NSPage.php +++ b/src/GeneratedEntity/NSPage.php @@ -39,6 +39,7 @@ class NSPage extends \RZ\Roadiz\CoreBundle\Entity\NodesSources #[ SymfonySerializer\SerializedName(serializedName: "content"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Content: Content"), SymfonySerializer\MaxDepth(2), Gedmo\Versioned, ORM\Column(name: "content", type: "text", nullable: true), @@ -77,6 +78,7 @@ public function setContent(?string $content): static #[ SymfonySerializer\SerializedName(serializedName: "subTitle"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Sub-title"), SymfonySerializer\MaxDepth(2), Gedmo\Versioned, ORM\Column( @@ -120,6 +122,7 @@ public function setSubTitle(?string $subTitle): static #[ SymfonySerializer\SerializedName(serializedName: "color"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Page color"), SymfonySerializer\MaxDepth(2), Gedmo\Versioned, ORM\Column( @@ -166,6 +169,7 @@ public function setColor(?string $color): static Serializer\Exclude, SymfonySerializer\SerializedName(serializedName: "images"), SymfonySerializer\Groups(["realm_a"]), + \ApiPlatform\Metadata\ApiProperty(description: "Images"), SymfonySerializer\MaxDepth(2) ] private ?array $images = null; @@ -241,6 +245,7 @@ public function addImages(\RZ\Roadiz\CoreBundle\Entity\Document $document): stat Serializer\Exclude, SymfonySerializer\SerializedName(serializedName: "headerImage"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_images", "nodes_sources_documents"]), + \ApiPlatform\Metadata\ApiProperty(description: "Header image"), SymfonySerializer\MaxDepth(2) ] private ?array $headerImage = null; @@ -312,6 +317,7 @@ public function addHeaderImage(\RZ\Roadiz\CoreBundle\Entity\Document $document): #[ SymfonySerializer\SerializedName(serializedName: "overTitle"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Overtitle"), SymfonySerializer\MaxDepth(2), Gedmo\Versioned, ORM\Column( @@ -360,6 +366,7 @@ public function setOverTitle(?string $overTitle): static Serializer\Exclude, SymfonySerializer\SerializedName(serializedName: "pictures"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_images", "nodes_sources_documents"]), + \ApiPlatform\Metadata\ApiProperty(description: "Pictures: Picture for website"), SymfonySerializer\MaxDepth(2) ] private ?array $pictures = null; @@ -437,6 +444,7 @@ public function addPictures(\RZ\Roadiz\CoreBundle\Entity\Document $document): st Serializer\Exclude, SymfonySerializer\SerializedName(serializedName: "nodeReferences"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default", "nodes_sources_nodes"]), + \ApiPlatform\Metadata\ApiProperty(description: "References"), SymfonySerializer\MaxDepth(2) ] private ?array $nodeReferencesSources = null; @@ -492,6 +500,7 @@ public function setNodeReferencesSources(?array $nodeReferencesSources): static #[ SymfonySerializer\SerializedName(serializedName: "sticky"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_boolean"]), + \ApiPlatform\Metadata\ApiProperty(description: "Sticky"), SymfonySerializer\MaxDepth(2), ApiFilter(OrmFilter\OrderFilter::class), ApiFilter(OrmFilter\BooleanFilter::class), @@ -536,6 +545,7 @@ public function setSticky(bool $sticky): static #[ SymfonySerializer\SerializedName(serializedName: "stickytest"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_boolean"]), + \ApiPlatform\Metadata\ApiProperty(description: "Sticky test"), SymfonySerializer\MaxDepth(2), ApiFilter(OrmFilter\OrderFilter::class), ApiFilter(OrmFilter\BooleanFilter::class), @@ -582,6 +592,7 @@ public function setStickytest(bool $stickytest): static Serializer\Exclude, SymfonySerializer\SerializedName(serializedName: "customForm"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default", "nodes_sources_custom_forms"]), + \ApiPlatform\Metadata\ApiProperty(description: "Custom form"), SymfonySerializer\MaxDepth(2) ] private ?array $customForm = null; @@ -756,6 +767,7 @@ public function setUsers(Collection|array|null $users = null): static #[ SymfonySerializer\SerializedName(serializedName: "folderReferences"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Reference to folders"), SymfonySerializer\MaxDepth(2), ORM\ManyToMany(targetEntity: \RZ\Roadiz\CoreBundle\Entity\Folder::class), ORM\JoinTable(name: "page_folder_references"), @@ -798,6 +810,7 @@ public function setFolderReferences(Collection|array $folderReferences): static #[ SymfonySerializer\SerializedName(serializedName: "amount"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Amount"), SymfonySerializer\MaxDepth(2), Gedmo\Versioned, ORM\Column( @@ -840,6 +853,7 @@ public function setAmount(int|float|null $amount): static #[ SymfonySerializer\SerializedName(serializedName: "emailTest"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Test email"), SymfonySerializer\MaxDepth(2), Gedmo\Versioned, ORM\Column( @@ -884,6 +898,7 @@ public function setEmailTest(?string $emailTest): static #[ SymfonySerializer\SerializedName(serializedName: "settings"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Settings"), SymfonySerializer\MaxDepth(2), Gedmo\Versioned, ORM\Column(name: "settings", type: "json", nullable: true), @@ -920,6 +935,7 @@ public function setSettings($settings): static #[ SymfonySerializer\SerializedName(serializedName: "folder"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Folder simple"), SymfonySerializer\MaxDepth(2), Gedmo\Versioned, ORM\Column( @@ -960,6 +976,7 @@ public function setFolder($folder): static #[ SymfonySerializer\SerializedName(serializedName: "country"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Country"), SymfonySerializer\MaxDepth(2), Gedmo\Versioned, ORM\Column( @@ -1003,6 +1020,7 @@ public function setCountry(?string $country): static #[ SymfonySerializer\SerializedName(serializedName: "geolocation"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Geolocation"), SymfonySerializer\MaxDepth(2), Gedmo\Versioned, ORM\Column(name: "geolocation", type: "json", nullable: true), @@ -1039,6 +1057,7 @@ public function setGeolocation($geolocation): static #[ SymfonySerializer\SerializedName(serializedName: "multiGeolocation"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_geo"]), + \ApiPlatform\Metadata\ApiProperty(description: "Multi geolocations"), SymfonySerializer\MaxDepth(2), Gedmo\Versioned, ORM\Column(name: "multi_geolocation", type: "json", nullable: true), @@ -1075,6 +1094,7 @@ public function setMultiGeolocation($multiGeolocation): static #[ SymfonySerializer\SerializedName(serializedName: "layout"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Layout", schema: ["type" => "string", "enum" => ["dark","transparent"], "example" => "dark"], example: "light"), SymfonySerializer\MaxDepth(2), ApiFilter(OrmFilter\SearchFilter::class, strategy: "exact"), ApiFilter(\RZ\Roadiz\CoreBundle\Api\Filter\NotFilter::class), @@ -1137,6 +1157,7 @@ public function setLayout(?string $layout): static #[ SymfonySerializer\SerializedName(serializedName: "mainUser"), SymfonySerializer\Groups(["nodes_sources", "nodes_sources_default"]), + \ApiPlatform\Metadata\ApiProperty(description: "Main user"), SymfonySerializer\MaxDepth(2), ORM\ManyToOne(targetEntity: \RZ\Roadiz\CoreBundle\Entity\User::class), ORM\JoinColumn(name: "main_user_id", referencedColumnName: "id", onDelete: "SET NULL"),