X-Git-Url: https://git.rapsys.eu/treebundle/blobdiff_plain/08adf12f23646afa31a2e1d189d8d710bec88453..d3798da0c79794f2355b3002b36faf7e8e8fc95e:/Controller/TreeController.php diff --git a/Controller/TreeController.php b/Controller/TreeController.php index 267cffa..54bc44f 100644 --- a/Controller/TreeController.php +++ b/Controller/TreeController.php @@ -11,20 +11,27 @@ namespace Rapsys\TreeBundle\Controller; +use Doctrine\Persistence\ManagerRegistry; + use Psr\Container\ContainerInterface; +use Rapsys\PackBundle\Util\FacebookUtil; +use Rapsys\TreeBundle\Entity\Album; +use Rapsys\TreeBundle\RapsysTreeBundle; + use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; +use Symfony\Bundle\SecurityBundle\Security; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Routing\RouterInterface; +use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface; + use Symfony\Contracts\Translation\TranslatorInterface; use Twig\Environment; -use Rapsys\TreeBundle\RapsysTreeBundle; - /** * {@inheritdoc} */ @@ -39,11 +46,21 @@ class TreeController extends AbstractController { */ protected array $context = []; + /** + * Count integer + */ + protected int $count; + /** * Locale string */ protected string $locale; + /** + * Page integer + */ + protected int $page; + /** * Request instance */ @@ -62,13 +79,18 @@ class TreeController extends AbstractController { /** * Creates a new tree controller * + * @param AuthorizationCheckerInterface $checker The container instance * @param ContainerInterface $container The ContainerInterface instance + * @param ManagerRegistry $doctrine The doctrine instance + * @param FacebookUtil $facebook The facebook instance * @param RouterInterface $router The router instance + * @param Security $security The security instance * @param RequestStack $stack The stack instance * @param TranslatorInterface $translator The translator instance * @param Environment $twig The twig environment instance + * @param integer $limit The page limit */ - function __construct(protected ContainerInterface $container, protected RouterInterface $router, protected RequestStack $stack, protected TranslatorInterface $translator, protected Environment $twig) { + function __construct(protected AuthorizationCheckerInterface $checker, protected ContainerInterface $container, protected ManagerRegistry $doctrine, protected FacebookUtil $facebook, protected RouterInterface $router, protected Security $security, protected RequestStack $stack, protected TranslatorInterface $translator, protected Environment $twig, protected int $limit = 5) { //Retrieve config $this->config = $container->getParameter(RapsysTreeBundle::getAlias()); @@ -84,6 +106,14 @@ class TreeController extends AbstractController { //Set alternates $alternates = []; + //Get current page + $this->page = (int) $this->request->query->get('page'); + + //With negative page + if ($this->page < 0) { + $this->page = 0; + } + //Set route //TODO: default to not found route ??? //TODO: pour une url not found, cet attribut n'est pas défini, comment on fait ??? @@ -156,14 +186,135 @@ class TreeController extends AbstractController { /** * The index page * - * Display file tree + * Display index + * + * @param Request $request The request instance + * @return Response The rendered view + */ + public function index(Request $request): Response { + //Get user + $user = $this->security->getUser(); + + //With not enough albums + if (($this->count = $this->doctrine->getRepository(Album::class)->findCountAsInt($user?->getId())) < $this->page * $this->limit) { + //Throw 404 + throw $this->createNotFoundException($this->translator->trans('Unable to find albums')); + } + + //Get albums + if ($this->context['albums'] = $this->doctrine->getRepository(Album::class)->findAllAsArray($user?->getId(), $this->page, $this->limit)) { + //Set modified + $this->modified = max(array_map(function ($v) { return $v['modified']; }, $this->context['albums'])); + //Without albums + } else { + //Set empty modified + $this->modified = new \DateTime('-1 year'); + } + + /*header('Content-Type: text/plain'); + var_dump($this->context['albums']); + exit;*/ + + //Create response + $response = new Response(); + + //With logged user + if ($this->checker->isGranted('IS_AUTHENTICATED_REMEMBERED')) { + //Set last modified + $response->setLastModified(new \DateTime('-1 year')); + + //Set as private + $response->setPrivate(); + //Without logged user + } else { + //Set etag + //XXX: only for public to force revalidation by last modified + $response->setEtag(md5(serialize($this->context['albums']))); + + //Set last modified + $response->setLastModified($this->modified); + + //Set as public + $response->setPublic(); + + //Without role and modification + if ($response->isNotModified($request)) { + //Return 304 response + return $response; + } + } + + //Set keywords + /*$this->context['head']['keywords'] = implode( + ', ', + //Use closure to extract each unique article keywords sorted + (function ($t) { + //Return array + $r = []; + + //Iterate on articles + foreach($t as $a) { + //Non empty keywords + if (!empty($a['keywords'])) { + //Iterate on keywords + foreach($a['keywords'] as $k) { + //Set keyword + $r[$k['title']] = $k['title']; + } + } + } + + //Sort array + sort($r); + + //Return array + return $r; + })($this->context['articles']) + ); + //Get albums + $this->context['albums'] = $this->config['albums'];*/ + + //Return rendered response + return $this->render('@RapsysTree/index.html.twig', $this->context, $response); + } + + /** + * The directory page + * + * Display directory + * + * @param Request $request The request instance + * @param string $path The directory path + * @return Response The rendered view + */ + public function directory(Request $request, string $path): Response { + header('Content-Type: text/plain'); + var_dump($path); + exit; + + //Render template + $response = $this->render('@RapsysTree/directory.html.twig', $this->context); + + $response->setEtag(md5($response->getContent())); + $response->setPublic(); + $response->isNotModified($request); + + //Return response + return $response; + } + + /** + * The document page + * + * Display document * * @param Request $request The request instance + * @param string $path The directory path * @return Response The rendered view */ - public function index(Request $request, string $path): Response { + public function document(Request $request, string $path): Response { //Render template - $response = $this->render('@RapsysTree/index.html.twig', $this->context); + $response = $this->render('@RapsysTree/document.html.twig', $this->context); $response->setEtag(md5($response->getContent())); $response->setPublic(); @@ -227,9 +378,9 @@ class TreeController extends AbstractController { } //With empty facebook title and title - if (empty($parameters['facebook']['og:title']) && !empty($parameters['title'])) { + if (empty($parameters['facebook']['og:title']) && !empty($parameters['title']['page'])) { //Set facebook title - $parameters['facebook']['og:title'] = $parameters['title']; + $parameters['facebook']['og:title'] = $parameters['title']['page']; } //With empty facebook description and description