]> BookStack Code Mirror - bookstack/commitdiff
Added ability to configure revision limit
authorDan Brown <redacted>
Sat, 22 Sep 2018 16:30:42 +0000 (17:30 +0100)
committerDan Brown <redacted>
Sat, 22 Sep 2018 16:30:42 +0000 (17:30 +0100)
app/Repos/EntityRepo.php
composer.json
config/app.php
tests/Entity/PageRevisionTest.php

index 1167ea7daa849c5b34ee8b5bd61da6b8eb722c2d..d6736886ee2cbf3a4feb4293621957021c8b4cc1 100644 (file)
@@ -746,10 +746,13 @@ class EntityRepo
         $revision->revision_number = $page->revision_count;
         $revision->save();
 
-        // Clear old revisions
-        if ($this->pageRevision->where('page_id', '=', $page->id)->count() > 50) {
-            $this->pageRevision->where('page_id', '=', $page->id)
-                ->orderBy('created_at', 'desc')->skip(50)->take(5)->delete();
+        $revisionLimit = config('app.revision_limit');
+        if ($revisionLimit !== false) {
+            $revisionsToDelete = $this->pageRevision->where('page_id', '=', $page->id)
+                ->orderBy('created_at', 'desc')->skip(intval($revisionLimit))->take(10)->get(['id']);
+            if ($revisionsToDelete->count() > 0) {
+                $this->pageRevision->whereIn('id', $revisionsToDelete->pluck('id'))->delete();
+            }
         }
 
         return $revision;
index c9eb3821c8b4ac4703fd87da0df860eef3e9ecd8..318dbb3a631596370c636160896fc26660c69389 100644 (file)
@@ -6,9 +6,10 @@
     "type": "project",
     "require": {
         "php": ">=7.0.0",
+        "ext-tidy": "*",
+        "ext-dom": "*",
         "laravel/framework": "~5.5.42",
         "fideloper/proxy": "~3.3",
-        "ext-tidy": "*",
         "intervention/image": "^2.4",
         "laravel/socialite": "^3.0",
         "league/flysystem-aws-s3-v3": "^1.0",
index 21ac6441b625ded577e03bcb83d1b9328428cc9a..9b5ac2f8c025f0b1dfd558c1ab59ffa1fc49e2d1 100755 (executable)
@@ -12,6 +12,13 @@ return [
         'books' => env('APP_VIEWS_BOOKS', 'list')
     ],
 
+    /**
+     * The number of revisions to keep in the database.
+     * Once this limit is reached older revisions will be deleted.
+     * If set to false then a limit will not be enforced.
+     */
+    'revision_limit' => env('REVISION_LIMIT', 50),
+
     /**
      * Allow <script> tags to entered within page content.
      * <script> tags are escaped by default.
index 08b379107f3bf049c6b26f8efc3a48662ba9c755..390042dbf3c61de1fd9ab6105a7f98325a3637e5 100644 (file)
@@ -60,4 +60,34 @@ class PageRevisionTest extends TestCase
         $afterRevisionCount = $page->revisions->count();
         $this->assertTrue($beforeRevisionCount === $afterRevisionCount);
     }
+
+    public function test_revision_limit_enforced()
+    {
+        config()->set('app.revision_limit', 2);
+        $page = Page::first();
+        $this->asEditor()->put($page->getUrl(), ['name' => 'Updated page', 'html' => 'new page html', 'summary' => 'Update a']);
+        $page = Page::find($page->id);
+        $this->asEditor()->put($page->getUrl(), ['name' => 'Updated page', 'html' => 'new page html', 'summary' => 'Update a']);
+        for ($i = 0; $i < 10; $i++) {
+            $this->asEditor()->put($page->getUrl(), ['name' => 'Updated page', 'html' => 'new page html', 'summary' => 'Update a']);
+        }
+
+        $revisionCount = $page->revisions()->count();
+        $this->assertEquals(2, $revisionCount);
+    }
+
+    public function test_false_revision_limit_allows_many_revisions()
+    {
+        config()->set('app.revision_limit', false);
+        $page = Page::first();
+        $this->asEditor()->put($page->getUrl(), ['name' => 'Updated page', 'html' => 'new page html', 'summary' => 'Update a']);
+        $page = Page::find($page->id);
+        $this->asEditor()->put($page->getUrl(), ['name' => 'Updated page', 'html' => 'new page html', 'summary' => 'Update a']);
+        for ($i = 0; $i < 10; $i++) {
+            $this->asEditor()->put($page->getUrl(), ['name' => 'Updated page', 'html' => 'new page html', 'summary' => 'Update a']);
+        }
+
+        $revisionCount = $page->revisions()->count();
+        $this->assertEquals(12, $revisionCount);
+    }
 }
\ No newline at end of file