63 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			63 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
<?php
 | 
						|
 | 
						|
namespace BookStack\Entities\Queries;
 | 
						|
 | 
						|
use BookStack\Entities\Models\Entity;
 | 
						|
use Illuminate\Database\Eloquent\Builder;
 | 
						|
use InvalidArgumentException;
 | 
						|
 | 
						|
class EntityQueries
 | 
						|
{
 | 
						|
    public function __construct(
 | 
						|
        public BookshelfQueries $shelves,
 | 
						|
        public BookQueries $books,
 | 
						|
        public ChapterQueries $chapters,
 | 
						|
        public PageQueries $pages,
 | 
						|
        public PageRevisionQueries $revisions,
 | 
						|
    ) {
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Find an entity via an identifier string in the format:
 | 
						|
     * {type}:{id}
 | 
						|
     * Example: (book:5).
 | 
						|
     */
 | 
						|
    public function findVisibleByStringIdentifier(string $identifier): ?Entity
 | 
						|
    {
 | 
						|
        $explodedId = explode(':', $identifier);
 | 
						|
        $entityType = $explodedId[0];
 | 
						|
        $entityId = intval($explodedId[1]);
 | 
						|
        $queries = $this->getQueriesForType($entityType);
 | 
						|
 | 
						|
        return $queries->findVisibleById($entityId);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Start a query of visible entities of the given type,
 | 
						|
     * suitable for listing display.
 | 
						|
     */
 | 
						|
    public function visibleForList(string $entityType): Builder
 | 
						|
    {
 | 
						|
        $queries = $this->getQueriesForType($entityType);
 | 
						|
        return $queries->visibleForList();
 | 
						|
    }
 | 
						|
 | 
						|
    protected function getQueriesForType(string $type): ProvidesEntityQueries
 | 
						|
    {
 | 
						|
        /** @var ?ProvidesEntityQueries $queries */
 | 
						|
        $queries = match ($type) {
 | 
						|
            'page' => $this->pages,
 | 
						|
            'chapter' => $this->chapters,
 | 
						|
            'book' => $this->books,
 | 
						|
            'bookshelf' => $this->shelves,
 | 
						|
            default => null,
 | 
						|
        };
 | 
						|
 | 
						|
        if (is_null($queries)) {
 | 
						|
            throw new InvalidArgumentException("No entity query class configured for {$type}");
 | 
						|
        }
 | 
						|
 | 
						|
        return $queries;
 | 
						|
    }
 | 
						|
}
 |