From 6e0a7344fa120e09856e20c488e2d53b77211eb1 Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Tue, 9 Aug 2022 13:25:18 +0100 Subject: [PATCH] Added revision activity types to system and audit log Closes #3628 --- app/Actions/ActivityType.php | 3 +++ app/Entities/Models/PageRevision.php | 8 +++++++- app/Entities/Repos/PageRepo.php | 1 + app/Facades/Activity.php | 2 +- app/Http/Controllers/PageRevisionController.php | 3 +++ tests/Entity/PageRevisionTest.php | 7 +++++++ 6 files changed, 22 insertions(+), 2 deletions(-) diff --git a/app/Actions/ActivityType.php b/app/Actions/ActivityType.php index 0ad25a5ab..2a9615093 100644 --- a/app/Actions/ActivityType.php +++ b/app/Actions/ActivityType.php @@ -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'; diff --git a/app/Entities/Models/PageRevision.php b/app/Entities/Models/PageRevision.php index be2ac33a0..6517b0080 100644 --- a/app/Entities/Models/PageRevision.php +++ b/app/Entities/Models/PageRevision.php @@ -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}"; + } } diff --git a/app/Entities/Repos/PageRepo.php b/app/Entities/Repos/PageRepo.php index e3c6bd17a..60f1d1b01 100644 --- a/app/Entities/Repos/PageRepo.php +++ b/app/Entities/Repos/PageRepo.php @@ -337,6 +337,7 @@ class PageRepo $this->savePageRevision($page, $summary); Activity::add(ActivityType::PAGE_RESTORE, $page); + Activity::add(ActivityType::REVISION_RESTORE, $revision); return $page; } diff --git a/app/Facades/Activity.php b/app/Facades/Activity.php index 6c279a057..ec3d28cc0 100644 --- a/app/Facades/Activity.php +++ b/app/Facades/Activity.php @@ -5,7 +5,7 @@ namespace BookStack\Facades; use Illuminate\Support\Facades\Facade; /** - * @see \BookStack\Actions\ActivityLogger + * @mixin \BookStack\Actions\ActivityLogger */ class Activity extends Facade { diff --git a/app/Http/Controllers/PageRevisionController.php b/app/Http/Controllers/PageRevisionController.php index c6a4926d2..086518960 100644 --- a/app/Http/Controllers/PageRevisionController.php +++ b/app/Http/Controllers/PageRevisionController.php @@ -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')); diff --git a/tests/Entity/PageRevisionTest.php b/tests/Entity/PageRevisionTest.php index cc4900249..78bf2dec2 100644 --- a/tests/Entity/PageRevisionTest.php +++ b/tests/Entity/PageRevisionTest.php @@ -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/'));