Fixed misalignment of page and chapter parent book
Could occur when a chapter was moved with deleted pages. Fixes #2632
This commit is contained in:
		
							parent
							
								
									26730e56ea
								
							
						
					
					
						commit
						339d4ec355
					
				| 
						 | 
				
			
			@ -3,8 +3,10 @@
 | 
			
		|||
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;
 | 
			
		||||
| 
						 | 
				
			
			@ -112,21 +114,16 @@ class PermissionService
 | 
			
		|||
 | 
			
		||||
    /**
 | 
			
		||||
     * 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);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
| 
						 | 
				
			
			@ -460,7 +457,7 @@ class PermissionService
 | 
			
		|||
        $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) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,8 +1,5 @@
 | 
			
		|||
<?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;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -49,7 +46,7 @@ abstract class BookChild extends Entity
 | 
			
		|||
 | 
			
		||||
        // 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);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -196,6 +196,24 @@ class SortTest extends TestCase
 | 
			
		|||
        $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();
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue