Browse Source

Add /packages/updated.json endpoint

Jordi Boggiano 6 years ago
parent
commit
b1ea63d1ee

+ 27 - 0
src/Packagist/WebBundle/Controller/PackageController.php

@@ -30,6 +30,7 @@ use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
 use Symfony\Component\Security\Core\Exception\AccessDeniedException;
 use Composer\Package\Version\VersionParser;
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
 use DateTimeImmutable;
 use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
 use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
@@ -81,6 +82,32 @@ class PackageController extends Controller
         return new JsonResponse(array('packageNames' => $names));
     }
 
+    /**
+     * @Route("/packages/updated.json", name="updated_packages", defaults={"_format"="json"})
+     * @Method({"GET"})
+     */
+    public function updatedSinceAction(Request $req)
+    {
+        $since = $req->query->get('since');
+        if (!$since) {
+            return new JsonResponse(['error' => 'Missing "since" query parameter with the latest timestamp you got from this endpoint'], 400);
+        }
+
+        $now = time();
+        try {
+            $since = new DateTimeImmutable('@'.$since);
+        } catch (\Exception $e) {
+            return new JsonResponse(['error' => 'Invalid "since" query parameter, make sure you store the timestamp returned and re-use it in the next query. Use '.$this->generateUrl('updated_packages', ['since' => time() - 60], UrlGeneratorInterface::ABSOLUTE_URL).' to initialize it.'], 400);
+        }
+
+        /** @var PackageRepository $repo */
+        $repo = $this->getDoctrine()->getRepository('PackagistWebBundle:Package');
+
+        $names = $repo->getPackageNamesUpdatedSince($since);
+
+        return new JsonResponse(['packageNames' => $names, 'timestamp' => $now]);
+    }
+
     /**
      * @Template()
      * @Route("/packages/submit", name="submit")

+ 14 - 0
src/Packagist/WebBundle/Entity/PackageRepository.php

@@ -36,6 +36,20 @@ class PackageRepository extends EntityRepository
         return $query->getResult();
     }
 
+    public function getPackageNamesUpdatedSince(\DateTimeInterface $date)
+    {
+        $query = $this->getEntityManager()
+            ->createQuery("
+                SELECT p.name FROM Packagist\WebBundle\Entity\Package p
+                WHERE p.dumpedAt >= :date AND (p.replacementPackage IS NULL OR p.replacementPackage != 'spam/spam')
+            ")
+            ->setParameters(['date' => $date]);
+
+        $names = $this->getPackageNamesForQuery($query);
+
+        return array_map('strtolower', $names);
+    }
+
     public function getPackageNames()
     {
         $query = $this->getEntityManager()