Browse Source

Refactor web/api controllers

Jordi Boggiano 13 years ago
parent
commit
b363beb94d

+ 10 - 6
src/Packagist/WebBundle/Controller/ApiController.php

@@ -33,19 +33,23 @@ class ApiController extends Controller
      * @Template()
      * @Route("/packages.json", name="packages", defaults={"_format" = "json"})
      */
-    public function packagesAction()
+    public function packagesAction(Request $req)
     {
+        if (!$req->query->all()) {
+            return new Response(file_get_contents($this->container->getParameter('kernel.root_dir').'/../web/packages_root.json'));
+        }
+
         $em = $this->get('doctrine')->getEntityManager();
 
-        $filterFields = array();
-        if ($this->getRequest()->get('type')) {
-            $filterFields['type'] = $this->getRequest()->get('type');
-        }
+        $filters = array(
+            'type' => $req->query->get('type'),
+            'tag' => $req->query->get('tag'),
+        );
 
         gc_enable();
 
         $packages = $em->getRepository('Packagist\WebBundle\Entity\Package')
-            ->getFullPackages(null, $filterFields);
+            ->getFullPackages(null, $filters);
 
         $notifyUrl = $this->generateUrl('track_download', array('name' => 'VND/PKG'));
 

+ 1 - 1
src/Packagist/WebBundle/Controller/UserController.php

@@ -63,7 +63,7 @@ class UserController extends Controller
     {
         $packages = $this->getDoctrine()
             ->getRepository('PackagistWebBundle:Package')
-            ->getQueryBuilderByMaintainer($user);
+            ->getFilteredQueryBuilder(array('maintainer' => $user->getId()));
 
         $paginator = new Pagerfanta(new DoctrineORMAdapter($packages, true));
         $paginator->setMaxPerPage(15);

+ 13 - 31
src/Packagist/WebBundle/Controller/WebController.php

@@ -57,47 +57,29 @@ class WebController extends Controller
     }
 
     /**
+     * @Template()
      * @Route("/packages/", name="browse")
      */
     public function browseAction(Request $req)
     {
         $repository = $this->getDoctrine()->getRepository('PackagistWebBundle:Package');
-        $packages = $repository->getBaseQueryBuilder();
-        $view = 'PackagistWebBundle:Web:browse.html.twig';
-        $extraViewOptions = array();
 
-        $type = $req->query->get('type');
-        $tag = $req->query->get('tag');
-        $page = $req->query->get('page', 1);
+        $filters = array(
+            'type' => $req->query->get('type'),
+            'tag' => $req->query->get('tag'),
+        );
 
-        if ($tag) {
-            $packages = $this->getDoctrine()
-                ->getRepository('PackagistWebBundle:Package')
-                ->getQueryBuilderByTag($tag);
-            $view = 'PackagistWebBundle:Web:tag.html.twig';
-            $extraViewOptions['tag'] = $tag;
-        }
+        $data = $filters;
+        $page = $req->query->get('page', 1);
 
-        if ($type) {
-            // this andWhere either tags onto the $packages defined in the $tag
-            // if-statement, or if tags onto the $packages defined at the start
-            // of the method
-            $packages->andWhere('p.type=:type')->setParameter('type', $type);
-            $view = 'PackagistWebBundle:Web:type.html.twig';
-            $extraViewOptions['type'] = $type;
-        }
+        $packages = $this->getDoctrine()
+            ->getRepository('PackagistWebBundle:Package')
+            ->getFilteredQueryBuilder($filters);
 
-        if ($tag && $type) {
-            $view = 'PackagistWebBundle:Web:tagAndType.html.twig';
-        }
+        $data['packages'] = $this->setupPager($packages, $page);
+        $data['searchForm'] = $this->createSearchForm()->createView();
 
-        return $this->render(
-            $view,
-            array_merge(
-                array('packages' => $this->setupPager($packages, $page)),
-                $extraViewOptions
-            )
-        );
+        return $data;
     }
 
     /**

+ 32 - 19
src/Packagist/WebBundle/Entity/PackageRepository.php

@@ -119,7 +119,7 @@ class PackageRepository extends EntityRepository
         return $qb->getQuery()->getSingleResult();
     }
 
-    public function getFullPackages(array $ids = null, $filterFields = array())
+    public function getFullPackages(array $ids = null, $filters = array())
     {
         $qb = $this->getEntityManager()->createQueryBuilder();
         $qb->select('p', 'v', 't', 'a', 'req', 'devReq', 'sug', 'rep', 'con', 'pro')
@@ -136,36 +136,49 @@ class PackageRepository extends EntityRepository
             ->orderBy('v.development', 'DESC')
             ->addOrderBy('v.releasedAt', 'DESC');
 
-        foreach ($filterFields as $name => $value) {
-            $qb->andWhere('p.' . $name . ' = :' . $name);
-        }
-        $qb->setParameters($filterFields);
-
         if (null !== $ids) {
             $qb->where($qb->expr()->in('p.id', ':ids'))
                 ->setParameter('ids', $ids);
         }
 
+        $this->addFilters($qb, $filters);
+
         return $qb->getQuery()->getResult();
     }
 
-    public function getQueryBuilderByTag($name)
+    public function getFilteredQueryBuilder(array $filters = array())
     {
-        return $this->getBaseQueryBuilder()
-            // eliminate maintainers & tags from the select, because of the groupBy
-            ->select('p', 'v')
-            ->where('t.name = ?0')
-            ->setParameters(array($name));
+        $qb = $this->getBaseQueryBuilder()
+            ->select('p', 'v');
+
+        $this->addFilters($qb, $filters);
+
+        return $qb;
     }
 
-    public function getQueryBuilderByMaintainer(User $user)
+    private function addFilters($qb, array $filters)
     {
-        $qb = $this->getBaseQueryBuilder()
-            // eliminate maintainers & tags from the select, because of the groupBy
-            ->select('p', 'v')
-            ->where('m.id = ?0')
-            ->setParameters(array($user->getId()));
-        return $qb;
+        foreach ($filters as $name => $value) {
+            if (null === $value) {
+                continue;
+            }
+
+            switch ($name) {
+                case 'tag':
+                    $qb->andWhere($qb->expr()->in('t.name', ':'.$name));
+                    break;
+
+                case 'maintainer':
+                    $qb->andWhere($qb->expr()->in('m.id', ':'.$name));
+                    break;
+
+                default:
+                    $qb->andWhere($qb->expr()->in('p.'.$name, ':'.$name));
+                    break;
+            }
+
+            $qb->setParameter($name, $value);
+        }
     }
 
     public function getBaseQueryBuilder()

+ 5 - 5
src/Packagist/WebBundle/Package/Dumper.php

@@ -129,18 +129,18 @@ class Dumper
         }
 
         // prepare root file
-        $rootFile = $buildDir.'/packages.json';
+        $rootFile = $buildDir.'/packages_root.json';
         $this->loadFile($rootFile);
-        if (!isset($this->files['packages.json']['packages'])) {
-            $this->files['packages.json']['packages'] = array();
+        if (!isset($this->files['packages_root.json']['packages'])) {
+            $this->files['packages_root.json']['packages'] = array();
         }
         $url = $this->router->generate('track_download', array('name' => 'VND/PKG'));
-        $this->files['packages.json']['notify'] = str_replace('VND/PKG', '%package%', $url);
+        $this->files['packages_root.json']['notify'] = str_replace('VND/PKG', '%package%', $url);
 
         // dump files to build dir
         foreach ($modifiedFiles as $file => $dummy) {
             $this->dumpFile($buildDir.'/'.$file);
-            $this->files['packages.json']['includes'][$file] = array('sha1' => sha1_file($buildDir.'/'.$file));
+            $this->files['packages_root.json']['includes'][$file] = array('sha1' => sha1_file($buildDir.'/'.$file));
         }
         $this->dumpFile($rootFile);
 

+ 9 - 0
src/Packagist/WebBundle/Resources/views/Web/browse.html.twig

@@ -1,5 +1,14 @@
 {% extends "PackagistWebBundle:Web:list.html.twig" %}
 
+{% set filters = [] %}
+
+{% if type %}{% set filters = filters|merge(["of type #{type|join(' or ')}"]) %}{% endif %}
+{% if tag %}{% set filters = filters|merge(["tagged with #{tag|join(' or ')}"]) %}{% endif %}
+
+{% block content_title %}
+    <h1>Packages {{ filters|join(' and ') }}</h1>
+{% endblock %}
+
 {# TODO:
 
 - Add browsing by tag, type, most required, ..

+ 0 - 5
src/Packagist/WebBundle/Resources/views/Web/tag.html.twig

@@ -1,5 +0,0 @@
-{% extends "PackagistWebBundle:Web:list.html.twig" %}
-
-{% block content_title %}
-    <h1>Packages tagged with {{ tag }}</h1>
-{% endblock %}

+ 0 - 5
src/Packagist/WebBundle/Resources/views/Web/tagAndType.html.twig

@@ -1,5 +0,0 @@
-{% extends "PackagistWebBundle:Web:list.html.twig" %}
-
-{% block content_title %}
-    <h1>Packages of type {{ type }} and tagged with {{ tag }}</h1>
-{% endblock %}

+ 0 - 5
src/Packagist/WebBundle/Resources/views/Web/type.html.twig

@@ -1,5 +0,0 @@
-{% extends "PackagistWebBundle:Web:list.html.twig" %}
-
-{% block content_title %}
-    <h1>Packages of type {{ type }}</h1>
-{% endblock %}