]> BookStack Code Mirror - bookstack/blob - app/Entities/Repos/RevisionRepo.php
Vectors: Added command to regenerate for all
[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 BookStack\Entities\Queries\PageRevisionQueries;
8
9 class RevisionRepo
10 {
11     public function __construct(
12         protected PageRevisionQueries $queries,
13     ) {
14     }
15
16     /**
17      * Delete all drafts revisions, for the given page, belonging to the current user.
18      */
19     public function deleteDraftsForCurrentUser(Page $page): void
20     {
21         $this->queries->latestCurrentUserDraftsForPageId($page->id)->delete();
22     }
23
24     /**
25      * Get a user update_draft page revision to update for the given page.
26      * Checks for an existing revisions before providing a fresh one.
27      */
28     public function getNewDraftForCurrentUser(Page $page): PageRevision
29     {
30         $draft = $this->queries->findLatestCurrentUserDraftsForPageId($page->id);
31
32         if ($draft) {
33             return $draft;
34         }
35
36         $draft = new PageRevision();
37         $draft->page_id = $page->id;
38         $draft->slug = $page->slug;
39         $draft->book_slug = $page->book->slug;
40         $draft->created_by = user()->id;
41         $draft->type = 'update_draft';
42
43         return $draft;
44     }
45
46     /**
47      * Store a new revision in the system for the given page.
48      */
49     public function storeNewForPage(Page $page, ?string $summary = null): PageRevision
50     {
51         $revision = new PageRevision();
52
53         $revision->name = $page->name;
54         $revision->html = $page->html;
55         $revision->markdown = $page->markdown;
56         $revision->text = $page->text;
57         $revision->page_id = $page->id;
58         $revision->slug = $page->slug;
59         $revision->book_slug = $page->book->slug;
60         $revision->created_by = user()->id;
61         $revision->created_at = $page->updated_at;
62         $revision->type = 'version';
63         $revision->summary = $summary;
64         $revision->revision_number = $page->revision_count;
65         $revision->save();
66
67         $this->deleteOldRevisions($page);
68
69         return $revision;
70     }
71
72     /**
73      * Delete old revisions, for the given page, from the system.
74      */
75     protected function deleteOldRevisions(Page $page)
76     {
77         $revisionLimit = config('app.revision_limit');
78         if ($revisionLimit === false) {
79             return;
80         }
81
82         $revisionsToDelete = PageRevision::query()
83             ->where('page_id', '=', $page->id)
84             ->orderBy('created_at', 'desc')
85             ->skip(intval($revisionLimit))
86             ->take(10)
87             ->get(['id']);
88
89         if ($revisionsToDelete->count() > 0) {
90             PageRevision::query()->whereIn('id', $revisionsToDelete->pluck('id'))->delete();
91         }
92     }
93 }