mirror of
https://github.com/BookStackApp/BookStack.git
synced 2024-10-01 01:36:00 -04:00
c7a2d568bf
Tools seems to fit better since the classes were a bit of a mixed bunch and did not always manage. Also simplified the structure of the SlugGenerator class. Also focused EntityContext on shelves and simplified to use session helper.
133 lines
4.3 KiB
PHP
133 lines
4.3 KiB
PHP
<?php namespace BookStack\Http\Controllers;
|
|
|
|
use BookStack\Entities\Tools\PageContent;
|
|
use BookStack\Entities\Repos\PageRepo;
|
|
use BookStack\Exceptions\NotFoundException;
|
|
use GatherContent\Htmldiff\Htmldiff;
|
|
|
|
class PageRevisionController extends Controller
|
|
{
|
|
|
|
protected $pageRepo;
|
|
|
|
/**
|
|
* PageRevisionController constructor.
|
|
*/
|
|
public function __construct(PageRepo $pageRepo)
|
|
{
|
|
$this->pageRepo = $pageRepo;
|
|
}
|
|
|
|
/**
|
|
* Shows the last revisions for this page.
|
|
* @throws NotFoundException
|
|
*/
|
|
public function index(string $bookSlug, string $pageSlug)
|
|
{
|
|
$page = $this->pageRepo->getBySlug($bookSlug, $pageSlug);
|
|
$this->setPageTitle(trans('entities.pages_revisions_named', ['pageName'=>$page->getShortName()]));
|
|
return view('pages.revisions', [
|
|
'page' => $page,
|
|
'current' => $page
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Shows a preview of a single revision.
|
|
* @throws NotFoundException
|
|
*/
|
|
public function show(string $bookSlug, string $pageSlug, int $revisionId)
|
|
{
|
|
$page = $this->pageRepo->getBySlug($bookSlug, $pageSlug);
|
|
$revision = $page->revisions()->where('id', '=', $revisionId)->first();
|
|
if ($revision === null) {
|
|
throw new NotFoundException();
|
|
}
|
|
|
|
$page->fill($revision->toArray());
|
|
// TODO - Refactor PageContent so we don't need to juggle this
|
|
$page->html = $revision->html;
|
|
$page->html = (new PageContent($page))->render();
|
|
|
|
$this->setPageTitle(trans('entities.pages_revision_named', ['pageName' => $page->getShortName()]));
|
|
return view('pages.revision', [
|
|
'page' => $page,
|
|
'book' => $page->book,
|
|
'diff' => null,
|
|
'revision' => $revision
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Shows the changes of a single revision.
|
|
* @throws NotFoundException
|
|
*/
|
|
public function changes(string $bookSlug, string $pageSlug, int $revisionId)
|
|
{
|
|
$page = $this->pageRepo->getBySlug($bookSlug, $pageSlug);
|
|
$revision = $page->revisions()->where('id', '=', $revisionId)->first();
|
|
if ($revision === null) {
|
|
throw new NotFoundException();
|
|
}
|
|
|
|
$prev = $revision->getPrevious();
|
|
$prevContent = $prev->html ?? '';
|
|
$diff = (new Htmldiff)->diff($prevContent, $revision->html);
|
|
|
|
$page->fill($revision->toArray());
|
|
// TODO - Refactor PageContent so we don't need to juggle this
|
|
$page->html = $revision->html;
|
|
$page->html = (new PageContent($page))->render();
|
|
$this->setPageTitle(trans('entities.pages_revision_named', ['pageName'=>$page->getShortName()]));
|
|
|
|
return view('pages.revision', [
|
|
'page' => $page,
|
|
'book' => $page->book,
|
|
'diff' => $diff,
|
|
'revision' => $revision
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* Restores a page using the content of the specified revision.
|
|
* @throws NotFoundException
|
|
*/
|
|
public function restore(string $bookSlug, string $pageSlug, int $revisionId)
|
|
{
|
|
$page = $this->pageRepo->getBySlug($bookSlug, $pageSlug);
|
|
$this->checkOwnablePermission('page-update', $page);
|
|
|
|
$page = $this->pageRepo->restoreRevision($page, $revisionId);
|
|
|
|
return redirect($page->getUrl());
|
|
}
|
|
|
|
/**
|
|
* Deletes a revision using the id of the specified revision.
|
|
* @throws NotFoundException
|
|
*/
|
|
public function destroy(string $bookSlug, string $pageSlug, int $revId)
|
|
{
|
|
$page = $this->pageRepo->getBySlug($bookSlug, $pageSlug);
|
|
$this->checkOwnablePermission('page-delete', $page);
|
|
|
|
$revision = $page->revisions()->where('id', '=', $revId)->first();
|
|
if ($revision === null) {
|
|
throw new NotFoundException("Revision #{$revId} not found");
|
|
}
|
|
|
|
// Get the current revision for the page
|
|
$currentRevision = $page->getCurrentRevision();
|
|
|
|
// Check if its the latest revision, cannot delete latest revision.
|
|
if (intval($currentRevision->id) === intval($revId)) {
|
|
$this->showErrorNotification(trans('entities.revision_cannot_delete_latest'));
|
|
return redirect($page->getUrl('/revisions'));
|
|
}
|
|
|
|
$revision->delete();
|
|
$this->showSuccessNotification(trans('entities.revision_delete_success'));
|
|
return redirect($page->getUrl('/revisions'));
|
|
}
|
|
}
|