- // Save page tags if present
- if (isset($input['tags'])) {
- $this->tagRepo->saveTagsToEntity($page, $input['tags']);
+ return Book::visible()->where('slug', '=', $bookSlug)->firstOrFail();
+ }
+
+ /**
+ * Get the draft copy of the given page for the current user.
+ */
+ public function getUserDraft(Page $page): ?PageRevision
+ {
+ $revision = $this->getUserDraftQuery($page)->first();
+ return $revision;
+ }
+
+ /**
+ * Get a new draft page belonging to the given parent entity.
+ */
+ public function getNewDraftPage(Entity $parent)
+ {
+ $page = (new Page())->forceFill([
+ 'name' => trans('entities.pages_initial_name'),
+ 'created_by' => user()->id,
+ 'updated_by' => user()->id,
+ 'draft' => true,
+ ]);
+
+ if ($parent instanceof Chapter) {
+ $page->chapter_id = $parent->id;
+ $page->book_id = $parent->book_id;
+ } else {
+ $page->book_id = $parent->id;
+ }
+
+ $page->save();
+ $page->refresh()->rebuildPermissions();
+ return $page;
+ }
+
+ /**
+ * Publish a draft page to make it a live, non-draft page.
+ */
+ public function publishDraft(Page $draft, array $input): Page
+ {
+ $this->baseRepo->update($draft, $input);
+ if (isset($input['template']) && userCan('templates-manage')) {
+ $draft->template = ($input['template'] === 'true');