3 namespace BookStack\Entities\Repos;
5 use BookStack\Entities\Models\Page;
6 use BookStack\Entities\Models\PageRevision;
7 use Illuminate\Database\Eloquent\Builder;
12 * Get a revision by its stored book and page slug values.
14 public function getBySlugs(string $bookSlug, string $pageSlug): ?PageRevision
16 /** @var ?PageRevision $revision */
17 $revision = PageRevision::query()
18 ->whereHas('page', function (Builder $query) {
19 $query->scopes('visible');
21 ->where('slug', '=', $pageSlug)
22 ->where('type', '=', 'version')
23 ->where('book_slug', '=', $bookSlug)
24 ->orderBy('created_at', 'desc')
32 * Get the latest draft revision, for the given page, belonging to the current user.
34 public function getLatestDraftForCurrentUser(Page $page): ?PageRevision
36 /** @var ?PageRevision $revision */
37 $revision = $this->queryForCurrentUserDraft($page->id)->first();
43 * Delete all drafts revisions, for the given page, belonging to the current user.
45 public function deleteDraftsForCurrentUser(Page $page): void
47 $this->queryForCurrentUserDraft($page->id)->delete();
51 * Get a user update_draft page revision to update for the given page.
52 * Checks for an existing revisions before providing a fresh one.
54 public function getNewDraftForCurrentUser(Page $page): PageRevision
56 $draft = $this->getLatestDraftForCurrentUser($page);
62 $draft = new PageRevision();
63 $draft->page_id = $page->id;
64 $draft->slug = $page->slug;
65 $draft->book_slug = $page->book->slug;
66 $draft->created_by = user()->id;
67 $draft->type = 'update_draft';
73 * Store a new revision in the system for the given page.
75 public function storeNewForPage(Page $page, string $summary = null): PageRevision
77 $revision = new PageRevision();
79 $revision->name = $page->name;
80 $revision->html = $page->html;
81 $revision->markdown = $page->markdown;
82 $revision->text = $page->text;
83 $revision->page_id = $page->id;
84 $revision->slug = $page->slug;
85 $revision->book_slug = $page->book->slug;
86 $revision->created_by = user()->id;
87 $revision->created_at = $page->updated_at;
88 $revision->type = 'version';
89 $revision->summary = $summary;
90 $revision->revision_number = $page->revision_count;
93 $this->deleteOldRevisions($page);
99 * Delete old revisions, for the given page, from the system.
101 protected function deleteOldRevisions(Page $page)
103 $revisionLimit = config('app.revision_limit');
104 if ($revisionLimit === false) {
108 $revisionsToDelete = PageRevision::query()
109 ->where('page_id', '=', $page->id)
110 ->orderBy('created_at', 'desc')
111 ->skip(intval($revisionLimit))
115 if ($revisionsToDelete->count() > 0) {
116 PageRevision::query()->whereIn('id', $revisionsToDelete->pluck('id'))->delete();
121 * Query update draft revisions for the current user.
123 protected function queryForCurrentUserDraft(int $pageId): Builder
125 return PageRevision::query()
126 ->where('created_by', '=', user()->id)
127 ->where('type', 'update_draft')
128 ->where('page_id', '=', $pageId)
129 ->orderBy('created_at', 'desc');