BookStack\Http\Controllers\BookController::saveSort PHP Method

saveSort() public method

Saves an array of sort mapping to pages and chapters.
public saveSort ( string $bookSlug, Illuminate\Http\Request $request ) : Illuminate\Http\RedirectResponse | Redirector
$bookSlug string
$request Illuminate\Http\Request
return Illuminate\Http\RedirectResponse | Illuminate\Routing\Redirector
    public function saveSort($bookSlug, Request $request)
    {
        $book = $this->bookRepo->getBySlug($bookSlug);
        $this->checkOwnablePermission('book-update', $book);
        // Return if no map sent
        if (!$request->has('sort-tree')) {
            return redirect($book->getUrl());
        }
        // Sort pages and chapters
        $sortedBooks = [];
        $updatedModels = collect();
        $sortMap = json_decode($request->get('sort-tree'));
        $defaultBookId = $book->id;
        // Loop through contents of provided map and update entities accordingly
        foreach ($sortMap as $bookChild) {
            $priority = $bookChild->sort;
            $id = intval($bookChild->id);
            $isPage = $bookChild->type == 'page';
            $bookId = $this->bookRepo->exists($bookChild->book) ? intval($bookChild->book) : $defaultBookId;
            $chapterId = $isPage && $bookChild->parentChapter === false ? 0 : intval($bookChild->parentChapter);
            $model = $isPage ? $this->pageRepo->getById($id) : $this->chapterRepo->getById($id);
            // Update models only if there's a change in parent chain or ordering.
            if ($model->priority !== $priority || $model->book_id !== $bookId || $isPage && $model->chapter_id !== $chapterId) {
                $isPage ? $this->pageRepo->changeBook($bookId, $model) : $this->chapterRepo->changeBook($bookId, $model);
                $model->priority = $priority;
                if ($isPage) {
                    $model->chapter_id = $chapterId;
                }
                $model->save();
                $updatedModels->push($model);
            }
            // Store involved books to be sorted later
            if (!in_array($bookId, $sortedBooks)) {
                $sortedBooks[] = $bookId;
            }
        }
        // Add activity for books
        foreach ($sortedBooks as $bookId) {
            $updatedBook = $this->bookRepo->getById($bookId);
            Activity::add($updatedBook, 'book_sort', $updatedBook->id);
        }
        // Update permissions on changed models
        $this->bookRepo->buildJointPermissions($updatedModels);
        return redirect($book->getUrl());
    }