# TP3.1: Base de données avec Doctrine

> 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 :

- Comprendre et mettre en œuvre les opérations CRUD (Create, Read, Update,
  Delete) avec Doctrine dans une application Symfony.
- Avancer vers des fonctionnalités de recherche avancées.
- Ajouter plus de fonctionnalités de stockage en BDD et d'interactions entre les tables.

## Consignes

- Durée : 2 heures
- De préférence, ne placez **PAS** vos projets `Symfony` dans votre dossier `~/public_html` (les quotas explosent !).
- 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, les `Twoks` étaient stockés en dur dans un fichier JSON.
- Nous allons maintenant les stocker en BDD.
- Repartez donc de votre précédent projet `TweetTok`.
- **<span style="color:red">Attention! L'utilisation des commandes `symfony
  console make:crud` et `symfony console make:form` sont interdites pour le
  moment ! L'objectif est de comprendre ce qu'elles font.</span>**

## Ressources

- Documentation de Symfony sur Doctrine :
  [https://symfony.com/doc/5.x/doctrine.html](https://symfony.com/doc/5.x/doctrine.html)

## Partie 1: Import des Twoks existants avec Doctrine (30 min)

1. **Configuration de la base de données :**
    - Assurez-vous que Doctrine ORM est bien installé :
    ```bash
    composer require symfony/orm-pack
    composer require --dev symfony/maker-bundle
    ```
    - Configurez le fichier `.env` de Symfony pour vous connecter à votre base
      de données (avec `SQLite` dans un premier temps).

2. **Création de l'entité `Twok` :**
   Lors du précédent TP, nous avions utilisé un service nommé `TwokManager`
   pour géger les `Twoks`. Nous allons maintenant les représenter sous forme
   d'une entité :
   - Utilisez la console Symfony pour générer une entité `Twok` et son registre
     correspondant. Faites en sorte que les champts soient les même que dans le
     fichier JSON du TP précédent (`id`, `author`, `twok`, `created_at`) en
     faisant attention aux types.
   - Créez la base de donnée, créez une migration et appliquez la.
   - Utilisez l'outil `psql` pour vérifier la bonne exécution de votre migration.

3. **Import des précédents messages** : Félicitations ! Vous avez maintenant
   une table `Twok` toute vide et plusieurs `Twoks` stockés dans votre fichier
   JSON.
   - Mofifiez votre service `TwokManager` pour écrire en BDD les `Twok`
     contenus dans le fichier JSON. Pour cela aidez vous de la fonction
     [`Serializer`](https://symfony.com/doc/current/components/serializer.html) de
     Symfony.
   - Validez avec `psql` que vos `Twoks` sont maintenant bien en BDD.
   - Nettoyez le code existant, nous n'avons plus besoin du fichier JSON.

## Partie 2: Recherche avancée (30 min)

1. Ajoutez les fonctionnalités suivantes à votre `TwokRepository` :
   - Recherche de Twok par ID;
   - Recherche de Twok par auteur;
   - Recherche de Twok par date (avant/après);
   - Recherche de Twok par hashtag dans le champ `content`.

## Partie 3: Un CRUD très rudimentaire (30 min)

1. Implémentez dans votre controlleur les routes et les méthodes permettant de
   lister, d'ajouter, d'éditer et supprimer des `Twoks`. **Ne perdez pas de temps
   à comprendre comment utiliser Twig, ce sera pour une prochaine fois.**

## Partie 4: Fonctionnalités avancées (30 min +)

1. **Gestion des hashtags :**
   - Ajoutez un champ `hashtag` dans la table `Twok` dans lequel vous ajoutez
     les différents hashtags de message lors de l'insertion. Attention, ne
     modifiez pas le contenu du message !
   - Appliquez ce changement pour les messages existants.

2. **Gestion des utilisateurs :**
   - Ajoutez une entité `User` qui a comme champs : `username`, `real_name`,
     `favorites`.
   - Remplissez la table avec les différents utilisateurs ayant déjà posté un `Twok`.
   - Pour chaque utilisateur choisissez deux ou trois messages favoris et
     remplissez le champ `favorite` en adéquation.

3. **Vérifications avant insertion/modification :**
   - Avant d'insérer ou de modifier un Twok, assurez-vous que le contenu n'est
     pas vide et ne dépasse pas 180 caractères.

4. **Compteur d'impression des `Twoks` :**
   - Ajouter un champ `nb_prints` dans la table `Twok` et incrémentez sa valeur
     à chaque fois que le `Twok` est affiché. 

## Pour aller plus loin

- Implémentez des jeux de test pour vos codes.
