2024-02-04 22:39:01 +08:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace BookStack\Entities\Queries;
|
|
|
|
|
|
|
|
use BookStack\Entities\Models\Page;
|
2024-02-06 01:35:49 +08:00
|
|
|
use BookStack\Exceptions\NotFoundException;
|
2024-02-04 22:39:01 +08:00
|
|
|
use Illuminate\Database\Eloquent\Builder;
|
|
|
|
|
2024-02-05 23:59:20 +08:00
|
|
|
class PageQueries implements ProvidesEntityQueries
|
2024-02-04 22:39:01 +08:00
|
|
|
{
|
2024-02-08 06:41:45 +08:00
|
|
|
protected static array $contentAttributes = [
|
|
|
|
'name', 'id', 'slug', 'book_id', 'chapter_id', 'draft',
|
2024-02-09 01:18:03 +08:00
|
|
|
'template', 'html', 'text', 'created_at', 'updated_at', 'priority',
|
|
|
|
'created_by', 'updated_by', 'owned_by',
|
2024-02-08 06:41:45 +08:00
|
|
|
];
|
|
|
|
protected static array $listAttributes = [
|
|
|
|
'name', 'id', 'slug', 'book_id', 'chapter_id', 'draft',
|
2024-02-09 01:18:03 +08:00
|
|
|
'template', 'text', 'created_at', 'updated_at', 'priority', 'owned_by',
|
2024-02-08 06:41:45 +08:00
|
|
|
];
|
|
|
|
|
2024-02-05 01:35:16 +08:00
|
|
|
public function start(): Builder
|
2024-02-04 22:39:01 +08:00
|
|
|
{
|
|
|
|
return Page::query();
|
|
|
|
}
|
|
|
|
|
2024-02-05 23:59:20 +08:00
|
|
|
public function findVisibleById(int $id): ?Page
|
|
|
|
{
|
|
|
|
return $this->start()->scopes('visible')->find($id);
|
|
|
|
}
|
|
|
|
|
2024-02-06 01:35:49 +08:00
|
|
|
public function findVisibleByIdOrFail(int $id): Page
|
|
|
|
{
|
|
|
|
$page = $this->findVisibleById($id);
|
|
|
|
|
|
|
|
if (is_null($page)) {
|
|
|
|
throw new NotFoundException(trans('errors.page_not_found'));
|
|
|
|
}
|
|
|
|
|
|
|
|
return $page;
|
|
|
|
}
|
|
|
|
|
|
|
|
public function findVisibleBySlugsOrFail(string $bookSlug, string $pageSlug): Page
|
|
|
|
{
|
|
|
|
/** @var ?Page $page */
|
|
|
|
$page = $this->start()->with('book')
|
2024-02-08 00:37:36 +08:00
|
|
|
->scopes('visible')
|
2024-02-06 01:35:49 +08:00
|
|
|
->whereHas('book', function (Builder $query) use ($bookSlug) {
|
|
|
|
$query->where('slug', '=', $bookSlug);
|
|
|
|
})
|
|
|
|
->where('slug', '=', $pageSlug)
|
|
|
|
->first();
|
|
|
|
|
|
|
|
if (is_null($page)) {
|
2024-02-09 00:39:59 +08:00
|
|
|
throw new NotFoundException(trans('errors.page_not_found'));
|
2024-02-06 01:35:49 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
return $page;
|
|
|
|
}
|
|
|
|
|
2024-02-08 00:37:36 +08:00
|
|
|
public function usingSlugs(string $bookSlug, string $pageSlug): Builder
|
|
|
|
{
|
|
|
|
return $this->start()
|
|
|
|
->where('slug', '=', $pageSlug)
|
|
|
|
->whereHas('book', function (Builder $query) use ($bookSlug) {
|
|
|
|
$query->where('slug', '=', $bookSlug);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2024-02-05 01:35:16 +08:00
|
|
|
public function visibleForList(): Builder
|
2024-02-04 22:39:01 +08:00
|
|
|
{
|
2024-02-05 01:35:16 +08:00
|
|
|
return $this->start()
|
2024-02-08 00:37:36 +08:00
|
|
|
->scopes('visible')
|
2024-02-08 06:41:45 +08:00
|
|
|
->select($this->mergeBookSlugForSelect(static::$listAttributes));
|
2024-02-04 22:39:01 +08:00
|
|
|
}
|
|
|
|
|
2024-02-11 23:42:37 +08:00
|
|
|
public function visibleForChapterList(int $chapterId): Builder
|
|
|
|
{
|
|
|
|
return $this->visibleForList()
|
|
|
|
->where('chapter_id', '=', $chapterId)
|
|
|
|
->orderBy('draft', 'desc')
|
|
|
|
->orderBy('priority', 'asc');
|
|
|
|
}
|
|
|
|
|
2024-02-08 00:37:36 +08:00
|
|
|
public function visibleWithContents(): Builder
|
|
|
|
{
|
|
|
|
return $this->start()
|
|
|
|
->scopes('visible')
|
2024-02-08 06:41:45 +08:00
|
|
|
->select($this->mergeBookSlugForSelect(static::$contentAttributes));
|
2024-02-08 00:37:36 +08:00
|
|
|
}
|
|
|
|
|
2024-02-05 01:35:16 +08:00
|
|
|
public function currentUserDraftsForList(): Builder
|
2024-02-04 22:39:01 +08:00
|
|
|
{
|
2024-02-05 01:35:16 +08:00
|
|
|
return $this->visibleForList()
|
2024-02-04 22:39:01 +08:00
|
|
|
->where('draft', '=', true)
|
|
|
|
->where('created_by', '=', user()->id);
|
|
|
|
}
|
2024-02-06 01:35:49 +08:00
|
|
|
|
|
|
|
public function visibleTemplates(): Builder
|
|
|
|
{
|
|
|
|
return $this->visibleForList()
|
|
|
|
->where('template', '=', true);
|
|
|
|
}
|
2024-02-08 06:41:45 +08:00
|
|
|
|
|
|
|
protected function mergeBookSlugForSelect(array $columns): array
|
|
|
|
{
|
|
|
|
return array_merge($columns, ['book_slug' => function ($builder) {
|
|
|
|
$builder->select('slug')
|
|
|
|
->from('books')
|
|
|
|
->whereColumn('books.id', '=', 'pages.book_id');
|
|
|
|
}]);
|
|
|
|
}
|
2024-02-04 22:39:01 +08:00
|
|
|
}
|