瀏覽代碼

Package: allow updates to be triggered by every logged in user if last updatedAt was > 24 hours ago

Stephan Vock 5 年之前
父節點
當前提交
c55c56b2a7

+ 6 - 1
src/Packagist/WebBundle/Controller/PackageController.php

@@ -659,7 +659,8 @@ class PackageController extends Controller
             return new JsonResponse(['status' => 'error', 'message' => 'Invalid credentials'], 403);
         }
 
-        if ($package->getMaintainers()->contains($user) || $this->isGranted('ROLE_UPDATE_PACKAGES')) {
+        $canUpdatePackage = $package->getMaintainers()->contains($user) || $this->isGranted('ROLE_UPDATE_PACKAGES');
+        if ($canUpdatePackage || !$package->wasUpdatedInTheLast24Hours()) {
             if (null !== $autoUpdated) {
                 $package->setAutoUpdated($autoUpdated ? Package::AUTO_MANUAL_HOOK : 0);
                 $doctrine->getManager()->flush();
@@ -674,6 +675,10 @@ class PackageController extends Controller
             return new JsonResponse(['status' => 'success'], 202);
         }
 
+        if (!$canUpdatePackage && $package->wasUpdatedInTheLast24Hours()) {
+            return new JsonResponse(['status' => 'error', 'message' => 'Package was already updated in the last 24 hours',], 404);
+        }
+
         return new JsonResponse(array('status' => 'error', 'message' => 'Could not find a package that matches this request (does user maintain the package?)',), 404);
     }
 

+ 5 - 0
src/Packagist/WebBundle/Entity/Package.php

@@ -721,6 +721,11 @@ class Package
         return $this->updatedAt;
     }
 
+    public function wasUpdatedInTheLast24Hours(): bool
+    {
+        return $this->updatedAt > new \DateTime('-24 hours');
+    }
+
     /**
      * Set crawledAt
      *

+ 7 - 0
src/Packagist/WebBundle/Resources/views/package/view_package.html.twig

@@ -125,6 +125,13 @@
                                 </form>
                             {% endif %}
                         </div>
+                    {% elseif app.user and not package.wasUpdatedInTheLast24Hours() %}
+                        <div class="btn-group btn-group-xs">
+                                <form class="force-update action" action="{{ path('update_package', {name: package.name}) }}" method="PUT">
+                                    <input type="hidden" name="update" value="1" />
+                                    <input class="btn btn-success" type="submit" value="Update" />
+                                </form>
+                        </div>
                     {% endif %}
                 </div>
 

+ 21 - 0
src/Packagist/WebBundle/Tests/Entity/PackageTest.php

@@ -0,0 +1,21 @@
+<?php declare(strict_types=1);
+
+namespace Packagist\WebBundle\Tests\Entity;
+
+use Packagist\WebBundle\Entity\Package;
+use PHPUnit\Framework\TestCase;
+
+class PackageTest extends TestCase
+{
+    public function testWasUpdatedInTheLast24Hours(): void
+    {
+        $package = new Package();
+        $this->assertFalse($package->wasUpdatedInTheLast24Hours());
+
+        $package->setUpdatedAt(new \DateTime('2019-01-01'));
+        $this->assertFalse($package->wasUpdatedInTheLast24Hours());
+
+        $package->setUpdatedAt(new \DateTime('now'));
+        $this->assertTrue($package->wasUpdatedInTheLast24Hours());
+    }
+}