113 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
<?php
 | 
						|
 | 
						|
namespace BookStack\Entities\Queries;
 | 
						|
 | 
						|
use BookStack\Entities\Models\Page;
 | 
						|
use BookStack\Exceptions\NotFoundException;
 | 
						|
use Illuminate\Database\Eloquent\Builder;
 | 
						|
 | 
						|
class PageQueries implements ProvidesEntityQueries
 | 
						|
{
 | 
						|
    protected static array $contentAttributes = [
 | 
						|
        'name', 'id', 'slug', 'book_id', 'chapter_id', 'draft',
 | 
						|
        'template', 'html', 'text', 'created_at', 'updated_at', 'priority',
 | 
						|
        'created_by', 'updated_by', 'owned_by',
 | 
						|
    ];
 | 
						|
    protected static array $listAttributes = [
 | 
						|
        'name', 'id', 'slug', 'book_id', 'chapter_id', 'draft',
 | 
						|
        'template', 'text', 'created_at', 'updated_at', 'priority', 'owned_by',
 | 
						|
    ];
 | 
						|
 | 
						|
    public function start(): Builder
 | 
						|
    {
 | 
						|
        return Page::query();
 | 
						|
    }
 | 
						|
 | 
						|
    public function findVisibleById(int $id): ?Page
 | 
						|
    {
 | 
						|
        return $this->start()->scopes('visible')->find($id);
 | 
						|
    }
 | 
						|
 | 
						|
    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')
 | 
						|
            ->scopes('visible')
 | 
						|
            ->whereHas('book', function (Builder $query) use ($bookSlug) {
 | 
						|
                $query->where('slug', '=', $bookSlug);
 | 
						|
            })
 | 
						|
            ->where('slug', '=', $pageSlug)
 | 
						|
            ->first();
 | 
						|
 | 
						|
        if (is_null($page)) {
 | 
						|
            throw new NotFoundException(trans('errors.page_not_found'));
 | 
						|
        }
 | 
						|
 | 
						|
        return $page;
 | 
						|
    }
 | 
						|
 | 
						|
    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);
 | 
						|
            });
 | 
						|
    }
 | 
						|
 | 
						|
    public function visibleForList(): Builder
 | 
						|
    {
 | 
						|
        return $this->start()
 | 
						|
            ->scopes('visible')
 | 
						|
            ->select($this->mergeBookSlugForSelect(static::$listAttributes));
 | 
						|
    }
 | 
						|
 | 
						|
    public function visibleForChapterList(int $chapterId): Builder
 | 
						|
    {
 | 
						|
        return $this->visibleForList()
 | 
						|
            ->where('chapter_id', '=', $chapterId)
 | 
						|
            ->orderBy('draft', 'desc')
 | 
						|
            ->orderBy('priority', 'asc');
 | 
						|
    }
 | 
						|
 | 
						|
    public function visibleWithContents(): Builder
 | 
						|
    {
 | 
						|
        return $this->start()
 | 
						|
            ->scopes('visible')
 | 
						|
            ->select($this->mergeBookSlugForSelect(static::$contentAttributes));
 | 
						|
    }
 | 
						|
 | 
						|
    public function currentUserDraftsForList(): Builder
 | 
						|
    {
 | 
						|
        return $this->visibleForList()
 | 
						|
            ->where('draft', '=', true)
 | 
						|
            ->where('created_by', '=', user()->id);
 | 
						|
    }
 | 
						|
 | 
						|
    public function visibleTemplates(): Builder
 | 
						|
    {
 | 
						|
        return $this->visibleForList()
 | 
						|
            ->where('template', '=', true);
 | 
						|
    }
 | 
						|
 | 
						|
    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');
 | 
						|
        }]);
 | 
						|
    }
 | 
						|
}
 |