فهرست منبع

Add delete button to versions

@seldaek indicated on IRC that he would very much love to be able to delete
versions using the web interface of packagist. Since I figured it shouldn't
be much work and he just deleted a version for me I decided to throw some time
against the issue and behold! A new button!

The button only appears if the current user is maintainer or has the
ROLE_EDIT_PACKAGES role; the action executing this code is also protected using
same credentials.

This button replicates the behaviour of the clearVersionsCommand as indicated
by Seldaek.

I have tested this in a local setup.
Mike van Riel 12 سال پیش
والد
کامیت
4bfdcb353b

+ 46 - 1
src/Packagist/WebBundle/Controller/WebController.php

@@ -393,14 +393,59 @@ class WebController extends Controller
      */
      */
     public function viewPackageVersionAction(Request $req, $versionId)
     public function viewPackageVersionAction(Request $req, $versionId)
     {
     {
+        /** @var \Packagist\WebBundle\Entity\VersionRepository $repo  */
         $repo = $this->getDoctrine()->getRepository('PackagistWebBundle:Version');
         $repo = $this->getDoctrine()->getRepository('PackagistWebBundle:Version');
+
+        /** @var Version $version  */
         $version = $repo->getFullVersion($versionId);
         $version = $repo->getFullVersion($versionId);
+        $package = $version->getPackage();
+
+        $is_maintainer    = $package->getMaintainers()->contains($this->getUser());
+        $may_edit_package = $this->get('security.context')->isGranted('ROLE_EDIT_PACKAGES');
 
 
-        $html = $this->renderView('PackagistWebBundle:Web:versionDetails.html.twig', array('version' => $version));
+        $html = $this->renderView(
+            'PackagistWebBundle:Web:versionDetails.html.twig',
+            array(
+                'version'    => $version,
+                'may_delete' => $is_maintainer || $may_edit_package,
+            )
+        );
 
 
         return new JsonResponse(array('content' => $html));
         return new JsonResponse(array('content' => $html));
     }
     }
 
 
+    /**
+     * @Template()
+     * @Route(
+     *     "/versions/{versionId}/delete",
+     *     name="delete_version",
+     *     requirements={"name"="[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+?", "versionId"="[0-9]+"}
+     * )
+     * @Method({"DELETE"})
+     */
+    public function deletePackageVersionAction(Request $req, $versionId)
+    {
+        /** @var \Packagist\WebBundle\Entity\VersionRepository $repo  */
+        $repo = $this->getDoctrine()->getRepository('PackagistWebBundle:Version');
+
+        /** @var Version $version  */
+        $version = $repo->getFullVersion($versionId);
+        $package = $version->getPackage();
+
+        $is_maintainer    = $package->getMaintainers()->contains($this->getUser());
+        $may_edit_package = $this->get('security.context')->isGranted('ROLE_EDIT_PACKAGES');
+
+        if (!$is_maintainer || !$$may_edit_package) {
+            throw new AccessDeniedException;
+        }
+
+        $repo->remove($version);
+        $this->getDoctrine()->getManager()->flush();
+        $this->getDoctrine()->getManager()->clear();
+
+        return new RedirectResponse($this->generateUrl('view_package', array('name' => $package->getName())));
+    }
+
     /**
     /**
      * @Template()
      * @Template()
      * @Route("/packages/{name}", name="update_package", requirements={"name"="[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+"}, defaults={"_format" = "json"})
      * @Route("/packages/{name}", name="update_package", requirements={"name"="[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+"}, defaults={"_format" = "json"})

+ 7 - 0
src/Packagist/WebBundle/Resources/views/Web/versionDetails.html.twig

@@ -1,5 +1,12 @@
 {% import "PackagistWebBundle::macros.html.twig" as packagist %}
 {% import "PackagistWebBundle::macros.html.twig" as packagist %}
 
 
+{% if may_delete is defined and may_delete %}
+<form class="action" action="{{ path("delete_version", {"versionId": version.id}) }}" method="post">
+    <input type="hidden" name="_method" value="DELETE" />
+    <input type="submit" value="Delete">
+</form>
+{% endif %}
+
 <p class="requireme">require: <input type="text" readonly="readonly" value="{{ "\"#{version.package.vendor}/#{version.package.packageName}\": \"#{version.hasVersionAlias() ? version.versionAlias : version.version}\"" }}" /></p>
 <p class="requireme">require: <input type="text" readonly="readonly" value="{{ "\"#{version.package.vendor}/#{version.package.packageName}\": \"#{version.hasVersionAlias() ? version.versionAlias : version.version}\"" }}" /></p>
 
 
 <h2 class="authors">Author{{ version.authors|length > 1 ? 's' : '' }}</h2>
 <h2 class="authors">Author{{ version.authors|length > 1 ? 's' : '' }}</h2>