]> BookStack Code Mirror - bookstack/blob - app/Http/Controllers/PageController.php
970d0dc03dad45482e46253483a7923bf2663d52
[bookstack] / app / Http / Controllers / PageController.php
1 <?php
2
3 namespace BookStack\Http\Controllers;
4
5 use Activity;
6 use BookStack\Services\ExportService;
7 use Illuminate\Http\Request;
8
9 use Illuminate\Support\Facades\Auth;
10 use BookStack\Http\Requests;
11 use BookStack\Repos\BookRepo;
12 use BookStack\Repos\ChapterRepo;
13 use BookStack\Repos\PageRepo;
14 use Views;
15
16 class PageController extends Controller
17 {
18
19     protected $pageRepo;
20     protected $bookRepo;
21     protected $chapterRepo;
22     protected $exportService;
23
24     /**
25      * PageController constructor.
26      * @param PageRepo      $pageRepo
27      * @param BookRepo      $bookRepo
28      * @param ChapterRepo   $chapterRepo
29      * @param ExportService $exportService
30      */
31     public function __construct(PageRepo $pageRepo, BookRepo $bookRepo, ChapterRepo $chapterRepo, ExportService $exportService)
32     {
33         $this->pageRepo = $pageRepo;
34         $this->bookRepo = $bookRepo;
35         $this->chapterRepo = $chapterRepo;
36         $this->exportService = $exportService;
37         parent::__construct();
38     }
39
40     /**
41      * Show the form for creating a new page.
42      *
43      * @param      $bookSlug
44      * @param bool $chapterSlug
45      * @return Response
46      * @internal param bool $pageSlug
47      */
48     public function create($bookSlug, $chapterSlug = false)
49     {
50         $this->checkPermission('page-create');
51         $book = $this->bookRepo->getBySlug($bookSlug);
52         $chapter = $chapterSlug ? $this->chapterRepo->getBySlug($chapterSlug, $book->id) : false;
53         $this->setPageTitle('Create New Page');
54         return view('pages/create', ['book' => $book, 'chapter' => $chapter]);
55     }
56
57     /**
58      * Store a newly created page in storage.
59      *
60      * @param  Request $request
61      * @param          $bookSlug
62      * @return Response
63      */
64     public function store(Request $request, $bookSlug)
65     {
66         $this->checkPermission('page-create');
67         $this->validate($request, [
68             'name'   => 'required|string|max:255'
69         ]);
70
71         $input = $request->all();
72         $book = $this->bookRepo->getBySlug($bookSlug);
73         $chapterId = ($request->has('chapter') && $this->chapterRepo->idExists($request->get('chapter'))) ? $request->get('chapter') : null;
74         $input['priority'] = $this->bookRepo->getNewPriority($book);
75
76         $page = $this->pageRepo->saveNew($input, $book, $chapterId);
77
78         Activity::add($page, 'page_create', $book->id);
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         $sidebarTree = $this->bookRepo->getChildren($book);
94         Views::add($page);
95         $this->setPageTitle($page->getShortName());
96         return view('pages/show', ['page' => $page, 'book' => $book, 'current' => $page, 'sidebarTree' => $sidebarTree]);
97     }
98
99     /**
100      * Show the form for editing the specified page.
101      *
102      * @param $bookSlug
103      * @param $pageSlug
104      * @return Response
105      */
106     public function edit($bookSlug, $pageSlug)
107     {
108         $this->checkPermission('page-update');
109         $book = $this->bookRepo->getBySlug($bookSlug);
110         $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
111         $this->setPageTitle('Editing Page ' . $page->getShortName());
112         return view('pages/edit', ['page' => $page, 'book' => $book, 'current' => $page]);
113     }
114
115     /**
116      * Update the specified page in storage.
117      *
118      * @param  Request $request
119      * @param          $bookSlug
120      * @param          $pageSlug
121      * @return Response
122      */
123     public function update(Request $request, $bookSlug, $pageSlug)
124     {
125         $this->checkPermission('page-update');
126         $this->validate($request, [
127             'name'   => 'required|string|max:255'
128         ]);
129         $book = $this->bookRepo->getBySlug($bookSlug);
130         $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
131         $this->pageRepo->updatePage($page, $book->id, $request->all());
132         Activity::add($page, 'page_update', $book->id);
133         return redirect($page->getUrl());
134     }
135
136     /**
137      * Redirect from a special link url which
138      * uses the page id rather than the name.
139      * @param $pageId
140      * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
141      */
142     public function redirectFromLink($pageId)
143     {
144         $page = $this->pageRepo->getById($pageId);
145         return redirect($page->getUrl());
146     }
147
148     /**
149      * Show the deletion page for the specified page.
150      * @param $bookSlug
151      * @param $pageSlug
152      * @return \Illuminate\View\View
153      */
154     public function showDelete($bookSlug, $pageSlug)
155     {
156         $this->checkPermission('page-delete');
157         $book = $this->bookRepo->getBySlug($bookSlug);
158         $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
159         $this->setPageTitle('Delete Page ' . $page->getShortName());
160         return view('pages/delete', ['book' => $book, 'page' => $page, 'current' => $page]);
161     }
162
163     /**
164      * Remove the specified page from storage.
165      *
166      * @param $bookSlug
167      * @param $pageSlug
168      * @return Response
169      * @internal param int $id
170      */
171     public function destroy($bookSlug, $pageSlug)
172     {
173         $this->checkPermission('page-delete');
174         $book = $this->bookRepo->getBySlug($bookSlug);
175         $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
176         Activity::addMessage('page_delete', $book->id, $page->name);
177         $this->pageRepo->destroy($page);
178         return redirect($book->getUrl());
179     }
180
181     /**
182      * Shows the last revisions for this page.
183      * @param $bookSlug
184      * @param $pageSlug
185      * @return \Illuminate\View\View
186      */
187     public function showRevisions($bookSlug, $pageSlug)
188     {
189         $book = $this->bookRepo->getBySlug($bookSlug);
190         $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
191         $this->setPageTitle('Revisions For ' . $page->getShortName());
192         return view('pages/revisions', ['page' => $page, 'book' => $book, 'current' => $page]);
193     }
194
195     /**
196      * Shows a preview of a single revision
197      * @param $bookSlug
198      * @param $pageSlug
199      * @param $revisionId
200      * @return \Illuminate\View\View
201      */
202     public function showRevision($bookSlug, $pageSlug, $revisionId)
203     {
204         $book = $this->bookRepo->getBySlug($bookSlug);
205         $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
206         $revision = $this->pageRepo->getRevisionById($revisionId);
207         $page->fill($revision->toArray());
208         $this->setPageTitle('Page Revision For ' . $page->getShortName());
209         return view('pages/revision', ['page' => $page, 'book' => $book]);
210     }
211
212     /**
213      * Restores a page using the content of the specified revision.
214      * @param $bookSlug
215      * @param $pageSlug
216      * @param $revisionId
217      * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
218      */
219     public function restoreRevision($bookSlug, $pageSlug, $revisionId)
220     {
221         $this->checkPermission('page-update');
222         $book = $this->bookRepo->getBySlug($bookSlug);
223         $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
224         $page = $this->pageRepo->restoreRevision($page, $book, $revisionId);
225         Activity::add($page, 'page_restore', $book->id);
226         return redirect($page->getUrl());
227     }
228
229     public function exportPdf($bookSlug, $pageSlug)
230     {
231         $book = $this->bookRepo->getBySlug($bookSlug);
232         $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
233         $cssContent = file_get_contents(public_path('/css/styles.css'));
234
235         return $pdf->download($pageSlug . '.pdf');
236     }
237
238     /**
239      * Export a page to a self-contained HTML file.
240      * @param $bookSlug
241      * @param $pageSlug
242      * @return \Illuminate\Http\Response
243      */
244     public function exportHtml($bookSlug, $pageSlug)
245     {
246         $book = $this->bookRepo->getBySlug($bookSlug);
247         $page = $this->pageRepo->getBySlug($pageSlug, $book->id);
248         $containedHtml = $this->exportService->pageToContainedHtml($page);
249         return response()->make($containedHtml, 200, [
250             'Content-Type' => 'application/octet-stream',
251             'Content-Disposition' => 'attachment; filename="'.$pageSlug.'.html'
252         ]);
253     }
254 }