Browse Source

Add some params to the list API

Jordi Boggiano 10 years ago
parent
commit
f90b58d670

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

@@ -203,18 +203,29 @@ class WebController extends Controller
     /**
      * @Route("/packages/list.json", name="list", defaults={"_format"="json"})
      * @Method({"GET"})
-     * @Cache(smaxage=60)
+     * @Cache(smaxage=300)
      */
     public function listAction(Request $req)
     {
         $repo = $this->getDoctrine()->getRepository('PackagistWebBundle:Package');
+        $fields = (array) $req->query->get('fields', array());
+        $fields = array_intersect($fields, array('repository', 'type'));
+
+        if ($fields) {
+            $filters = array_filter(array(
+                'type' => $req->query->get('type'),
+                'vendor' => $req->query->get('vendor'),
+            ));
+
+            return new JsonResponse(array('packages' => $repo->getPackagesWithFields($filters, $fields)));
+        }
 
         if ($req->query->get('type')) {
             $names = $repo->getPackageNamesByType($req->query->get('type'));
         } elseif ($req->query->get('vendor')) {
             $names = $repo->getPackageNamesByVendor($req->query->get('vendor'));
         } else {
-            $names = array_keys($repo->getPackageNames());
+            $names = $repo->getPackageNames();
         }
 
         return new JsonResponse(array('packageNames' => $names));

+ 34 - 2
src/Packagist/WebBundle/Entity/PackageRepository.php

@@ -36,7 +36,7 @@ class PackageRepository extends EntityRepository
 
     public function packageExists($name)
     {
-        $packages = $this->getPackageNames();
+        $packages = $this->getRawPackageNames();
 
         return isset($packages[$name]) || in_array(strtolower($name), $packages, true);
     }
@@ -48,7 +48,12 @@ class PackageRepository extends EntityRepository
         return isset($packages[$name]) || in_array(strtolower($name), $packages, true);
     }
 
-    public function getPackageNames()
+    public function getPackageNames($fields = array())
+    {
+        return array_keys($this->getRawPackageNames());
+    }
+
+    public function getRawPackageNames()
     {
         if (null !== $this->packageNames) {
             return $this->packageNames;
@@ -137,6 +142,33 @@ class PackageRepository extends EntityRepository
         return $this->getPackageNamesForQuery($query);
     }
 
+    public function getPackagesWithFields($filters, $fields)
+    {
+        $selector = '';
+        foreach ($fields as $field) {
+            $selector .= ', p.'.$field;
+        }
+        $where = '';
+        foreach ($filters as $filter => $val) {
+            $where .= 'p.'.$filter.' = :'.$filter;
+        }
+        if ($where) {
+            $where = 'WHERE '.$where;
+        }
+        $query = $this->getEntityManager()
+            ->createQuery("SELECT p.name $selector  FROM Packagist\WebBundle\Entity\Package p $where")
+            ->setParameters($filters);
+
+        $result = array();
+        foreach ($query->getScalarResult() as $row) {
+            $name = $row['name'];
+            unset($row['name']);
+            $result[$name] = $row;
+        }
+
+        return $result;
+    }
+
     private function getPackageNamesForQuery($query)
     {
         $names = array();