Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 50
0.00% covered (danger)
0.00%
0 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
GenreController
0.00% covered (danger)
0.00%
0 / 50
0.00% covered (danger)
0.00%
0 / 5
42
0.00% covered (danger)
0.00%
0 / 1
 browse
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 read
0.00% covered (danger)
0.00%
0 / 15
0.00% covered (danger)
0.00%
0 / 1
6
 add
0.00% covered (danger)
0.00%
0 / 20
0.00% covered (danger)
0.00%
0 / 1
2
 edit
0.00% covered (danger)
0.00%
0 / 10
0.00% covered (danger)
0.00%
0 / 1
2
 delete
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace App\Controller\Api;
4
5use App\Entity\Genre;
6use App\Repository\GenreRepository;
7use Symfony\Component\HttpFoundation\JsonResponse;
8use Symfony\Component\HttpFoundation\Request;
9use Symfony\Component\HttpFoundation\Response;
10use Symfony\Component\Routing\Annotation\Route;
11use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
12use Symfony\Component\Serializer\SerializerInterface;
13
14/**
15 * @Route("/api/genres", name="app_api_genres_")
16 */
17class GenreController extends CoreApiController
18{
19    /**
20     * @Route("", name="browse", methods={"GET"})
21     */
22    public function browse(GenreRepository $genreRepository): JsonResponse
23    {
24        // TODO : lister tout les genres
25        // BDD, Genre : GenreRepository
26        $allGenres = $genreRepository->findAll();
27
28        // le serializer est caché derrière la méthode json()
29        // on lui donne les objets à serializer en JSON, ainsi qu'un contexte
30        return $this->json200($allGenres, ["genre_browse"]);
31    }
32    
33    /**
34     * @Route("/{id}", name="read", requirements={"id"="\d+"}, methods={"GET"})
35     */
36    public function read($id,GenreRepository $genreRepository): JsonResponse
37    {
38        $genre = $genreRepository->find($id);
39        // gestion 404
40        if ($genre === null){
41            // ! on est dans une API donc pas de HTML
42            // throw $this->createNotFoundException();
43            return $this->json(
44                // on pense UX : on fournit un message
45                [
46                    "message" => "Ce genre n'existe pas"
47                ],
48                // le code de status : 404
49                Response::HTTP_NOT_FOUND
50                // on a pas besoin de preciser les autres arguments
51            );
52        }
53
54        return $this->json200($genre,
55                [
56                    // j'utilise un groupe déjà existant
57                    "genre_read",
58                    "movie_browse"
59                ]
60            );
61    }
62
63    /**
64     * ajout de genre
65     *
66     * @Route("",name="add", methods={"POST"})
67     * 
68     * @return JsonResponse
69     */
70    public function add(Request $request, SerializerInterface $serializerInterface, GenreRepository $genreRepository)
71    {
72        // TODO : créer un genre
73
74        // TODO : récuperer les infos fournit par notre utilisateur
75        // comme pour les formulaires, on va chercher dans request
76        // dans request ce qui nous interesse c'est le contenu
77        $jsonContent = $request->getContent();
78        
79        //dd($jsonContent);
80        /* 
81        {
82            "name": "Radium"
83        }
84        */
85        // TODO : tranformer / deserialiser le json en objet
86        // j'utilise le service SerializerInterface pour ça
87        /** @var Genre $newGenre */
88        $newGenre = $serializerInterface->deserialize(
89            // les données à transformer/deserialiser
90            $jsonContent,
91            // vers quel type d'objet je veux deserialiser
92            Genre::class,
93            // quel est le format du contenu : json
94            'json'
95            // le paramètre de contexte nous servira pour les update
96        );
97
98        // dd($newGenre);
99        /* App\Entity\Genre {#10510 ▼
100            -id: null
101            -name: "Radium"
102            -movies: Doctrine\Common\Collections\ArrayCollection {#9996 ▶}
103            }
104            */
105        // * j'ai un objet Genre, prêt à être envoyé en BDD
106        // BDD, Genre, GenreRepository
107        $genreRepository->add($newGenre, true);
108
109        // dd($newGenre);
110        // TODO : un peu d'UX : on renvoit le bon code de statut : 201
111        return $this->json(
112            // on fournit l'objet créer
113            $newGenre,
114            // le code 201 pour la création
115            Response::HTTP_CREATED,
116            // toujour pas d'entête
117            [],
118            // on oublie pas le contexte car on serialise un objet
119            [
120                "groups" =>
121                [
122                    // j'utilise un groupe déjà existant
123                    "genre_read",
124                    "movie_browse"
125                ]
126            ]
127        );
128    }
129
130    /**
131     * edit genre
132     *
133     * @Route("/{id}",name="edit", requirements={"id"="\d+"}, methods={"PUT", "PATCH"})
134     * 
135     * @param Request $request la requete
136     * @param SerializerInterface $serializerInterface
137     * @param GenreRepository $genreRepository
138     */
139    public function edit($id, Request $request, SerializerInterface $serializerInterface, GenreRepository $genreRepository)
140    {
141        // TODO : mettre à jour un genre
142        // 1. récupérer le JSON
143        $jsonContent = $request->getContent();
144        // 2. aller chercher en BDD l'existant
145        $genre = $genreRepository->find($id);
146        // 3. désérialiser tout en mettant à jour l'objet existant
147        $serializerInterface->deserialize(
148            // les données
149            $jsonContent,
150            // le type d'objet
151            Genre::class,
152            // le format de donnée
153            'json',
154            // ? https://symfony.com/doc/5.4/components/serializer.html#deserializing-in-an-existing-object
155            // en contexte on précise que l'on veux POPULATE / PEUPLER un objet existant
156            [AbstractNormalizer::OBJECT_TO_POPULATE => $genre]
157        );
158        // * Comme on demandé la mise en jour d'un objet, pas besoin de récupérer la déserialisation
159        // dd($genre);
160        // 4. flush
161        $genreRepository->add($genre, true);
162
163        // retour 200
164        return $this->json($genre,Response::HTTP_OK, [], ["groups"=>["genre_read","movie_browse"]]);
165    }
166
167    /**
168     * delete genre
169     * Merci Audrey
170     *
171     * @Route("/{id}",name="delete", requirements={"id"="\d+"}, methods={"DELETE"})
172     */
173    public function delete($id, GenreRepository $genreRepository)
174    {
175        $genre = $genreRepository->find($id);
176        $genreRepository->remove($genre, true);
177
178        return $this->json(null,Response::HTTP_NO_CONTENT);
179    }
180}