X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/1aa4d0dc59fb118c6cf28fd71af366c1882da74b..c89865b5741aeecf521ebecd47056f9ff2ca2a7c:/app/Http/Controllers/PageController.php diff --git a/app/Http/Controllers/PageController.php b/app/Http/Controllers/PageController.php index 9dc7d6401..268dce057 100644 --- a/app/Http/Controllers/PageController.php +++ b/app/Http/Controllers/PageController.php @@ -1,608 +1,484 @@ -entityRepo = $entityRepo; - $this->exportService = $exportService; - $this->userRepo = $userRepo; - parent::__construct(); + $this->pageRepo = $pageRepo; } /** * Show the form for creating a new page. - * @param string $bookSlug - * @param string $chapterSlug - * @return Response - * @internal param bool $pageSlug + * + * @throws Throwable */ - public function create($bookSlug, $chapterSlug = null) + public function create(string $bookSlug, string $chapterSlug = null) { - $book = $this->entityRepo->getBySlug('book', $bookSlug); - $chapter = $chapterSlug ? $this->entityRepo->getBySlug('chapter', $chapterSlug, $bookSlug) : null; - $parent = $chapter ? $chapter : $book; + $parent = $this->pageRepo->getParentFromSlugs($bookSlug, $chapterSlug); $this->checkOwnablePermission('page-create', $parent); // Redirect to draft edit screen if signed in - if ($this->signedIn) { - $draft = $this->entityRepo->getDraftPage($book, $chapter); + if ($this->isSignedIn()) { + $draft = $this->pageRepo->getNewDraftPage($parent); + return redirect($draft->getUrl()); } - // Otherwise show edit view + // Otherwise show the edit view if they're a guest $this->setPageTitle(trans('entities.pages_new')); - return view('pages/guest-create', ['parent' => $parent]); + + return view('pages.guest-create', ['parent' => $parent]); } /** * Create a new page as a guest user. - * @param Request $request - * @param string $bookSlug - * @param string|null $chapterSlug - * @return mixed - * @throws NotFoundException + * + * @throws ValidationException */ - public function createAsGuest(Request $request, $bookSlug, $chapterSlug = null) + public function createAsGuest(Request $request, string $bookSlug, string $chapterSlug = null) { $this->validate($request, [ - 'name' => 'required|string|max:255' + 'name' => ['required', 'string', 'max:255'], ]); - $book = $this->entityRepo->getBySlug('book', $bookSlug); - $chapter = $chapterSlug ? $this->entityRepo->getBySlug('chapter', $chapterSlug, $bookSlug) : null; - $parent = $chapter ? $chapter : $book; + $parent = $this->pageRepo->getParentFromSlugs($bookSlug, $chapterSlug); $this->checkOwnablePermission('page-create', $parent); - $page = $this->entityRepo->getDraftPage($book, $chapter); - $this->entityRepo->publishPageDraft($page, [ + $page = $this->pageRepo->getNewDraftPage($parent); + $this->pageRepo->publishDraft($page, [ 'name' => $request->get('name'), - 'html' => '' + 'html' => '', ]); + return redirect($page->getUrl('/edit')); } /** * Show form to continue editing a draft page. - * @param string $bookSlug - * @param int $pageId - * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + * + * @throws NotFoundException */ - public function editDraft($bookSlug, $pageId) + public function editDraft(Request $request, string $bookSlug, int $pageId) { - $draft = $this->entityRepo->getById('page', $pageId, true); - $this->checkOwnablePermission('page-create', $draft->book); + $draft = $this->pageRepo->getById($pageId); + $this->checkOwnablePermission('page-create', $draft->getParent()); + + $editorData = new PageEditorData($draft, $this->pageRepo, $request->query('editor', '')); $this->setPageTitle(trans('entities.pages_edit_draft')); - $draftsEnabled = $this->signedIn; - return view('pages/edit', [ - 'page' => $draft, - 'book' => $draft->book, - 'isDraft' => true, - 'draftsEnabled' => $draftsEnabled - ]); + return view('pages.edit', $editorData->getViewData()); } /** * Store a new page by changing a draft into a page. - * @param Request $request - * @param string $bookSlug - * @param int $pageId - * @return Response + * + * @throws NotFoundException + * @throws ValidationException */ - public function store(Request $request, $bookSlug, $pageId) + public function store(Request $request, string $bookSlug, int $pageId) { $this->validate($request, [ - 'name' => 'required|string|max:255' + 'name' => ['required', 'string', 'max:255'], ]); + $draftPage = $this->pageRepo->getById($pageId); + $this->checkOwnablePermission('page-create', $draftPage->getParent()); - $input = $request->all(); - $book = $this->entityRepo->getBySlug('book', $bookSlug); - - $draftPage = $this->entityRepo->getById('page', $pageId, true); + $page = $this->pageRepo->publishDraft($draftPage, $request->all()); - $chapterId = intval($draftPage->chapter_id); - $parent = $chapterId !== 0 ? $this->entityRepo->getById('chapter', $chapterId) : $book; - $this->checkOwnablePermission('page-create', $parent); - - if ($parent->isA('chapter')) { - $input['priority'] = $this->entityRepo->getNewChapterPriority($parent); - } else { - $input['priority'] = $this->entityRepo->getNewBookPriority($parent); - } - - $page = $this->entityRepo->publishPageDraft($draftPage, $input); - - Activity::add($page, 'page_create', $book->id); return redirect($page->getUrl()); } /** * Display the specified page. * If the page is not found via the slug the revisions are searched for a match. - * @param string $bookSlug - * @param string $pageSlug - * @return Response + * * @throws NotFoundException */ - public function show($bookSlug, $pageSlug) + public function show(string $bookSlug, string $pageSlug) { try { - $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug); + $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug); } catch (NotFoundException $e) { - $page = $this->entityRepo->getPageByOldSlug($pageSlug, $bookSlug); - if ($page === null) throw $e; + $page = $this->pageRepo->getByOldSlug($bookSlug, $pageSlug); + + if ($page === null) { + throw $e; + } + return redirect($page->getUrl()); } $this->checkOwnablePermission('page-view', $page); - $page->html = $this->entityRepo->renderPage($page); - $sidebarTree = $this->entityRepo->getBookChildren($page->book); - $pageNav = $this->entityRepo->getPageNav($page->html); + $pageContent = (new PageContent($page)); + $page->html = $pageContent->render(); + $sidebarTree = (new BookContents($page->book))->getTree(); + $pageNav = $pageContent->getNavigation($page->html); - // check if the comment's are enabled + // Check if page comments are enabled $commentsEnabled = !setting('app-disable-comments'); if ($commentsEnabled) { $page->load(['comments.createdBy']); } - Views::add($page); + $nextPreviousLocator = new NextPreviousContentLocator($page, $sidebarTree); + + View::incrementFor($page); $this->setPageTitle($page->getShortName()); - return view('pages/show', [ - 'page' => $page,'book' => $page->book, - 'current' => $page, - 'sidebarTree' => $sidebarTree, + + return view('pages.show', [ + 'page' => $page, + 'book' => $page->book, + 'current' => $page, + 'sidebarTree' => $sidebarTree, 'commentsEnabled' => $commentsEnabled, - 'pageNav' => $pageNav + 'pageNav' => $pageNav, + 'next' => $nextPreviousLocator->getNext(), + 'previous' => $nextPreviousLocator->getPrevious(), ]); } /** * Get page from an ajax request. - * @param int $pageId - * @return \Illuminate\Http\JsonResponse + * + * @throws NotFoundException */ - public function getPageAjax($pageId) + public function getPageAjax(int $pageId) { - $page = $this->entityRepo->getById('page', $pageId); + $page = $this->pageRepo->getById($pageId); + $page->setHidden(array_diff($page->getHidden(), ['html', 'markdown'])); + $page->makeHidden(['book']); + return response()->json($page); } /** * Show the form for editing the specified page. - * @param string $bookSlug - * @param string $pageSlug - * @return Response + * + * @throws NotFoundException */ - public function edit($bookSlug, $pageSlug) + public function edit(Request $request, string $bookSlug, string $pageSlug) { - $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug); + $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug); $this->checkOwnablePermission('page-update', $page); - $this->setPageTitle(trans('entities.pages_editing_named', ['pageName'=>$page->getShortName()])); - $page->isDraft = false; - - // Check for active editing - $warnings = []; - if ($this->entityRepo->isPageEditingActive($page, 60)) { - $warnings[] = $this->entityRepo->getPageEditingActiveMessage($page, 60); - } - // Check for a current draft version for this user - if ($this->entityRepo->hasUserGotPageDraft($page, $this->currentUser->id)) { - $draft = $this->entityRepo->getUserPageDraft($page, $this->currentUser->id); - $page->name = $draft->name; - $page->html = $draft->html; - $page->markdown = $draft->markdown; - $page->isDraft = true; - $warnings [] = $this->entityRepo->getUserPageDraftMessage($draft); + $editorData = new PageEditorData($page, $this->pageRepo, $request->query('editor', '')); + if ($editorData->getWarnings()) { + $this->showWarningNotification(implode("\n", $editorData->getWarnings())); } - if (count($warnings) > 0) session()->flash('warning', implode("\n", $warnings)); + $this->setPageTitle(trans('entities.pages_editing_named', ['pageName' => $page->getShortName()])); - $draftsEnabled = $this->signedIn; - return view('pages/edit', [ - 'page' => $page, - 'book' => $page->book, - 'current' => $page, - 'draftsEnabled' => $draftsEnabled - ]); + return view('pages.edit', $editorData->getViewData()); } /** * Update the specified page in storage. - * @param Request $request - * @param string $bookSlug - * @param string $pageSlug - * @return Response + * + * @throws ValidationException + * @throws NotFoundException */ - public function update(Request $request, $bookSlug, $pageSlug) + public function update(Request $request, string $bookSlug, string $pageSlug) { $this->validate($request, [ - 'name' => 'required|string|max:255' + 'name' => ['required', 'string', 'max:255'], ]); - $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug); + $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug); $this->checkOwnablePermission('page-update', $page); - $this->entityRepo->updatePage($page, $page->book->id, $request->all()); - Activity::add($page, 'page_update', $page->book->id); + + $this->pageRepo->update($page, $request->all()); + return redirect($page->getUrl()); } /** * Save a draft update as a revision. - * @param Request $request - * @param int $pageId - * @return \Illuminate\Http\JsonResponse + * + * @throws NotFoundException */ - public function saveDraft(Request $request, $pageId) + public function saveDraft(Request $request, int $pageId) { - $page = $this->entityRepo->getById('page', $pageId, true); + $page = $this->pageRepo->getById($pageId); $this->checkOwnablePermission('page-update', $page); - if (!$this->signedIn) { - return response()->json([ - 'status' => 'error', - 'message' => trans('errors.guests_cannot_save_drafts'), - ], 500); + if (!$this->isSignedIn()) { + return $this->jsonError(trans('errors.guests_cannot_save_drafts'), 500); } - $draft = $this->entityRepo->updatePageDraft($page, $request->only(['name', 'html', 'markdown'])); + $draft = $this->pageRepo->updatePageDraft($page, $request->only(['name', 'html', 'markdown'])); + $warnings = (new PageEditActivity($page))->getWarningMessagesForDraft($draft); - $updateTime = $draft->updated_at->timestamp; - $utcUpdateTimestamp = $updateTime + Carbon::createFromTimestamp(0)->offset; return response()->json([ 'status' => 'success', 'message' => trans('entities.pages_edit_draft_save_at'), - 'timestamp' => $utcUpdateTimestamp + 'warning' => implode("\n", $warnings), + 'timestamp' => $draft->updated_at->timestamp, ]); } /** - * Redirect from a special link url which - * uses the page id rather than the name. - * @param int $pageId - * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * Redirect from a special link url which uses the page id rather than the name. + * + * @throws NotFoundException */ - public function redirectFromLink($pageId) + public function redirectFromLink(int $pageId) { - $page = $this->entityRepo->getById('page', $pageId); + $page = $this->pageRepo->getById($pageId); + return redirect($page->getUrl()); } /** * Show the deletion page for the specified page. - * @param string $bookSlug - * @param string $pageSlug - * @return \Illuminate\View\View + * + * @throws NotFoundException */ - public function showDelete($bookSlug, $pageSlug) + public function showDelete(string $bookSlug, string $pageSlug) { - $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug); + $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug); $this->checkOwnablePermission('page-delete', $page); - $this->setPageTitle(trans('entities.pages_delete_named', ['pageName'=>$page->getShortName()])); - return view('pages/delete', ['book' => $page->book, 'page' => $page, 'current' => $page]); - } + $this->setPageTitle(trans('entities.pages_delete_named', ['pageName' => $page->getShortName()])); + return view('pages.delete', [ + 'book' => $page->book, + 'page' => $page, + 'current' => $page, + ]); + } /** * Show the deletion page for the specified page. - * @param string $bookSlug - * @param int $pageId - * @return \Illuminate\View\View + * * @throws NotFoundException */ - public function showDeleteDraft($bookSlug, $pageId) + public function showDeleteDraft(string $bookSlug, int $pageId) { - $page = $this->entityRepo->getById('page', $pageId, true); + $page = $this->pageRepo->getById($pageId); $this->checkOwnablePermission('page-update', $page); - $this->setPageTitle(trans('entities.pages_delete_draft_named', ['pageName'=>$page->getShortName()])); - return view('pages/delete', ['book' => $page->book, 'page' => $page, 'current' => $page]); + $this->setPageTitle(trans('entities.pages_delete_draft_named', ['pageName' => $page->getShortName()])); + + return view('pages.delete', [ + 'book' => $page->book, + 'page' => $page, + 'current' => $page, + ]); } /** * Remove the specified page from storage. - * @param string $bookSlug - * @param string $pageSlug - * @return Response - * @internal param int $id + * + * @throws NotFoundException + * @throws Throwable */ - public function destroy($bookSlug, $pageSlug) + public function destroy(string $bookSlug, string $pageSlug) { - $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug); - $book = $page->book; + $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug); $this->checkOwnablePermission('page-delete', $page); - $this->entityRepo->destroyPage($page); + $parent = $page->getParent(); - Activity::addMessage('page_delete', $book->id, $page->name); - session()->flash('success', trans('entities.pages_delete_success')); - return redirect($book->getUrl()); + $this->pageRepo->destroy($page); + + return redirect($parent->getUrl()); } /** * Remove the specified draft page from storage. - * @param string $bookSlug - * @param int $pageId - * @return Response + * * @throws NotFoundException + * @throws Throwable */ - public function destroyDraft($bookSlug, $pageId) + public function destroyDraft(string $bookSlug, int $pageId) { - $page = $this->entityRepo->getById('page', $pageId, true); + $page = $this->pageRepo->getById($pageId); $book = $page->book; + $chapter = $page->chapter; $this->checkOwnablePermission('page-update', $page); - session()->flash('success', trans('entities.pages_delete_draft_success')); - $this->entityRepo->destroyPage($page); + + $this->pageRepo->destroy($page); + + $this->showSuccessNotification(trans('entities.pages_delete_draft_success')); + + if ($chapter && userCan('view', $chapter)) { + return redirect($chapter->getUrl()); + } + return redirect($book->getUrl()); } /** - * Shows the last revisions for this page. - * @param string $bookSlug - * @param string $pageSlug - * @return \Illuminate\View\View + * Show a listing of recently created pages. */ - public function showRevisions($bookSlug, $pageSlug) + public function showRecentlyUpdated() { - $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug); - $this->setPageTitle(trans('entities.pages_revisions_named', ['pageName'=>$page->getShortName()])); - return view('pages/revisions', ['page' => $page, 'book' => $page->book, 'current' => $page]); + $visibleBelongsScope = function (BelongsTo $query) { + $query->scopes('visible'); + }; + + $pages = Page::visible()->with(['updatedBy', 'book' => $visibleBelongsScope, 'chapter' => $visibleBelongsScope]) + ->orderBy('updated_at', 'desc') + ->paginate(20) + ->setPath(url('/pages/recently-updated')); + + $this->setPageTitle(trans('entities.recently_updated_pages')); + + return view('common.detailed-listing-paginated', [ + 'title' => trans('entities.recently_updated_pages'), + 'entities' => $pages, + 'showUpdatedBy' => true, + 'showPath' => true, + ]); } /** - * Shows a preview of a single revision - * @param string $bookSlug - * @param string $pageSlug - * @param int $revisionId - * @return \Illuminate\View\View + * Show the view to choose a new parent to move a page into. + * + * @throws NotFoundException */ - public function showRevision($bookSlug, $pageSlug, $revisionId) + public function showMove(string $bookSlug, string $pageSlug) { - $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug); - $revision = $page->revisions()->where('id', '=', $revisionId)->first(); - if ($revision === null) { - abort(404); - } - - $page->fill($revision->toArray()); - $this->setPageTitle(trans('entities.pages_revision_named', ['pageName' => $page->getShortName()])); + $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug); + $this->checkOwnablePermission('page-update', $page); + $this->checkOwnablePermission('page-delete', $page); - return view('pages/revision', [ - 'page' => $page, + return view('pages.move', [ 'book' => $page->book, - 'revision' => $revision + 'page' => $page, ]); } /** - * Shows the changes of a single revision - * @param string $bookSlug - * @param string $pageSlug - * @param int $revisionId - * @return \Illuminate\View\View + * Does the action of moving the location of a page. + * + * @throws NotFoundException + * @throws Throwable */ - public function showRevisionChanges($bookSlug, $pageSlug, $revisionId) + public function move(Request $request, string $bookSlug, string $pageSlug) { - $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug); - $revision = $page->revisions()->where('id', '=', $revisionId)->first(); - if ($revision === null) { - abort(404); + $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug); + $this->checkOwnablePermission('page-update', $page); + $this->checkOwnablePermission('page-delete', $page); + + $entitySelection = $request->get('entity_selection', null); + if ($entitySelection === null || $entitySelection === '') { + return redirect($page->getUrl()); } - $prev = $revision->getPrevious(); - $prevContent = ($prev === null) ? '' : $prev->html; - $diff = (new Htmldiff)->diff($prevContent, $revision->html); + try { + $parent = $this->pageRepo->move($page, $entitySelection); + } catch (PermissionsException $exception) { + $this->showPermissionError(); + } catch (Exception $exception) { + $this->showErrorNotification(trans('errors.selected_book_chapter_not_found')); - $page->fill($revision->toArray()); - $this->setPageTitle(trans('entities.pages_revision_named', ['pageName'=>$page->getShortName()])); + return redirect()->back(); + } - return view('pages/revision', [ - 'page' => $page, - 'book' => $page->book, - 'diff' => $diff, - 'revision' => $revision - ]); - } + $this->showSuccessNotification(trans('entities.pages_move_success', ['parentName' => $parent->name])); - /** - * Restores a page using the content of the specified revision. - * @param string $bookSlug - * @param string $pageSlug - * @param int $revisionId - * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector - */ - public function restoreRevision($bookSlug, $pageSlug, $revisionId) - { - $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug); - $this->checkOwnablePermission('page-update', $page); - $page = $this->entityRepo->restorePageRevision($page, $page->book, $revisionId); - Activity::add($page, 'page_restore', $page->book->id); return redirect($page->getUrl()); } /** - * Exports a page to a PDF. - * https://github.com/barryvdh/laravel-dompdf - * @param string $bookSlug - * @param string $pageSlug - * @return \Illuminate\Http\Response + * Show the view to copy a page. + * + * @throws NotFoundException */ - public function exportPdf($bookSlug, $pageSlug) + public function showCopy(string $bookSlug, string $pageSlug) { - $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug); - $page->html = $this->entityRepo->renderPage($page); - $pdfContent = $this->exportService->pageToPdf($page); - return response()->make($pdfContent, 200, [ - 'Content-Type' => 'application/octet-stream', - 'Content-Disposition' => 'attachment; filename="' . $pageSlug . '.pdf' - ]); - } + $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug); + $this->checkOwnablePermission('page-view', $page); + session()->flashInput(['name' => $page->name]); - /** - * Export a page to a self-contained HTML file. - * @param string $bookSlug - * @param string $pageSlug - * @return \Illuminate\Http\Response - */ - public function exportHtml($bookSlug, $pageSlug) - { - $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug); - $page->html = $this->entityRepo->renderPage($page); - $containedHtml = $this->exportService->pageToContainedHtml($page); - return response()->make($containedHtml, 200, [ - 'Content-Type' => 'application/octet-stream', - 'Content-Disposition' => 'attachment; filename="' . $pageSlug . '.html' + return view('pages.copy', [ + 'book' => $page->book, + 'page' => $page, ]); } /** - * Export a page to a simple plaintext .txt file. - * @param string $bookSlug - * @param string $pageSlug - * @return \Illuminate\Http\Response + * Create a copy of a page within the requested target destination. + * + * @throws NotFoundException + * @throws Throwable */ - public function exportPlainText($bookSlug, $pageSlug) + public function copy(Request $request, Cloner $cloner, string $bookSlug, string $pageSlug) { - $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug); - $containedHtml = $this->exportService->pageToPlainText($page); - return response()->make($containedHtml, 200, [ - 'Content-Type' => 'application/octet-stream', - 'Content-Disposition' => 'attachment; filename="' . $pageSlug . '.txt' - ]); - } + $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug); + $this->checkOwnablePermission('page-view', $page); - /** - * Show a listing of recently created pages - * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View - */ - public function showRecentlyCreated() - { - $pages = $this->entityRepo->getRecentlyCreatedPaginated('page', 20)->setPath(baseUrl('/pages/recently-created')); - return view('pages/detailed-listing', [ - 'title' => trans('entities.recently_created_pages'), - 'pages' => $pages - ]); - } + $entitySelection = $request->get('entity_selection') ?: null; + $newParent = $entitySelection ? $this->pageRepo->findParentByIdentifier($entitySelection) : $page->getParent(); - /** - * Show a listing of recently created pages - * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View - */ - public function showRecentlyUpdated() - { - $pages = $this->entityRepo->getRecentlyUpdatedPaginated('page', 20)->setPath(baseUrl('/pages/recently-updated')); - return view('pages/detailed-listing', [ - 'title' => trans('entities.recently_updated_pages'), - 'pages' => $pages - ]); - } + if (is_null($newParent)) { + $this->showErrorNotification(trans('errors.selected_book_chapter_not_found')); - /** - * Show the Restrictions view. - * @param string $bookSlug - * @param string $pageSlug - * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View - */ - public function showRestrict($bookSlug, $pageSlug) - { - $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug); - $this->checkOwnablePermission('restrictions-manage', $page); - $roles = $this->userRepo->getRestrictableRoles(); - return view('pages/restrictions', [ - 'page' => $page, - 'roles' => $roles - ]); + return redirect()->back(); + } + + $this->checkOwnablePermission('page-create', $newParent); + + $newName = $request->get('name') ?: $page->name; + $pageCopy = $cloner->clonePage($page, $newParent, $newName); + $this->showSuccessNotification(trans('entities.pages_copy_success')); + + return redirect($pageCopy->getUrl()); } /** - * Show the view to choose a new parent to move a page into. - * @param string $bookSlug - * @param string $pageSlug - * @return mixed + * Show the Permissions view. + * * @throws NotFoundException */ - public function showMove($bookSlug, $pageSlug) + public function showPermissions(string $bookSlug, string $pageSlug) { - $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug); - $this->checkOwnablePermission('page-update', $page); - return view('pages/move', [ - 'book' => $page->book, - 'page' => $page + $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug); + $this->checkOwnablePermission('restrictions-manage', $page); + + return view('pages.permissions', [ + 'page' => $page, ]); } /** - * Does the action of moving the location of a page - * @param string $bookSlug - * @param string $pageSlug - * @param Request $request - * @return mixed + * Set the permissions for this page. + * * @throws NotFoundException + * @throws Throwable */ - public function move($bookSlug, $pageSlug, Request $request) + public function permissions(Request $request, PermissionsUpdater $permissionsUpdater, string $bookSlug, string $pageSlug) { - $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug); - $this->checkOwnablePermission('page-update', $page); - - $entitySelection = $request->get('entity_selection', null); - if ($entitySelection === null || $entitySelection === '') { - return redirect($page->getUrl()); - } + $page = $this->pageRepo->getBySlug($bookSlug, $pageSlug); + $this->checkOwnablePermission('restrictions-manage', $page); - $stringExploded = explode(':', $entitySelection); - $entityType = $stringExploded[0]; - $entityId = intval($stringExploded[1]); + $permissionsUpdater->updateFromPermissionsForm($page, $request); - - try { - $parent = $this->entityRepo->getById($entityType, $entityId); - } catch (\Exception $e) { - session()->flash(trans('entities.selected_book_chapter_not_found')); - return redirect()->back(); - } - - $this->entityRepo->changePageParent($page, $parent); - Activity::add($page, 'page_move', $page->book->id); - session()->flash('success', trans('entities.pages_move_success', ['parentName' => $parent->name])); + $this->showSuccessNotification(trans('entities.pages_permissions_success')); return redirect($page->getUrl()); } - - /** - * Set the permissions for this page. - * @param string $bookSlug - * @param string $pageSlug - * @param Request $request - * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector - */ - public function restrict($bookSlug, $pageSlug, Request $request) - { - $page = $this->entityRepo->getBySlug('page', $pageSlug, $bookSlug); - $this->checkOwnablePermission('restrictions-manage', $page); - $this->entityRepo->updateEntityPermissionsFromRequest($request, $page); - session()->flash('success', trans('entities.pages_permissions_success')); - return redirect($page->getUrl()); - } - }