Pour le projet api-genesis créé avec api-platform¶
Je dois te fournir un script SQL de création de table pour que tu puisses exécuter ta tâche.
Entity¶
Demande si l'entity doit être synchronisée ou non, les réponses possibles seront oui, non, ne sais pas. La réponse te servira plus loin. A partir de ce script SQL, génère une classe entity dans le namespace App\Entity\Database pour api-platform : - Le nom de la classe reprend le nom de la table, mais en PascalCase et au singulier, sans suffixe "Entity" - La classe étendra LpzAbstractEntity (use App\Entity\Abstract\LpzAbstractEntity;) - Bien ajouter le constructeur qui appelle le constructeur parent de LpzAbstractEntity - Les setters doivent retourner self, c'est à dire l'entity en cours.
-
Si la table contient les champs is_active ET is_deleted, l'entity étendra LpzSoftDeletableActivatableInterface (use App\Entity\Interface\LpzSoftDeletableActivatableInterface), tu ajouteras la méthode
-
Si la table contient un champ is_deleted et pas de champ is_active, l'entity étendra LpzSoftDeletableInterface (use App\Entity\Interface\LpzSoftDeletableInterface) et elle utilisera le Trait LpzSoftDeletableTrait (use App\Entity\Trait\LpzSoftDeletableTrait;), tu y ajouteras une la méthode
-
Si la table contient un champ is_active et pas de champ is_deleted, l'entity étendra LpzActivatableInterface (use App\Entity\Interface\LpzActivatableInterface) et elle utilisera le trait LpzActivatableTrait (use App\Entity\Trait\LpzActivatableTrait;), tu y ajouteras la méthode
-
Si la réponse à la question sur la synchronisation de l'entity est oui, l'entity étendra la classe LpzSyncableEntityInterface (use App\Entity\Interface\LpzSyncableEntityInterface;) et utilisera le trait LpzSyncableEntityTrait (use App\Entity\Trait\LpzSyncableEntityTrait;)
-
L'attribut table reprend le nom de la table tel quel
-
N'ajoute pas d'argument indexes, les index existants seront renommés selon notre propre convention, mais si un index te semble manquer, propose de le rajouter. Sur les tables qui doivent être synchronisées, ajoute systématiquement iun index ascendant et descendant sur les champs created_at et updated_at.
-
Si le nom de l'entité passé en snake case n'a pas de _ ou un seul underscore, on utilisera le nom de l'entité en camel case pour les groupes,
-
Si le nom de l'entité passé en snake case comprend plus d'un _, une abréviation sera utilisée, exemple : contract_slot_availability deviendra csa. Dans la suite de ce fichier, nous utiliserons [ENT_GP] pour désigner ce nom.
-
Ajoute l'attribut APIResource, avec les arguments :
- operations :
- pas d'argument uriTemplate, pour aucune des opérations
- security avec le role ROLE_USER pour toutes les operations sauf delete
- getCollection :
- normalizationContext : tu ajouteras les groupes [ENT_GP]:list' et 'common:read'
- get :
- normalizationContext : tu ajouteras les groupes [ENT_GP]:detail' et 'common:read'
- post :
- normalizationContext : tu ajouteras les groupes [ENT_GP]:detail' et 'common:read'
- denormalizationContext : tu ajouteras le groupe [ENT_GP]:create'
- Ajoute les #[UniqueEntity] et #[ORM\UniqueConstraint] à la classe si nécessaire, avec le groupe [ENT_GP]:create pour #[UniqueEntity]
- Ajoute validationContext: ['groups' => ['Default', '[ENT_GP]:create']],
- put :
- normalizationContext : tu ajouteras les groupes [ENT_GP]:detail' et 'common:read'
- denormalizationContext : tu ajouteras le groupe [ENT_GP]:update'
- Ajoute validationContext: ['groups' => ['Default', '[ENT_GP]:update']]
- Patch :
- normalizationContext : tu ajouteras les groupes [ENT_GP]:detail' et 'common:read'
- denormalizationContext : tu ajouteras le groupe [ENT_GP]:patch'
- Delete :
- Si la table a un champ is_deleted, tu ajouteras processor: SoftDeleteProcessor::class
- security : il faudra le ROLE_ADMIN si la table n'a pas de champ is_deleted
- normalizationContext : ['groups' => ['[ENT_GP]:read', 'common:read']]
- Ajoute routePrefix: '/db',
- Ajoute des attributs APIFilter
- SearchFilter sur toutes les liaisons à d'autres entités (correspondance exacte)
- BooleanFilter sur les booléens, c'est à dire au moins sur les champs isActive, isDeleted si la table les possède.
- DateFilter sur les dates (pas sur createdAt et updatedAt)
- OrderFilter sur tous les champs filter que je viens de te donner.
- ExclusionPolicy :,
- Ajoute les constraints (Assert),
- Ne met pas les attributs id, created_at, updated_at, is_active et is_deleted ni leurs getters et setters, qui sont gérés par LpzAbstractEntity, LpzSoftDeletableActivatableInterface et LpzActivatableInterface
Repository¶
Crée le repository minimal correspondant à l'entité, ne génère pas de méthodes à l'intérieur.
Dto¶
Tu créeras une classe Data Transformer Object, avec pour nom le nom de l'entité suffixé de Dto dans le namespace App\Dto. Cette classe implémentera l'interface TrackableFieldsInterface (use App\Dto\TrackableFieldsInterface;) et utilisera le trait TrackableFieldsTrait (use App\Dto\TrackableFieldsTrait;) Ajoutes-y les contraintes Assert Une fois le Dto créé, ajoute la référence à ce Dto dans les Operations Post, Put et Patch de l'entité (input:)
Denormalizer¶
Une fois cette entity et ce Dto créés, tu créeras une classe de Denormalizer dont le nom ajoutera Denormalizer comme suffixe au nom de la classe de l'entity. Cette classe étendra la classe LpzAbstractDenormalizer (use Lpz\Serializer\Denormalizer\LpzAbstractDenormalizer;) La classe aura un attribut "protected string $dtoClass" qui sera la classe Dto précédemment créée.
Normalizer¶
Une fois cette entity, ce Dto et ce Denormalizer créés, tu créeras une classe de Normalizer dont le nom ajoutera Normalizer comme suffixe au nom de la classe de l'entity. Cette classe étendra la classe LpzAbstractNormalizer (use Lpz\Serializer\Normalizer\LpzAbstractNormalizer;) La classe aura un attribut "protected ?string $entityClass" qui sera l'entity précédemment créée.
State Processor¶
Génère une classe, toujours avec le nom de l'entity, suffixé de "Processor" dans le namespace (namespace App\State) Cette classe étendra la classe AbstractEntityProcessor (use App\State\AbstractEntityProcessor) avec les attributs : - entityClass qui prendra la classe de l'entity précédemment créée - dtoClass qui prendra la classe Dto précédemment créée
Une fois le Processor créé, ajoute la référence à ce Processor dans les Operations Post, Put et Patch de l'entité (processor:)Une fois ceci fait, retire la table de la liste des exclusions, dans le paramètre schema_filter du fichier config/packages/doctrine.yaml