Browse Source

Update packages on submit, added POST only API to update packages on demand

Beau Simensen 13 years ago
parent
commit
259a0811da
1 changed files with 62 additions and 3 deletions
  1. 62 3
      src/Packagist/WebBundle/Controller/WebController.php

+ 62 - 3
src/Packagist/WebBundle/Controller/WebController.php

@@ -12,10 +12,13 @@
 
 namespace Packagist\WebBundle\Controller;
 
+use Composer\IO\NullIO;
+use Composer\Repository\VcsRepository;
 use Packagist\WebBundle\Form\Type\AddMaintainerRequestType;
 use Packagist\WebBundle\Form\Model\AddMaintainerRequest;
 use Packagist\WebBundle\Form\Type\SearchQueryType;
 use Packagist\WebBundle\Form\Model\SearchQuery;
+use Packagist\WebBundle\Package\Updater;
 use Symfony\Bundle\FrameworkBundle\Controller\Controller;
 use Packagist\WebBundle\Entity\Package;
 use Packagist\WebBundle\Entity\Version;
@@ -130,8 +133,9 @@ class WebController extends Controller
      */
     public function submitPackageAction()
     {
+        $doctrine = $this->getDoctrine();
         $package = new Package;
-        $package->setEntityRepository($this->getDoctrine()->getRepository('PackagistWebBundle:Package'));
+        $package->setEntityRepository($doctrine->getRepository('PackagistWebBundle:Package'));
         $form = $this->createForm(new PackageType, $package);
 
         $request = $this->getRequest();
@@ -141,11 +145,17 @@ class WebController extends Controller
                 try {
                     $user = $this->getUser();
                     $package->addMaintainer($user);
-                    $em = $this->getDoctrine()->getEntityManager();
+                    $em = $doctrine->getEntityManager();
                     $em->persist($package);
+
+                    $updater = new Updater($doctrine);
+
+                    $repository = new VcsRepository(array('url' => $package->getRepository()), new NullIO);
+                    $updater->update($package, $repository);
+
                     $em->flush();
 
-                    $this->get('session')->setFlash('success', $package->getName().' has been added to the package list, the repository will be parsed for releases soon.');
+                    $this->get('session')->setFlash('success', $package->getName().' has been added');
 
                     return new RedirectResponse($this->generateUrl('view_package', array('name' => $package->getName())));
                 } catch (\Exception $e) {
@@ -213,6 +223,7 @@ class WebController extends Controller
     /**
      * @Template()
      * @Route("/packages/{name}", name="view_package", requirements={"name"="[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+"})
+     * @Method({"GET"})
      */
     public function viewPackageAction($name)
     {
@@ -236,6 +247,54 @@ class WebController extends Controller
         return $data;
     }
 
+    /**
+     * @Template()
+     * @Route("/packages/{name}", name="update_package", requirements={"name"="[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+"}, defaults={"_format" = "json"})
+     * @Method({"POST"})
+     */
+    public function updatePackageAction($name)
+    {
+        $doctrine = $this->getDoctrine();
+
+        try {
+            $package = $doctrine
+                ->getRepository('PackagistWebBundle:Package')
+                ->getFullPackageByName($name);
+        } catch (\Doctrine\ORM\NoResultException $e) {
+            return new Response(json_encode(array('status' => 'error', 'message' => 'Package not found',)), 404);
+        }
+
+        $request = $this->getRequest();
+
+        $username = $request->request->has('username') ?
+            $request->request->get('username') :
+            $request->query->get('username');
+
+        $apiToken = $request->request->has('apiToken') ?
+            $request->request->get('apiToken') :
+            $request->query->get('apiToken');
+
+        $user = $doctrine
+            ->getRepository('PackagistWebBundle:User')
+            ->findOneBy(array('username' => $username, 'apiToken' => $apiToken));
+
+        if (!$user) {
+            return new Response(json_encode(array('status' => 'error', 'message' => 'Invalid credentials',)), 403);
+        }
+
+        if ($package->getMaintainers()->contains($user)) {
+            $updater = new Updater($doctrine);
+
+            $repository = new VcsRepository(array('url' => $package->getRepository()), new NullIO);
+            $package->setAutoUpdated(true);
+            $updater->update($package, $repository);
+
+            return new Response('{"status": "success"}', 202);
+        }
+
+        return new Response(json_encode(array('status' => 'error', 'message' => 'Could not find a package that matches this request (does user maintain the package?)',)), 404);
+    }
+
     /**
      * @Template("PackagistWebBundle:Web:viewPackage.html.twig")
      * @Route("/packages/{name}/maintainers/", name="add_maintainer", requirements={"name"="[A-Za-z0-9_.-]+/[A-Za-z0-9/_.-]+"})