From eb76e882c5544e319e5084fedcc7cdac0bdf6c2d Mon Sep 17 00:00:00 2001 From: Dan Brown Date: Wed, 26 May 2021 16:40:56 +0100 Subject: [PATCH] Added deletion of revisions on page delete Added testing to cover. Closes #2668 --- app/Entities/Models/Page.php | 18 +++++++++++++++--- app/Entities/Tools/TrashCan.php | 1 + tests/Entity/PageTest.php | 27 +++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/app/Entities/Models/Page.php b/app/Entities/Models/Page.php index 7e397894d..93fb21893 100644 --- a/app/Entities/Models/Page.php +++ b/app/Entities/Models/Page.php @@ -75,11 +75,23 @@ class Page extends BookChild /** * Get the associated page revisions, ordered by created date. - * @return mixed + * Only provides actual saved page revision instances, Not drafts. */ - public function revisions() + public function revisions(): HasMany { - return $this->hasMany(PageRevision::class)->where('type', '=', 'version')->orderBy('created_at', 'desc')->orderBy('id', 'desc'); + return $this->allRevisions() + ->where('type', '=', 'version') + ->orderBy('created_at', 'desc') + ->orderBy('id', 'desc'); + } + + /** + * Get all revision instances assigned to this page. + * Includes all types of revisions. + */ + public function allRevisions(): HasMany + { + return $this->hasMany(PageRevision::class); } /** diff --git a/app/Entities/Tools/TrashCan.php b/app/Entities/Tools/TrashCan.php index bf3792835..0b6081ae4 100644 --- a/app/Entities/Tools/TrashCan.php +++ b/app/Entities/Tools/TrashCan.php @@ -151,6 +151,7 @@ class TrashCan protected function destroyPage(Page $page): int { $this->destroyCommonRelations($page); + $page->allRevisions()->delete(); // Delete Attached Files $attachmentService = app(AttachmentService::class); diff --git a/tests/Entity/PageTest.php b/tests/Entity/PageTest.php index e1dffb61f..a6f6f9d50 100644 --- a/tests/Entity/PageTest.php +++ b/tests/Entity/PageTest.php @@ -71,6 +71,33 @@ class PageTest extends TestCase $redirectReq->assertNotificationContains('Page Successfully Deleted'); } + public function test_page_full_delete_removes_all_revisions() + { + /** @var Page $page */ + $page = Page::query()->first(); + $page->revisions()->create([ + 'html' => '

ducks

', + 'name' => 'my page revision', + 'type' => 'draft', + ]); + $page->revisions()->create([ + 'html' => '

ducks

', + 'name' => 'my page revision', + 'type' => 'revision', + ]); + + $this->assertDatabaseHas('page_revisions', [ + 'page_id' => $page->id, + ]); + + $this->asEditor()->delete($page->getUrl()); + $this->asAdmin()->post('/settings/recycle-bin/empty'); + + $this->assertDatabaseMissing('page_revisions', [ + 'page_id' => $page->id, + ]); + } + public function test_page_copy() { $page = Page::first();