# TP4 : API Platform

> This work is licensed under a [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License](https://creativecommons.org/licenses/by-nc-sa/4.0/).
> Permission is explicitly granted to copy, distribute and/or modify this document for educational purposes under the terms of the CC BY-NC-SA license.

## Objectifs

Les objectifs de ce TP sont :

- Se familiariser avec API Platform.
- Créer une API REST pour des opération de CRUD.
- Comprendre les liens entre API Platform, Symfony et Doctrine

## Consignes

- Durée : 2 heures
- Tous vos projets `Symfony` sont à NE PAS placer votre dossier `~/public_html` (pour cause de quotas sur les machines de l'IUT).
- N'utilisez PAS le serveur `londres.uca.local` pour tester vos pages mais la
  commande `symfony server:start`.
- Nous allons continuer notre réseau social nommé `TweetTok` où les messages
  sont nommés des `Twok`.
- Lors du précédent TP, nous avons réalisé un site permettant des fonctions de CRUD.
- Nous allons maintenant implémenter une API REST pour l'administration.
- Créez un NOUVEAU projet `TweetTokAPI` en parallèle de votre précédent projet `TweetTok`.

## Ressources

- Documentation d'API Platform :
  [https://api-platform.com/docs/distribution/](https://api-platform.com/docs/distribution/)

## Partie 1 : Installation de API Platform (15 min)

1. Installation

- Installer API Platform via Composer :
  ```bash
  symfony new TweetTokAPI
  cd TweetTokAPI
  symfony composer require api
  symfony composer require symfony/orm-pack
  symfony composer require --dev symfony/maker-bundle
  ```
- Comparez la structure des répertoires du projet API par rapport au projet de
  site web `TweetTok`. Quels dossiers sont en plus/moins ? Le projet est-il
  plus lourd ou plus léger ?

2. Configurer la Base de Données :

- Configurer le projet pour SQLite ou POSTGRE (la même que pour les TPs précédents) :
  - Si POSTGRE :
    ```bash
    DATABASE_URL="postgresql://VotreUser:VotrePass@londres/dbVotreUser"
    ```
  - Si SQLite :
    ```bash
    # fichier .env
    DATABASE_URL="sqlite:///%kernel.project_dir%/var/data.db"
    ```
    ```bash
    # On fait un lien symbolique de la BDD.
    # En pratique SQLite est à proscrire pour une archi micro-services.
    cd var && ln -s ../../TweetTok/var/data.db .
    ```
- Copiez le dossier `migrations` de votre projet `TweetTok` dans `TweetTokAPI`.
- Créez un lien symbolique des fichiers `TweetTok/src/Entity/Twok.php` et
   `TweetTok/src/Repository/TwokRepository.php` dans le nouveau projet
   `TweetTokAPI`.
- Effectuer les migrations pour configurer la base de données :
  ```bash
  symfony console doctrine:database:create
  symfony console doctrine:migrations:migrate
  ```

## Partie 2 : Création de Ressources pour l'API (30 minutes)

1. Déclarez l'entité `Twok` comme une ressource API et ajoutez des contraintes
   sur ses différents champs.

2. Testez votre API avec la page web (route `/api`) :
   - Si vous voyez les messages déjà insérés;
   - Si vous pouvez insérer un nouveau message;
   - Si vous pouvez modifier/remplacer un message existant;
   - Si vous pouvez supprimer un message existant;

3. Effectuez les mêmes tests avec les commandes cURL fournies :
   - Comprenez-vous les options de cURL dans la commande ?
   - Comprenez-vous la réponse de cURL ?

4. Insérez/Supprimez un message directement dans la BDD avec SQLite/POSTGRE :
   - Que constatez-vous ?

## Partie 3 : Génération de Code Client API

1. Utilisez API Platform pour générer le code d'un client de l'API dans le
   framework de votre choix

2. Validez que vous pouvez interagir avec l'API (lister, créer, supprimer,
   modifier, etc).

## Partie 4 : Pour aller plus loin

1. Renseignez-vous sur la création d'une classe de validation de contraintes
   personnalisée :
   [https://symfony.com/doc/5.x/validation/custom_constraint.html](https://symfony.com/doc/5.x/validation/custom_constraint.html).

2. Implémentez une validation personnalisée pour bloquer des messages contenant
   des mots interdits (ex: contenu insultant)
