Browse Source

Configuring feed counts

- added `packagist_web.rss_max_items` parameter to configure items per feed.
Rafael Dohms 12 years ago
parent
commit
275db3e678

+ 38 - 9
src/Packagist/WebBundle/Controller/FeedController.php

@@ -55,9 +55,16 @@ class FeedController extends Controller
     {
         /** @var $repo \Packagist\WebBundle\Entity\VersionRepository */
         $repo = $this->getDoctrine()->getRepository('PackagistWebBundle:Version');
-        $packages = $repo->getLatestVersionWithPackage();
+        $packages = $repo->getLatestVersionWithPackage(
+            $this->container->getParameter('packagist_web.rss_max_items')
+        );
 
-        $feed = $this->buildFeed('Latest Packages', 'Latest packages updated on Packagist.', $packages, $format);
+        $feed = $this->buildFeed(
+            'Latest Packages',
+            'Latest packages updated on Packagist.',
+            $packages,
+            $format
+        );
 
         return $this->buildResponse($feed, $format);
     }
@@ -75,9 +82,16 @@ class FeedController extends Controller
     {
         /** @var $repo \Packagist\WebBundle\Entity\PackageRepository */
         $repo = $this->getDoctrine()->getRepository('PackagistWebBundle:Package');
-        $packages = $repo->getNewestPackages();
+        $packages = $repo->getNewestPackages(
+            $this->container->getParameter('packagist_web.rss_max_items')
+        );
 
-        $feed = $this->buildFeed('Latest Released Packages', 'Latest packages added to Packagist.', $packages, $format);
+        $feed = $this->buildFeed(
+            'Latest Released Packages',
+            'Latest packages added to Packagist.',
+            $packages,
+            $format
+        );
 
         return $this->buildResponse($feed, $format);
     }
@@ -95,9 +109,17 @@ class FeedController extends Controller
     {
         /** @var $repo \Packagist\WebBundle\Entity\PackageRepository */
         $repo = $this->getDoctrine()->getRepository('PackagistWebBundle:Package');
-        $packages = $repo->getLatestPackagesByVendor($filter);
-
-        $feed = $this->buildFeed("$filter Packages", "Latest packages updated on Packagist for $filter.", $packages, $format);
+        $packages = $repo->getLatestPackagesByVendor(
+            $filter,
+            $this->container->getParameter('packagist_web.rss_max_items')
+        );
+
+        $feed = $this->buildFeed(
+            "$filter Packages",
+            "Latest packages updated on Packagist for $filter.",
+            $packages,
+            $format
+        );
 
         return $this->buildResponse($feed, $format);
     }
@@ -163,7 +185,13 @@ class FeedController extends Controller
     protected function populatePackageData($entry, $package)
     {
         $entry->setTitle($package->getPackageName());
-        $entry->setLink($this->generateUrl('view_package', array('name' => $package->getName()), true));
+        $entry->setLink(
+            $this->generateUrl(
+                'view_package',
+                array('name' => $package->getName()),
+                true
+            )
+        );
 
         $entry->setDateModified($package->getUpdatedAt());
         $entry->setDateCreated($package->getCreatedAt());
@@ -200,8 +228,9 @@ class FeedController extends Controller
     {
         $content = $feed->export($format);
         $etag = md5($content);
+        $headers = array('Content-Type' => "application/$format+xml");
 
-        $response = new Response($content, 200, array('Content-Type' => "application/$format+xml"));
+        $response = new Response($content, 200, $headers);
         $response->setEtag($etag);
         $response->setSharedMaxAge(3600);
 

+ 30 - 0
src/Packagist/WebBundle/DependencyInjection/Configuration.php

@@ -0,0 +1,30 @@
+<?php
+
+namespace Packagist\WebBundle\DependencyInjection;
+
+use Symfony\Component\Config\Definition\Builder\TreeBuilder;
+use Symfony\Component\Config\Definition\ConfigurationInterface;
+
+/**
+ * This is the class that validates and merges configuration from your app/config files
+ *
+ * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html#cookbook-bundles-extension-config-class}
+ */
+class Configuration implements ConfigurationInterface
+{
+    /**
+     * {@inheritDoc}
+     * @return \Symfony\Component\Config\Definition\Builder\TreeBuilder
+     */
+    public function getConfigTreeBuilder()
+    {
+        $treeBuilder = new TreeBuilder();
+        $rootNode = $treeBuilder->root('packagist_web');
+
+        $rootNode->children()
+                    ->scalarNode('rss_max_items')->defaultValue(40)->end()
+                 ->end();
+
+        return $treeBuilder;
+    }
+}

+ 6 - 1
src/Packagist/WebBundle/DependencyInjection/PackagistWebExtension.php

@@ -24,7 +24,12 @@ class PackagistWebExtension extends Extension
 {
     public function load(array $configs, ContainerBuilder $container)
     {
+        $configuration = new Configuration();
+        $config = $this->processConfiguration($configuration, $configs);
+
         $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
         $loader->load('services.yml');
+
+        $container->setParameter('packagist_web.rss_max_items', $config['rss_max_items']);
     }
-}
+}

+ 25 - 11
src/Packagist/WebBundle/Entity/PackageRepository.php

@@ -215,26 +215,36 @@ class PackageRepository extends EntityRepository
         return $qb;
     }
 
-    public function getLatestPackages()
-    {
-        $qb = $this->getBaseQueryBuilder();
-
-        $qb->orderBy('v.releasedAt', 'DESC');
-
-        return $qb->getQuery()->getResult();
-    }
-
-    public function getNewestPackages()
+    /**
+     * Gets the most recent packages created
+     *
+     * @param int|null $max
+     *
+     * @return array
+     */
+    public function getNewestPackages($max = null)
     {
         $qb = $this->getBaseQueryBuilder();
 
         $qb->orderBy('p.createdAt', 'DESC');
         $qb->addOrderBy('v.releasedAt', 'DESC');
 
+        if ($max !== null) {
+            $qb->setMaxResults($max);
+        }
+
         return $qb->getQuery()->getResult();
     }
 
-    public function getLatestPackagesByVendor($vendor)
+    /**
+     * Gets the latest packages/versions released by a selected vendor
+     *
+     * @param string $vendor
+     * @param int|null $max
+     *
+     * @return array
+     */
+    public function getLatestPackagesByVendor($vendor, $max = null)
     {
         $qb = $this->getBaseQueryBuilder();
 
@@ -243,6 +253,10 @@ class PackageRepository extends EntityRepository
         $qb->where('p.name LIKE ?0');
         $qb->setParameter(0, $vendor.'/%');
 
+        if ($max !== null) {
+            $qb->setMaxResults($max);
+        }
+
         return $qb->getQuery()->getResult();
     }
 }

+ 7 - 1
src/Packagist/WebBundle/Entity/VersionRepository.php

@@ -71,9 +71,11 @@ class VersionRepository extends EntityRepository
     /**
      * Returns the latest versions released
      *
+     * @param int|null $max
+     *
      * @return array
      */
-    public function getLatestVersionWithPackage()
+    public function getLatestVersionWithPackage($max = null)
     {
         $qb = $this->getEntityManager()->createQueryBuilder();
         $qb->select('v', 't', 'a', 'p')
@@ -83,6 +85,10 @@ class VersionRepository extends EntityRepository
             ->leftJoin('v.package', 'p')
             ->orderBy('v.releasedAt', 'DESC');
 
+        if ($max !== null) {
+            $qb->setMaxResults($max);
+        }
+
         return $qb->getQuery()->getResult();
     }
 }