Could occur when a chapter was moved with deleted pages.
Fixes #2632
use BookStack\Auth\Permissions;
use BookStack\Auth\Role;
use BookStack\Entities\Models\Book;
+use BookStack\Entities\Models\Chapter;
use BookStack\Entities\Models\Entity;
use BookStack\Entities\EntityProvider;
+use BookStack\Entities\Models\Page;
use BookStack\Model;
use BookStack\Traits\HasCreatorAndUpdater;
use BookStack\Traits\HasOwner;
/**
* Get a chapter via ID, Checks local cache
- * @param $chapterId
- * @return \BookStack\Entities\Models\Book
*/
- protected function getChapter($chapterId)
+ protected function getChapter(int $chapterId): ?Chapter
{
if (isset($this->entityCache['chapter']) && $this->entityCache['chapter']->has($chapterId)) {
return $this->entityCache['chapter']->get($chapterId);
}
- $chapter = $this->entityProvider->chapter->find($chapterId);
- if ($chapter === null) {
- $chapter = false;
- }
-
- return $chapter;
+ return $this->entityProvider->chapter->newQuery()
+ ->withTrashed()
+ ->find($chapterId);
}
/**
$hasPermissiveAccessToParents = !$book->restricted;
// For pages with a chapter, Check if explicit permissions are set on the Chapter
- if ($entity->isA('page') && $entity->chapter_id !== 0 && $entity->chapter_id !== '0') {
+ if ($entity instanceof Page && intval($entity->chapter_id) !== 0) {
$chapter = $this->getChapter($entity->chapter_id);
$hasPermissiveAccessToParents = $hasPermissiveAccessToParents && !$chapter->restricted;
if ($chapter->restricted) {
<?php namespace BookStack\Entities\Models;
-use BookStack\Entities\Models\Chapter;
-use BookStack\Entities\Models\Entity;
-use BookStack\Entities\Models\Book;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
// Update all child pages if a chapter
if ($this instanceof Chapter) {
- foreach ($this->pages as $page) {
+ foreach ($this->pages()->withTrashed()->get() as $page) {
$page->changeBook($newBookId);
}
}
$this->assertTrue($chapter->book->id == $newBook->id, 'Page book is now the new book');
}
+ public function test_chapter_move_changes_book_for_deleted_pages_within()
+ {
+ /** @var Chapter $chapter */
+ $chapter = Chapter::query()->whereHas('pages')->first();
+ $currentBook = $chapter->book;
+ $pageToCheck = $chapter->pages->first();
+ $newBook = Book::query()->where('id', '!=', $currentBook->id)->first();
+
+ $pageToCheck->delete();
+
+ $this->asEditor()->put($chapter->getUrl('/move'), [
+ 'entity_selection' => 'book:' . $newBook->id
+ ]);
+
+ $pageToCheck->refresh();
+ $this->assertEquals($newBook->id, $pageToCheck->book_id);
+ }
+
public function test_book_sort()
{
$oldBook = Book::query()->first();