| 
					
				 | 
			
			
				@@ -4,10 +4,16 @@ namespace App\Controller; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 use App\Entity\CommonList; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 use App\Entity\Film; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+use App\Entity\UserList; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+use App\Entity\UserListFilm; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 use App\Form\FilmType; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 use App\Repository\CommonListRepository; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 use App\Repository\FilmRepository; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+use App\Repository\UserListFilmRepository; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+use App\Repository\UserListRepository; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+use Doctrine\ORM\EntityManagerInterface; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+use Symfony\Component\HttpFoundation\JsonResponse; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 use Symfony\Component\HttpFoundation\RedirectResponse; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 use Symfony\Component\HttpFoundation\Request; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 use Symfony\Component\HttpFoundation\Response; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -16,12 +22,23 @@ use Symfony\Component\Routing\Attribute\Route; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 class IndexController extends AbstractController 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     #[Route('/{id?}', name: 'app_index', methods: ['GET', 'POST'], requirements: ['id' => '\d+'])] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public function index(Request $request, FilmRepository $filmRepository, CommonListRepository $commonListRepository, ?Film $film = null): Response 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public function index( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Request $request, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        FilmRepository $filmRepository, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        CommonListRepository $commonListRepository, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        UserListRepository $userListRepository, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        UserListFilmRepository $userListFilmRepository, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ?Film $film = null 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    ): Response 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         $film = $film ?? new Film(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         $form = $this->createForm(FilmType::class, $film); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        $commonList = $commonListRepository->findAll(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $listeFilms = $commonListRepository->findAll(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $userList = $userListRepository->findOneBy(['viewer' => $this->getUser()]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $userListFilms = $userListFilmRepository->findBy(criteria: ['userList' => $userList], orderBy: ['position' => 'ASC']); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $mesFilms = array_map(fn($value): Film => $value->getFilm(), $userListFilms); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //dd($mesFilms); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         $form->handleRequest($request); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -31,13 +48,17 @@ class IndexController extends AbstractController 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             $filmRepository->save($film, true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            $commonListRepository->save($commonList, true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (isset($commonList)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                $commonListRepository->save($commonList, true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return $this->redirectToRoute('app_index', [], RedirectResponse::HTTP_SEE_OTHER); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return $this->render('index/index.html.twig', [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            'commonList' => $commonList, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'mesFilms' => $mesFilms, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'listeFilms' => $listeFilms, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             'form' => $form 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         ]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -51,4 +72,76 @@ class IndexController extends AbstractController 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return new Response('Order updated', Response::HTTP_OK); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    #[Route('/update-list', name: 'update_list', methods: ['POST'])] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public function updateList( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Request $request, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        FilmRepository $filmRepository, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        UserListRepository $userListRepository, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        UserListFilmRepository $userListFilmRepository, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        EntityManagerInterface $entityManager): Response 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $data = json_decode($request->getContent(), true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $filmId = $data['filmId']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $fromList = $data['fromList']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $toList = $data['toList']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $oldIndex = $data['oldIndex']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $newIndex = $data['newIndex']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $order = $data['order']; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $film = $filmRepository->find($filmId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $user = $this->getUser(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // Récupérer ou créer la liste personnelle de l'utilisateur 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $userList = $userListRepository->findOneBy(['viewer' => $user]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (!$userList) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            $userList = new UserList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            $userList->setViewer($user); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            $entityManager->persist($userList); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            $entityManager->flush(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $userListFilm = $userListFilmRepository->findOneBy(['userList' => $userList, 'film' => $film]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if ($toList === 'user') { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // Ajouter le film à la liste personnelle de l'utilisateur 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            $userListFilm = $userListFilm ?? new UserListFilm(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            $userListFilm->setUserList($userList); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            $userListFilm->setFilm($film); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //$userListFilm->setPosition($userListFilm->getPosition() ?? $newIndex); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            $this->updatePositions($userList, $userListFilmRepository, $fromList, $toList, $order, $userListFilm); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            $entityManager->persist($userListFilm); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // Retirer le film de la liste personnelle de l'utilisateur 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if ($userListFilm) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                $entityManager->remove($userListFilm); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                $entityManager->flush(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                $this->updatePositions($userList, $userListFilmRepository, $fromList, $toList, $order); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $entityManager->flush(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return new JsonResponse(['success' => true]); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private function updatePositions(UserList $userList, UserListFilmRepository $userListFilmRepository, string $fromList, string $toList, array $order, ?UserListFilm $newUserListFilm = null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        $userListFilms = $userListFilmRepository->findBy(['userList' => $userList], ['position' => 'ASC']); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if($fromList === 'user') { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            foreach($userListFilms as $userListFilm) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                $idFilm = $userListFilm->getFilm()->getId(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                $userListFilm->setPosition(array_search((string) $idFilm, $order)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } elseif ($fromList === 'common' && $toList === 'user') { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            $last = end($userListFilms); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            $positionLast = $last->getPosition(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            $newUserListFilm->setPosition($positionLast + 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 |