]> BookStack Code Mirror - bookstack/commitdiff
Added revision activity types to system and audit log
authorDan Brown <redacted>
Tue, 9 Aug 2022 12:25:18 +0000 (13:25 +0100)
committerDan Brown <redacted>
Tue, 9 Aug 2022 12:25:18 +0000 (13:25 +0100)
Closes #3628

app/Actions/ActivityType.php
app/Entities/Models/PageRevision.php
app/Entities/Repos/PageRepo.php
app/Facades/Activity.php
app/Http/Controllers/PageRevisionController.php
tests/Entity/PageRevisionTest.php

index 0ad25a5ab7210127442960ad2897b52ed7740bad..2a9615093e4872a9fb913ae6115f429c3b38b574 100644 (file)
@@ -29,6 +29,9 @@ class ActivityType
     const COMMENTED_ON = 'commented_on';
     const PERMISSIONS_UPDATE = 'permissions_update';
 
+    const REVISION_RESTORE = 'revision_restore';
+    const REVISION_DELETE = 'revision_delete';
+
     const SETTINGS_UPDATE = 'settings_update';
     const MAINTENANCE_ACTION_RUN = 'maintenance_action_run';
 
index be2ac33a0958fc26dddfd12ec9795f8448818a7e..6517b0080bace9a69fd8892972e1542ac83a34bc 100644 (file)
@@ -3,6 +3,7 @@
 namespace BookStack\Entities\Models;
 
 use BookStack\Auth\User;
+use BookStack\Interfaces\Loggable;
 use BookStack\Model;
 use Carbon\Carbon;
 use Illuminate\Database\Eloquent\Relations\BelongsTo;
@@ -27,7 +28,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo;
  * @property Page   $page
  * @property-read ?User $createdBy
  */
-class PageRevision extends Model
+class PageRevision extends Model implements Loggable
 {
     protected $fillable = ['name', 'text', 'summary'];
     protected $hidden = ['html', 'markdown', 'restricted', 'text'];
@@ -83,4 +84,9 @@ class PageRevision extends Model
     {
         return $type === 'revision';
     }
+
+    public function logDescriptor(): string
+    {
+        return "Revision #{$this->revision_number} (ID: {$this->id}) for page ID {$this->page_id}";
+    }
 }
index e3c6bd17af95b7ea869ffaa9c70ad059d248ee10..60f1d1b01ec5c62320e9947cacb61d027572132d 100644 (file)
@@ -337,6 +337,7 @@ class PageRepo
         $this->savePageRevision($page, $summary);
 
         Activity::add(ActivityType::PAGE_RESTORE, $page);
+        Activity::add(ActivityType::REVISION_RESTORE, $revision);
 
         return $page;
     }
index 6c279a057f17fdd05e58a49d04aaa2b897c05500..ec3d28cc0f9e62bbd6b93c4888cce7f8b34caf33 100644 (file)
@@ -5,7 +5,7 @@ namespace BookStack\Facades;
 use Illuminate\Support\Facades\Facade;
 
 /**
- * @see \BookStack\Actions\ActivityLogger
+ * @mixin \BookStack\Actions\ActivityLogger
  */
 class Activity extends Facade
 {
index c6a4926d28b88b87c3caed0a32f97d377f339788..08651896069910ca8ac132b66ee6efb0e917c3bc 100644 (file)
@@ -2,9 +2,11 @@
 
 namespace BookStack\Http\Controllers;
 
+use BookStack\Actions\ActivityType;
 use BookStack\Entities\Repos\PageRepo;
 use BookStack\Entities\Tools\PageContent;
 use BookStack\Exceptions\NotFoundException;
+use BookStack\Facades\Activity;
 use Ssddanbrown\HtmlDiff\Diff;
 
 class PageRevisionController extends Controller
@@ -132,6 +134,7 @@ class PageRevisionController extends Controller
         }
 
         $revision->delete();
+        Activity::add(ActivityType::REVISION_DELETE, $revision);
         $this->showSuccessNotification(trans('entities.revision_delete_success'));
 
         return redirect($page->getUrl('/revisions'));
index cc49002492cdbafd44128e905b5676de54c3e8b7..78bf2dec29a36e63163f841a1fe7dbb23f98cad5 100644 (file)
@@ -2,6 +2,7 @@
 
 namespace Tests\Entity;
 
+use BookStack\Actions\ActivityType;
 use BookStack\Entities\Models\Page;
 use BookStack\Entities\Repos\PageRepo;
 use Tests\TestCase;
@@ -117,6 +118,9 @@ class PageRevisionTest extends TestCase
             'type'    => 'version',
             'summary' => "Restored from #{$revToRestore->id}; My first update",
         ]);
+
+        $detail = "Revision #{$revToRestore->revision_number} (ID: {$revToRestore->id}) for page ID {$revToRestore->page_id}";
+        $this->assertActivityExists(ActivityType::REVISION_RESTORE, null, $detail);
     }
 
     public function test_page_revision_count_increments_on_update()
@@ -164,6 +168,9 @@ class PageRevisionTest extends TestCase
 
         $this->assertTrue($beforeRevisionCount === ($afterRevisionCount + 1));
 
+        $detail = "Revision #{$revision->revision_number} (ID: {$revision->id}) for page ID {$revision->page_id}";
+        $this->assertActivityExists(ActivityType::REVISION_DELETE, null, $detail);
+
         // Try to delete the latest revision
         $beforeRevisionCount = $page->revisions->count();
         $resp = $this->asEditor()->delete($page->currentRevision->getUrl('/delete/'));