]> BookStack Code Mirror - bookstack/blob - app/Http/Controllers/PageController.php
Added page revisions. Fixes #2
[bookstack] / app / Http / Controllers / PageController.php
1 <?php
2
3 namespace Oxbow\Http\Controllers;
4
5 use Illuminate\Http\Request;
6
7 use Illuminate\Support\Facades\Auth;
8 use Illuminate\Support\Str;
9 use Oxbow\Http\Requests;
10 use Oxbow\Repos\BookRepo;
11 use Oxbow\Repos\ChapterRepo;
12 use Oxbow\Repos\PageRepo;
13
14 class PageController extends Controller
15 {
16
17     protected $pageRepo;
18     protected $bookRepo;
19     protected $chapterRepo;
20
21     /**
22      * PageController constructor.
23      * @param PageRepo $pageRepo
24      * @param BookRepo $bookRepo
25      * @param ChapterRepo $chapterRepo
26      */
27     public function __construct(PageRepo $pageRepo, BookRepo $bookRepo, ChapterRepo $chapterRepo)
28     {
29         $this->pageRepo = $pageRepo;
30         $this->bookRepo = $bookRepo;
31         $this->chapterRepo = $chapterRepo;
32     }
33
34     /**
35      * Show the form for creating a new page.
36      *
37      * @param $bookSlug
38      * @param bool $chapterSlug
39      * @return Response
40      * @internal param bool $pageSlug
41      */
42     public function create($bookSlug, $chapterSlug = false)
43     {
44         $book = $this->bookRepo->getBySlug($bookSlug);
45         $chapter = $chapterSlug ? $this->chapterRepo->getBySlug($chapterSlug, $book->id) : false;
46         return view('pages/create', ['book' => $book, 'chapter' => $chapter]);
47     }
48
49     /**
50      * Store a newly created page in storage.
51      *
52      * @param  Request $request
53      * @param $bookSlug
54      * @return Response
55      */
56     public function store(Request $request, $bookSlug)
57     {
58         $this->validate($request, [
59             'name' => 'required|string|max:255',
60             'html' => 'required|string',
61             'parent' => 'integer|exists:pages,id'
62         ]);
63         $book = $this->bookRepo->getBySlug($bookSlug);
64         $page = $this->pageRepo->newFromInput($request->all());
65
66         $page->slug = $this->pageRepo->findSuitableSlug($page->name, $book->id);
67         $page->priority = $this->bookRepo->getNewPriority($book);
68
69         if($request->has('chapter') && $this->chapterRepo->idExists($request->get('chapter'))) {
70             $page->chapter_id = $request->get('chapter');
71         }
72
73         $page->book_id = $book->id;
74         $page->text = strip_tags($page->html);
75         $page->created_by = Auth::user()->id;
76         $page->updated_by = Auth::user()->id;
77         $page->save();
78         $this->pageRepo->saveRevision($page);
79         return redirect($page->getUrl());
80     }
81
82     /**
83      * Display the specified page.
84      *
85      * @param $bookSlug
86      * @param $pageSlug
87      * @return Response
88      */
89     public function show($bookSlug, $pageSlug)
90     {
91         $book = $this->bookRepo->getBySlug($bookSlug);
92         $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
93         return view('pages/show', ['page' => $page, 'book' => $book]);
94     }
95
96     /**
97      * Show the form for editing the specified page.
98      *
99      * @param $bookSlug
100      * @param $pageSlug
101      * @return Response
102      */
103     public function edit($bookSlug, $pageSlug)
104     {
105         $book = $this->bookRepo->getBySlug($bookSlug);
106         $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
107         return view('pages/edit', ['page' => $page, 'book' => $book]);
108     }
109
110     /**
111      * Update the specified page in storage.
112      *
113      * @param  Request $request
114      * @param $bookSlug
115      * @param $pageSlug
116      * @return Response
117      */
118     public function update(Request $request, $bookSlug, $pageSlug)
119     {
120         $book = $this->bookRepo->getBySlug($bookSlug);
121         $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
122         $this->pageRepo->updatePage($page, $book->id, $request->all());
123         return redirect($page->getUrl());
124     }
125
126     /**
127      * Redirect from a special link url which
128      * uses the page id rather than the name.
129      * @param $pageId
130      * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
131      */
132     public function redirectFromLink($pageId)
133     {
134         $page = $this->pageRepo->getById($pageId);
135         return redirect($page->getUrl());
136     }
137
138     /**
139      * Search all available pages, Across all books.
140      * @param Request $request
141      * @return \Illuminate\Http\RedirectResponse|\Illuminate\View\View
142      */
143     public function searchAll(Request $request)
144     {
145         $searchTerm = $request->get('term');
146         if(empty($searchTerm)) return redirect()->back();
147
148         $pages = $this->pageRepo->getBySearch($searchTerm);
149         return view('pages/search-results', ['pages' => $pages, 'searchTerm' => $searchTerm]);
150     }
151
152     /**
153      * Shows the view which allows pages to be re-ordered and sorted.
154      * @param $bookSlug
155      * @return \Illuminate\View\View
156      */
157     public function sortPages($bookSlug)
158     {
159         $book = $this->bookRepo->getBySlug($bookSlug);
160         return view('pages/sort', ['book' => $book]);
161     }
162
163     /**
164      * Saves an array of sort mapping to pages and chapters.
165      *
166      * @param $bookSlug
167      * @param Request $request
168      * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
169      */
170     public function savePageSort($bookSlug, Request $request)
171     {
172         $book = $this->bookRepo->getBySlug($bookSlug);
173         // Return if no map sent
174         if(!$request->has('sort-tree')) {
175             return redirect($book->getUrl());
176         }
177
178         // Sort pages and chapters
179         $sortMap = json_decode($request->get('sort-tree'));
180         foreach($sortMap as $index => $bookChild) {
181             $id = $bookChild->id;
182             $isPage = $bookChild->type == 'page';
183             $model = $isPage ? $this->pageRepo->getById($id) : $this->chapterRepo->getById($id);
184             $model->priority = $index;
185             if($isPage) {
186                 $model->chapter_id = ($bookChild->parentChapter === false) ? 0 : $bookChild->parentChapter;
187             }
188             $model->save();
189         }
190         return redirect($book->getUrl());
191     }
192
193     /**
194      * Show the deletion page for the specified page.
195      * @param $bookSlug
196      * @param $pageSlug
197      * @return \Illuminate\View\View
198      */
199     public function showDelete($bookSlug, $pageSlug)
200     {
201         $book = $this->bookRepo->getBySlug($bookSlug);
202         $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
203         return view('pages/delete', ['book' => $book, 'page' => $page]);
204     }
205
206     /**
207      * Remove the specified page from storage.
208      *
209      * @param $bookSlug
210      * @param $pageSlug
211      * @return Response
212      * @internal param int $id
213      */
214     public function destroy($bookSlug, $pageSlug)
215     {
216         $book = $this->bookRepo->getBySlug($bookSlug);
217         $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
218         $page->delete();
219         return redirect($book->getUrl());
220     }
221
222     /**
223      * Shows the last revisions for this page.
224      * @param $bookSlug
225      * @param $pageSlug
226      * @return \Illuminate\View\View
227      */
228     public function showRevisions($bookSlug, $pageSlug)
229     {
230         $book = $this->bookRepo->getBySlug($bookSlug);
231         $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
232         return view('pages/revisions', ['page' => $page, 'book' => $book]);
233     }
234
235     /**
236      * Shows a preview of a single revision
237      * @param $bookSlug
238      * @param $pageSlug
239      * @param $revisionId
240      * @return \Illuminate\View\View
241      */
242     public function showRevision($bookSlug, $pageSlug, $revisionId)
243     {
244         $book = $this->bookRepo->getBySlug($bookSlug);
245         $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
246         $revision = $this->pageRepo->getRevisionById($revisionId);
247         $page->fill($revision->toArray());
248         return view('pages/revision', ['page' => $page, 'book' => $book]);
249     }
250
251     public function restoreRevision($bookSlug, $pageSlug, $revisionId)
252     {
253         $book = $this->bookRepo->getBySlug($bookSlug);
254         $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
255         $revision = $this->pageRepo->getRevisionById($revisionId);
256         $page = $this->pageRepo->updatePage($page, $book->id, $revision->toArray());
257         return redirect($page->getUrl());
258     }
259 }