use BookStack\Exceptions\NotFoundException;
use BookStack\Exceptions\PermissionsException;
use BookStack\Facades\Activity;
+use BookStack\References\ReferenceService;
use Exception;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Pagination\LengthAwarePaginator;
class PageRepo
{
- protected $baseRepo;
+ protected BaseRepo $baseRepo;
+ protected ReferenceService $references;
/**
* PageRepo constructor.
*/
- public function __construct(BaseRepo $baseRepo)
+ public function __construct(BaseRepo $baseRepo, ReferenceService $references)
{
$this->baseRepo = $baseRepo;
+ $this->references = $references;
}
/**
public function getParentFromSlugs(string $bookSlug, string $chapterSlug = null): Entity
{
if ($chapterSlug !== null) {
- return $chapter = Chapter::visible()->whereSlugs($bookSlug, $chapterSlug)->firstOrFail();
+ return Chapter::visible()->whereSlugs($bookSlug, $chapterSlug)->firstOrFail();
}
return Book::visible()->where('slug', '=', $bookSlug)->firstOrFail();
$this->savePageRevision($draft, trans('entities.pages_initial_revision'));
$draft->indexForSearch();
+ $this->references->updateForPage($draft);
$draft->refresh();
Activity::add(ActivityType::PAGE_CREATE, $draft);
$this->updateTemplateStatusAndContentFromInput($page, $input);
$this->baseRepo->update($page, $input);
+ $this->references->updateForPage($page);
// Update with new details
$page->revision_count++;
$page->refreshSlug();
$page->save();
$page->indexForSearch();
+ $this->references->updateForPage($page);
$summary = trans('entities.pages_revision_restored_from', ['id' => strval($revisionId), 'summary' => $revision->summary]);
$this->savePageRevision($page, $summary);
->skip(intval($revisionLimit))
->take(10)
->get(['id']);
+
if ($revisionsToDelete->count() > 0) {
PageRevision::query()->whereIn('id', $revisionsToDelete->pluck('id'))->delete();
}
--- /dev/null
+<?php
+
+namespace Tests\References;
+
+use BookStack\Entities\Models\Page;
+use BookStack\Entities\Repos\PageRepo;
+use BookStack\Entities\Tools\TrashCan;
+use BookStack\Model;
+use BookStack\References\Reference;
+use Tests\TestCase;
+
+class ReferencesTest extends TestCase
+{
+
+ public function test_references_created_on_page_update()
+ {
+ /** @var Page $pageA */
+ /** @var Page $pageB */
+ $pageA = Page::query()->first();
+ $pageB = Page::query()->where('id', '!=', $pageA->id)->first();
+
+ $this->assertDatabaseMissing('references', ['from_id' => $pageA->id, 'from_type' => $pageA->getMorphClass()]);
+
+ $this->asEditor()->put($pageA->getUrl(), [
+ 'name' => 'Reference test',
+ 'html' => '<a href="' . $pageB->getUrl() . '">Testing</a>'
+ ]);
+
+ $this->assertDatabaseHas('references', [
+ 'from_id' => $pageA->id,
+ 'from_type' => $pageA->getMorphClass(),
+ 'to_id' => $pageB->id,
+ 'to_type' => $pageB->getMorphClass(),
+ ]);
+ }
+
+ public function test_references_deleted_on_entity_delete()
+ {
+ /** @var Page $pageA */
+ /** @var Page $pageB */
+ $pageA = Page::query()->first();
+ $pageB = Page::query()->where('id', '!=', $pageA->id)->first();
+
+ $this->createReference($pageA, $pageB);
+ $this->createReference($pageB, $pageA);
+
+ $this->assertDatabaseHas('references', ['from_id' => $pageA->id, 'from_type' => $pageA->getMorphClass()]);
+ $this->assertDatabaseHas('references', ['to_id' => $pageA->id, 'to_type' => $pageA->getMorphClass()]);
+
+ app(PageRepo::class)->destroy($pageA);
+ app(TrashCan::class)->empty();
+
+ $this->assertDatabaseMissing('references', ['from_id' => $pageA->id, 'from_type' => $pageA->getMorphClass()]);
+ $this->assertDatabaseMissing('references', ['to_id' => $pageA->id, 'to_type' => $pageA->getMorphClass()]);
+ }
+
+ protected function createReference(Model $from, Model $to)
+ {
+ (new Reference())->forceFill([
+ 'from_type' => $from->getMorphClass(),
+ 'from_id' => $from->id,
+ 'to_type' => $to->getMorphClass(),
+ 'to_id' => $to->id,
+ ])->save();
+ }
+
+}
\ No newline at end of file