mirror of
https://github.com/BookStackApp/BookStack.git
synced 2025-10-23 18:48:37 +03:00
Images: Added nulling of image page relation on page delete
This commit is contained in:
@@ -15,6 +15,7 @@ use BookStack\Entities\Queries\EntityQueries;
|
|||||||
use BookStack\Exceptions\NotifyException;
|
use BookStack\Exceptions\NotifyException;
|
||||||
use BookStack\Facades\Activity;
|
use BookStack\Facades\Activity;
|
||||||
use BookStack\Uploads\AttachmentService;
|
use BookStack\Uploads\AttachmentService;
|
||||||
|
use BookStack\Uploads\Image;
|
||||||
use BookStack\Uploads\ImageService;
|
use BookStack\Uploads\ImageService;
|
||||||
use BookStack\Util\DatabaseTransaction;
|
use BookStack\Util\DatabaseTransaction;
|
||||||
use Exception;
|
use Exception;
|
||||||
@@ -217,14 +218,11 @@ class TrashCan
|
|||||||
->where('default_template_id', '=', $page->id)
|
->where('default_template_id', '=', $page->id)
|
||||||
->update(['default_template_id' => null]);
|
->update(['default_template_id' => null]);
|
||||||
|
|
||||||
// TODO - Handle related images (uploaded_to for gallery/drawings).
|
// Nullify uploaded image relations
|
||||||
// Should maybe reset to null
|
Image::query()
|
||||||
// But does that present visibility/permission issues if they used to retain their old
|
->whereIn('type', ['gallery', 'drawio'])
|
||||||
// unused ID?
|
->where('uploaded_to', '=', $page->id)
|
||||||
// If so, might be better to leave them as-is like before, but ensure the maintenance
|
->update(['uploaded_to' => null]);
|
||||||
// cleanup command/action can find these "orphaned" images and delete them.
|
|
||||||
// But that would leave potential attachment to new pages on increment reset scenarios.
|
|
||||||
// Need to review permission scenarios for null field values relative to storage options.
|
|
||||||
|
|
||||||
$page->forceDelete();
|
$page->forceDelete();
|
||||||
|
|
||||||
@@ -275,8 +273,8 @@ class TrashCan
|
|||||||
// exists in the event it has already been destroyed during this request.
|
// exists in the event it has already been destroyed during this request.
|
||||||
$entity = $deletion->deletable()->first();
|
$entity = $deletion->deletable()->first();
|
||||||
$count = 0;
|
$count = 0;
|
||||||
if ($entity) {
|
if ($entity instanceof Entity) {
|
||||||
$count = $this->destroyEntity($deletion->deletable);
|
$count = $this->destroyEntity($entity);
|
||||||
}
|
}
|
||||||
$deletion->delete();
|
$deletion->delete();
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
use BookStack\Permissions\JointPermissionBuilder;
|
use BookStack\Permissions\JointPermissionBuilder;
|
||||||
use Illuminate\Database\Migrations\Migration;
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Query\Builder;
|
||||||
use Illuminate\Database\Schema\Blueprint;
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
use Illuminate\Support\Facades\Schema;
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
@@ -66,6 +67,15 @@ return new class extends Migration
|
|||||||
DB::table('images')->where('uploaded_to', '=', 0)->update(['uploaded_to' => null]);
|
DB::table('images')->where('uploaded_to', '=', 0)->update(['uploaded_to' => null]);
|
||||||
DB::table('activities')->where('loggable_id', '=', 0)->update(['loggable_id' => null]);
|
DB::table('activities')->where('loggable_id', '=', 0)->update(['loggable_id' => null]);
|
||||||
|
|
||||||
|
// Clean up any orphaned gallery/drawio images to nullify their page relation
|
||||||
|
DB::table('images')
|
||||||
|
->whereIn('type', ['gallery', 'drawio'])
|
||||||
|
->whereNotIn('uploaded_to', function (Builder $query) {
|
||||||
|
$query->select('id')
|
||||||
|
->from('entities')
|
||||||
|
->where('type', '=', 'page');
|
||||||
|
})->update(['uploaded_to' => null]);
|
||||||
|
|
||||||
// Rebuild joint permissions if needed
|
// Rebuild joint permissions if needed
|
||||||
// This was moved here from 2023_01_24_104625_refactor_joint_permissions_storage since the changes
|
// This was moved here from 2023_01_24_104625_refactor_joint_permissions_storage since the changes
|
||||||
// made for this release would mean our current logic would not be compatible with
|
// made for this release would mean our current logic would not be compatible with
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ namespace Tests\Entity;
|
|||||||
|
|
||||||
use BookStack\Entities\Models\Book;
|
use BookStack\Entities\Models\Book;
|
||||||
use BookStack\Entities\Models\Page;
|
use BookStack\Entities\Models\Page;
|
||||||
|
use BookStack\Uploads\Image;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
use Tests\TestCase;
|
use Tests\TestCase;
|
||||||
|
|
||||||
@@ -158,6 +159,25 @@ class PageTest extends TestCase
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function test_page_full_delete_nulls_related_images()
|
||||||
|
{
|
||||||
|
$page = $this->entities->page();
|
||||||
|
$image = Image::factory()->create(['type' => 'gallery', 'uploaded_to' => $page->id]);
|
||||||
|
|
||||||
|
$this->asEditor()->delete($page->getUrl());
|
||||||
|
$this->asAdmin()->post('/settings/recycle-bin/empty');
|
||||||
|
|
||||||
|
$this->assertDatabaseMissing('images', [
|
||||||
|
'type' => 'gallery',
|
||||||
|
'uploaded_to' => $page->id,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$this->assertDatabaseHas('images', [
|
||||||
|
'id' => $image->id,
|
||||||
|
'uploaded_to' => null,
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
public function test_page_copy()
|
public function test_page_copy()
|
||||||
{
|
{
|
||||||
$page = $this->entities->page();
|
$page = $this->entities->page();
|
||||||
|
|||||||
Reference in New Issue
Block a user