+ /**
+ * Updates a page with any fillable data and saves it into the database.
+ * @param Page $page
+ * @param $book_id
+ * @param $data
+ * @return Page
+ */
+ public function updatePage(Page $page, $book_id, $data)
+ {
+ $page->fill($data);
+ $page->slug = $this->findSuitableSlug($page->name, $book_id, $page->id);
+ $page->text = strip_tags($page->html);
+ $page->updated_by = Auth::user()->id;
+ $page->save();
+ $this->saveRevision($page);
+ return $page;
+ }
+
+ /**
+ * Saves a page revision into the system.
+ * @param Page $page
+ * @return $this
+ */
+ public function saveRevision(Page $page)
+ {
+ $lastRevision = $this->getLastRevision($page);
+ if($lastRevision && ($lastRevision->html === $page->html && $lastRevision->name === $page->name)) {
+ return $page;
+ }
+ $revision = $this->pageRevision->fill($page->toArray());
+ $revision->page_id = $page->id;
+ $revision->created_by = Auth::user()->id;
+ $revision->save();
+ // Clear old revisions
+ if($this->pageRevision->where('page_id', '=', $page->id)->count() > 50) {
+ $this->pageRevision->where('page_id', '=', $page->id)
+ ->orderBy('created_at', 'desc')->skip(50)->take(5)->delete();
+ }
+ return $revision;
+ }
+
+ /**
+ * Gets the most recent revision for a page.
+ * @param Page $page
+ * @return mixed
+ */
+ public function getLastRevision(Page $page)
+ {
+ return $this->pageRevision->where('page_id', '=', $page->id)
+ ->orderBy('created_at', 'desc')->first();
+ }
+
+ /**
+ * Gets a single revision via it's id.
+ * @param $id
+ * @return mixed
+ */
+ public function getRevisionById($id)
+ {
+ return $this->pageRevision->findOrFail($id);
+ }
+