|
@@ -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);
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|