<?php namespace BookStack\Entities\Repos;
-use BookStack\Entities\Book;
-use BookStack\Entities\Chapter;
-use BookStack\Entities\Entity;
-use BookStack\Entities\Managers\BookContents;
-use BookStack\Entities\Managers\PageContent;
-use BookStack\Entities\Managers\TrashCan;
-use BookStack\Entities\Page;
-use BookStack\Entities\PageRevision;
+use BookStack\Actions\ActivityType;
+use BookStack\Entities\Models\Book;
+use BookStack\Entities\Models\Chapter;
+use BookStack\Entities\Models\Entity;
+use BookStack\Entities\Tools\BookContents;
+use BookStack\Entities\Tools\PageContent;
+use BookStack\Entities\Tools\TrashCan;
+use BookStack\Entities\Models\Page;
+use BookStack\Entities\Models\PageRevision;
use BookStack\Exceptions\MoveOperationException;
use BookStack\Exceptions\NotFoundException;
-use BookStack\Exceptions\NotifyException;
use BookStack\Exceptions\PermissionsException;
+use BookStack\Facades\Activity;
use Exception;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Pagination\LengthAwarePaginator;
* Get a page by ID.
* @throws NotFoundException
*/
- public function getById(int $id): Page
+ public function getById(int $id, array $relations = ['book']): Page
{
- $page = Page::visible()->with(['book'])->find($id);
+ $page = Page::visible()->with($relations)->find($id);
if (!$page) {
throw new NotFoundException(trans('errors.page_not_found'));
$page = (new Page())->forceFill([
'name' => trans('entities.pages_initial_name'),
'created_by' => user()->id,
+ 'owned_by' => user()->id,
'updated_by' => user()->id,
'draft' => true,
]);
public function publishDraft(Page $draft, array $input): Page
{
$this->baseRepo->update($draft, $input);
- if (isset($input['template']) && userCan('templates-manage')) {
- $draft->template = ($input['template'] === 'true');
- }
+ $this->updateTemplateStatusAndContentFromInput($draft, $input);
- $pageContent = new PageContent($draft);
- $pageContent->setNewHTML($input['html']);
$draft->draft = false;
$draft->revision_count = 1;
$draft->priority = $this->getNewPriority($draft);
$this->savePageRevision($draft, trans('entities.pages_initial_revision'));
$draft->indexForSearch();
- return $draft->refresh();
+ $draft->refresh();
+
+ Activity::addForEntity($draft, ActivityType::PAGE_CREATE);
+ return $draft;
}
/**
$oldHtml = $page->html;
$oldName = $page->name;
- if (isset($input['template']) && userCan('templates-manage')) {
- $page->template = ($input['template'] === 'true');
- }
-
- $pageContent = new PageContent($page);
- $pageContent->setNewHTML($input['html']);
+ $this->updateTemplateStatusAndContentFromInput($page, $input);
$this->baseRepo->update($page, $input);
// Update with new details
$this->savePageRevision($page, $summary);
}
+ Activity::addForEntity($page, ActivityType::PAGE_UPDATE);
return $page;
}
+ protected function updateTemplateStatusAndContentFromInput(Page $page, array $input)
+ {
+ if (isset($input['template']) && userCan('templates-manage')) {
+ $page->template = ($input['template'] === 'true');
+ }
+
+ $pageContent = new PageContent($page);
+ if (!empty($input['markdown'] ?? '')) {
+ $pageContent->setNewMarkdown($input['markdown']);
+ } else {
+ $pageContent->setNewHTML($input['html']);
+ }
+ }
+
/**
* Saves a page revision into the system.
*/
- protected function savePageRevision(Page $page, string $summary = null)
+ protected function savePageRevision(Page $page, string $summary = null): PageRevision
{
$revision = new PageRevision($page->getAttributes());
{
// If the page itself is a draft simply update that
if ($page->draft) {
- $page->fill($input);
if (isset($input['html'])) {
- $content = new PageContent($page);
- $content->setNewHTML($input['html']);
+ (new PageContent($page))->setNewHTML($input['html']);
}
+ $page->fill($input);
$page->save();
return $page;
}
{
$trashCan = new TrashCan();
$trashCan->softDestroyPage($page);
+ Activity::addForEntity($page, ActivityType::PAGE_DELETE);
$trashCan->autoClearOld();
}
public function restoreRevision(Page $page, int $revisionId): Page
{
$page->revision_count++;
- $this->savePageRevision($page);
-
$revision = $page->revisions()->where('id', '=', $revisionId)->first();
+
$page->fill($revision->toArray());
$content = new PageContent($page);
$content->setNewHTML($revision->html);
$page->updated_by = user()->id;
$page->refreshSlug();
$page->save();
-
$page->indexForSearch();
+
+ $summary = trans('entities.pages_revision_restored_from', ['id' => strval($revisionId), 'summary' => $revision->summary]);
+ $this->savePageRevision($page, $summary);
+
+ Activity::addForEntity($page, ActivityType::PAGE_RESTORE);
return $page;
}
* @throws MoveOperationException
* @throws PermissionsException
*/
- public function move(Page $page, string $parentIdentifier): Book
+ public function move(Page $page, string $parentIdentifier): Entity
{
$parent = $this->findParentByIdentifier($parentIdentifier);
if ($parent === null) {
$page->changeBook($parent instanceof Book ? $parent->id : $parent->book->id);
$page->rebuildPermissions();
- return ($parent instanceof Book ? $parent : $parent->book);
+ Activity::addForEntity($page, ActivityType::PAGE_MOVE);
+ return $parent;
}
/**
return $parentClass::visible()->where('id', '=', $entityId)->first();
}
- /**
- * Update the permissions of a page.
- */
- public function updatePermissions(Page $page, bool $restricted, Collection $permissions = null)
- {
- $this->baseRepo->updatePermissions($page, $restricted, $permissions);
- }
-
/**
* Change the page's parent to the given entity.
*/