Bläddra i källkod

Add per-package feed and feeds page to show them all off, fixes #241

Jordi Boggiano 12 år sedan
förälder
incheckning
b263dbd30d

+ 37 - 0
src/Packagist/WebBundle/Controller/FeedController.php

@@ -23,6 +23,7 @@ use Packagist\WebBundle\Entity\Version;
 use Symfony\Component\HttpFoundation\Response;
 use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
 use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
+use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
 
 /**
  * @author Rafael Dohms <rafael@doh.ms>
@@ -31,6 +32,15 @@ use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
  */
 class FeedController extends Controller
 {
+    /**
+     * @Route("/", name="feeds")
+     * @Template
+     */
+    public function feedsAction()
+    {
+        return array();
+    }
+
     /**
      * @Route(
      *     "/packages.{_format}",
@@ -109,6 +119,32 @@ class FeedController extends Controller
         return $this->buildResponse($feed);
     }
 
+    /**
+     * @Route(
+     *     "/package.{package}.{_format}",
+     *     name="feed_package",
+     *     requirements={"_format"="(rss|atom)", "package"="[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+"}
+     * )
+     * @Method({"GET"})
+     */
+    public function packageAction($package)
+    {
+        /** @var $repo \Packagist\WebBundle\Entity\PackageRepository */
+        $repo = $this->getDoctrine()->getRepository('PackagistWebBundle:Version');
+        $packages = $this->getLimitedResults(
+            $repo->getQueryBuilderForLatestVersionWithPackage(null, $package)
+        );
+
+        $feed = $this->buildFeed(
+            "$package releases",
+            "Latest releases on Packagist of $package.",
+            $this->generateUrl('view_package', array('name' => $package), true),
+            $packages
+        );
+
+        return $this->buildResponse($feed);
+    }
+
     /**
      * Limits a query to the desired number of results
      *
@@ -142,6 +178,7 @@ class FeedController extends Controller
         $feed->setTitle($title);
         $feed->setDescription($description);
         $feed->setLink($url);
+        $feed->setGenerator('Packagist');
 
         foreach ($items as $item) {
             $entry = $feed->createEntry();

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

@@ -72,9 +72,10 @@ class VersionRepository extends EntityRepository
      * Returns the latest versions released
      *
      * @param string $vendor optional vendor filter
+     * @param string $package optional vendor/package filter
      * @return \Doctrine\ORM\QueryBuilder
      */
-    public function getQueryBuilderForLatestVersionWithPackage($vendor = null)
+    public function getQueryBuilderForLatestVersionWithPackage($vendor = null, $package = null)
     {
         $qb = $this->getEntityManager()->createQueryBuilder();
         $qb->select('v', 't', 'a', 'p')
@@ -90,6 +91,11 @@ class VersionRepository extends EntityRepository
             $qb->setParameter(0, $vendor.'/%');
         }
 
+        if ($package) {
+            $qb->andWhere('p.name = ?0')
+                ->setParameter(0, $package);
+        }
+
         return $qb;
     }
 }

+ 1 - 0
src/Packagist/WebBundle/Resources/translations/messages.en.yml

@@ -1,5 +1,6 @@
 menu:
     about_packagist: About Packagist
+    rss_feeds: Atom/RSS Feeds
     about_composer: About Composer
     home: Home
     profile: Profile

+ 20 - 0
src/Packagist/WebBundle/Resources/views/Feed/feeds.html.twig

@@ -0,0 +1,20 @@
+{% extends "PackagistWebBundle::layout.html.twig" %}
+
+{% block content %}
+    {% set packageCount = 0 %}
+    <div class="box clearfix">
+        <h1>Atom/RSS Feeds</h1>
+
+        <h2>Global Feeds</h2>
+        <p>Newly Submitted Packages: <a href="{{ url('feed_packages', {_format: 'rss'}) }}">RSS</a>, <a href="{{ url('feed_packages', {_format: 'atom'}) }}">Atom</a></p>
+        <p>New Releases: <a href="{{ url('feed_releases', {_format: 'rss'}) }}">RSS</a>, <a href="{{ url('feed_releases', {_format: 'atom'}) }}">Atom</a></p>
+
+        <h2>Vendor Feeds</h2>
+        <p>New Releases for a specific vendor namespace: <code>{{ url('feed_vendor', {vendor: 'XXX', _format: 'rss'})|replace({XXX: '%vendor%'}) }}</code></p>
+        <p>Replace <code>%vendor%</code> by the vendor name, and change rss to atom if you would like an atom feed.</p>
+
+        <h2>Package Feeds</h2>
+        <p>New Releases for a specific package: <code>{{ url('feed_package', {package: 'X/X', _format: 'rss'})|replace({'X/X': '%vendor/package%'}) }}</code></p>
+        <p>Replace <code>%vendor/package%</code> by the package name, and change rss to atom if you would like an atom feed.</p>
+    </div>
+{% endblock %}

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

@@ -2,6 +2,11 @@
 
 {% block title %}{{ package.name }} - {{ parent() }}{% endblock %}
 
+{% block head_additions %}
+    <link rel="alternate" type="application/rss+xml" title="New Releases - {{ package.name }}" href="{{ url('feed_package', {package: package.name, _format: 'rss'}) }}" />
+    <link rel="alternate" type="application/rss+xml" title="New Releases - {{ package.vendor }}" href="{{ url('feed_vendor', {vendor: package.vendor, _format: 'rss'}) }}" />
+{% endblock %}
+
 {% block scripts %}
     <script src="{{ asset('bundles/packagistweb/js/view.js?v=6')}}"></script>
 {% endblock %}

+ 1 - 0
src/Packagist/WebBundle/Resources/views/layout.html.twig

@@ -83,6 +83,7 @@
         <footer>
             <ul>
                 <li><a href="{{ path('about') }}">{{ 'menu.about_packagist'|trans }}</a></li>
+                <li><a href="{{ path('feeds') }}">{{ 'menu.rss_feeds'|trans }}</a></li>
                 <li><a href="{{ path('home') }}">{{ 'menu.home'|trans }}</a></li>
             </ul>
             <ul>