]> BookStack Code Mirror - bookstack/blob - app/Http/Controllers/PageController.php
Added limit to books shown on homepage and make alphabetical
[bookstack] / app / Http / Controllers / PageController.php
1 <?php
2
3 namespace BookStack\Http\Controllers;
4
5 use Activity;
6 use Illuminate\Http\Request;
7
8 use Illuminate\Support\Facades\Auth;
9 use BookStack\Http\Requests;
10 use BookStack\Repos\BookRepo;
11 use BookStack\Repos\ChapterRepo;
12 use BookStack\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         parent::__construct();
33     }
34
35     /**
36      * Show the form for creating a new page.
37      *
38      * @param      $bookSlug
39      * @param bool $chapterSlug
40      * @return Response
41      * @internal param bool $pageSlug
42      */
43     public function create($bookSlug, $chapterSlug = false)
44     {
45         $this->checkPermission('page-create');
46         $book = $this->bookRepo->getBySlug($bookSlug);
47         $chapter = $chapterSlug ? $this->chapterRepo->getBySlug($chapterSlug, $book->id) : false;
48         return view('pages/create', ['book' => $book, 'chapter' => $chapter]);
49     }
50
51     /**
52      * Store a newly created page in storage.
53      *
54      * @param  Request $request
55      * @param          $bookSlug
56      * @return Response
57      */
58     public function store(Request $request, $bookSlug)
59     {
60         $this->checkPermission('page-create');
61         $this->validate($request, [
62             'name'   => 'required|string|max:255',
63             'html'   => 'required|string',
64             'parent' => 'integer|exists:pages,id'
65         ]);
66
67         $input = $request->all();
68         $book = $this->bookRepo->getBySlug($bookSlug);
69         $chapterId = ($request->has('chapter') && $this->chapterRepo->idExists($request->get('chapter'))) ? $request->get('chapter') : null;
70         $input['priority'] = $this->bookRepo->getNewPriority($book);
71
72         $page = $this->pageRepo->saveNew($input, $book, $chapterId);
73
74         Activity::add($page, 'page_create', $book->id);
75         return redirect($page->getUrl());
76     }
77
78     /**
79      * Display the specified page.
80      *
81      * @param $bookSlug
82      * @param $pageSlug
83      * @return Response
84      */
85     public function show($bookSlug, $pageSlug)
86     {
87         $book = $this->bookRepo->getBySlug($bookSlug);
88         $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
89         return view('pages/show', ['page' => $page, 'book' => $book, 'current' => $page]);
90     }
91
92     /**
93      * Show the form for editing the specified page.
94      *
95      * @param $bookSlug
96      * @param $pageSlug
97      * @return Response
98      */
99     public function edit($bookSlug, $pageSlug)
100     {
101         $this->checkPermission('page-update');
102         $book = $this->bookRepo->getBySlug($bookSlug);
103         $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
104         return view('pages/edit', ['page' => $page, 'book' => $book, 'current' => $page]);
105     }
106
107     /**
108      * Update the specified page in storage.
109      *
110      * @param  Request $request
111      * @param          $bookSlug
112      * @param          $pageSlug
113      * @return Response
114      */
115     public function update(Request $request, $bookSlug, $pageSlug)
116     {
117         $this->checkPermission('page-update');
118         $book = $this->bookRepo->getBySlug($bookSlug);
119         $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
120         $this->pageRepo->updatePage($page, $book->id, $request->all());
121         Activity::add($page, 'page_update', $book->id);
122         return redirect($page->getUrl());
123     }
124
125     /**
126      * Redirect from a special link url which
127      * uses the page id rather than the name.
128      * @param $pageId
129      * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
130      */
131     public function redirectFromLink($pageId)
132     {
133         $page = $this->pageRepo->getById($pageId);
134         return redirect($page->getUrl());
135     }
136
137     /**
138      * Show the deletion page for the specified page.
139      * @param $bookSlug
140      * @param $pageSlug
141      * @return \Illuminate\View\View
142      */
143     public function showDelete($bookSlug, $pageSlug)
144     {
145         $this->checkPermission('page-delete');
146         $book = $this->bookRepo->getBySlug($bookSlug);
147         $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
148         return view('pages/delete', ['book' => $book, 'page' => $page, 'current' => $page]);
149     }
150
151     /**
152      * Remove the specified page from storage.
153      *
154      * @param $bookSlug
155      * @param $pageSlug
156      * @return Response
157      * @internal param int $id
158      */
159     public function destroy($bookSlug, $pageSlug)
160     {
161         $this->checkPermission('page-delete');
162         $book = $this->bookRepo->getBySlug($bookSlug);
163         $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
164         Activity::addMessage('page_delete', $book->id, $page->name);
165         Activity::removeEntity($page);
166         $page->delete();
167         return redirect($book->getUrl());
168     }
169
170     /**
171      * Shows the last revisions for this page.
172      * @param $bookSlug
173      * @param $pageSlug
174      * @return \Illuminate\View\View
175      */
176     public function showRevisions($bookSlug, $pageSlug)
177     {
178         $book = $this->bookRepo->getBySlug($bookSlug);
179         $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
180         return view('pages/revisions', ['page' => $page, 'book' => $book, 'current' => $page]);
181     }
182
183     /**
184      * Shows a preview of a single revision
185      * @param $bookSlug
186      * @param $pageSlug
187      * @param $revisionId
188      * @return \Illuminate\View\View
189      */
190     public function showRevision($bookSlug, $pageSlug, $revisionId)
191     {
192         $book = $this->bookRepo->getBySlug($bookSlug);
193         $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
194         $revision = $this->pageRepo->getRevisionById($revisionId);
195         $page->fill($revision->toArray());
196         return view('pages/revision', ['page' => $page, 'book' => $book]);
197     }
198
199     /**
200      * Restores a page using the content of the specified revision.
201      * @param $bookSlug
202      * @param $pageSlug
203      * @param $revisionId
204      * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
205      */
206     public function restoreRevision($bookSlug, $pageSlug, $revisionId)
207     {
208         $this->checkPermission('page-update');
209         $book = $this->bookRepo->getBySlug($bookSlug);
210         $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
211         $page = $this->pageRepo->restoreRevision($page, $book, $revisionId);
212         Activity::add($page, 'page_restore', $book->id);
213         return redirect($page->getUrl());
214     }
215 }