]> BookStack Code Mirror - bookstack/blob - app/Entities/Repos/RevisionRepo.php
Added control-upon-access of the default favicon.ico file
[bookstack] / app / Entities / Repos / RevisionRepo.php
1 <?php
2
3 namespace BookStack\Entities\Repos;
4
5 use BookStack\Entities\Models\Page;
6 use BookStack\Entities\Models\PageRevision;
7 use Illuminate\Database\Eloquent\Builder;
8
9 class RevisionRepo
10 {
11     /**
12      * Get a revision by its stored book and page slug values.
13      */
14     public function getBySlugs(string $bookSlug, string $pageSlug): ?PageRevision
15     {
16         /** @var ?PageRevision $revision */
17         $revision = PageRevision::query()
18             ->whereHas('page', function (Builder $query) {
19                 $query->scopes('visible');
20             })
21             ->where('slug', '=', $pageSlug)
22             ->where('type', '=', 'version')
23             ->where('book_slug', '=', $bookSlug)
24             ->orderBy('created_at', 'desc')
25             ->with('page')
26             ->first();
27
28         return $revision;
29     }
30
31     /**
32      * Get the latest draft revision, for the given page, belonging to the current user.
33      */
34     public function getLatestDraftForCurrentUser(Page $page): ?PageRevision
35     {
36         /** @var ?PageRevision $revision */
37         $revision = $this->queryForCurrentUserDraft($page->id)->first();
38
39         return $revision;
40     }
41
42     /**
43      * Delete all drafts revisions, for the given page, belonging to the current user.
44      */
45     public function deleteDraftsForCurrentUser(Page $page): void
46     {
47         $this->queryForCurrentUserDraft($page->id)->delete();
48     }
49
50     /**
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.
53      */
54     public function getNewDraftForCurrentUser(Page $page): PageRevision
55     {
56         $draft = $this->getLatestDraftForCurrentUser($page);
57
58         if ($draft) {
59             return $draft;
60         }
61
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';
68
69         return $draft;
70     }
71
72     /**
73      * Store a new revision in the system for the given page.
74      */
75     public function storeNewForPage(Page $page, string $summary = null): PageRevision
76     {
77         $revision = new PageRevision();
78
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;
91         $revision->save();
92
93         $this->deleteOldRevisions($page);
94
95         return $revision;
96     }
97
98     /**
99      * Delete old revisions, for the given page, from the system.
100      */
101     protected function deleteOldRevisions(Page $page)
102     {
103         $revisionLimit = config('app.revision_limit');
104         if ($revisionLimit === false) {
105             return;
106         }
107
108         $revisionsToDelete = PageRevision::query()
109             ->where('page_id', '=', $page->id)
110             ->orderBy('created_at', 'desc')
111             ->skip(intval($revisionLimit))
112             ->take(10)
113             ->get(['id']);
114
115         if ($revisionsToDelete->count() > 0) {
116             PageRevision::query()->whereIn('id', $revisionsToDelete->pluck('id'))->delete();
117         }
118     }
119
120     /**
121      * Query update draft revisions for the current user.
122      */
123     protected function queryForCurrentUserDraft(int $pageId): Builder
124     {
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');
130     }
131 }