]> BookStack Code Mirror - bookstack/blob - app/Entities/Tools/PageEditActivity.php
Fixed lack of oidc discovery filtering during testing
[bookstack] / app / Entities / Tools / PageEditActivity.php
1 <?php
2
3 namespace BookStack\Entities\Tools;
4
5 use BookStack\Entities\Models\Page;
6 use BookStack\Entities\Models\PageRevision;
7 use Carbon\Carbon;
8 use Illuminate\Database\Eloquent\Builder;
9
10 class PageEditActivity
11 {
12     protected $page;
13
14     /**
15      * PageEditActivity constructor.
16      */
17     public function __construct(Page $page)
18     {
19         $this->page = $page;
20     }
21
22     /**
23      * Check if there's active editing being performed on this page.
24      */
25     public function hasActiveEditing(): bool
26     {
27         return $this->activePageEditingQuery(60)->count() > 0;
28     }
29
30     /**
31      * Get a notification message concerning the editing activity on the page.
32      */
33     public function activeEditingMessage(): string
34     {
35         $pageDraftEdits = $this->activePageEditingQuery(60)->get();
36         $count = $pageDraftEdits->count();
37
38         $userMessage = $count > 1 ? trans('entities.pages_draft_edit_active.start_a', ['count' => $count]) : trans('entities.pages_draft_edit_active.start_b', ['userName' => $pageDraftEdits->first()->createdBy->name]);
39         $timeMessage = trans('entities.pages_draft_edit_active.time_b', ['minCount'=> 60]);
40
41         return trans('entities.pages_draft_edit_active.message', ['start' => $userMessage, 'time' => $timeMessage]);
42     }
43
44     /**
45      * Get any editor clash warning messages to show for the given draft revision.
46      * @param PageRevision|Page $draft
47      * @return string[]
48      */
49     public function getWarningMessagesForDraft($draft): array
50     {
51         $warnings = [];
52
53         if ($this->hasActiveEditing()) {
54             $warnings[] = $this->activeEditingMessage();
55         }
56
57         if ($draft instanceof PageRevision && $this->hasPageBeenUpdatedSinceDraftCreated($draft)) {
58             $warnings[] = trans('entities.pages_draft_page_changed_since_creation');
59         }
60
61         return $warnings;
62     }
63
64     /**
65      * Check if the page has been updated since the draft has been saved.
66      */
67     protected function hasPageBeenUpdatedSinceDraftCreated(PageRevision $draft): bool
68     {
69         return $draft->page->updated_at->timestamp > $draft->created_at->timestamp;
70     }
71
72     /**
73      * Get the message to show when the user will be editing one of their drafts.
74      */
75     public function getEditingActiveDraftMessage(PageRevision $draft): string
76     {
77         $message = trans('entities.pages_editing_draft_notification', ['timeDiff' => $draft->updated_at->diffForHumans()]);
78         if ($draft->page->updated_at->timestamp <= $draft->updated_at->timestamp) {
79             return $message;
80         }
81
82         return $message . "\n" . trans('entities.pages_draft_edited_notification');
83     }
84
85     /**
86      * A query to check for active update drafts on a particular page
87      * within the last given many minutes.
88      */
89     protected function activePageEditingQuery(int $withinMinutes): Builder
90     {
91         $checkTime = Carbon::now()->subMinutes($withinMinutes);
92         $query = PageRevision::query()
93             ->where('type', '=', 'update_draft')
94             ->where('page_id', '=', $this->page->id)
95             ->where('updated_at', '>', $this->page->updated_at)
96             ->where('created_by', '!=', user()->id)
97             ->where('updated_at', '>=', $checkTime)
98             ->with('createdBy');
99
100         return $query;
101     }
102 }