mirror of
https://github.com/BookStackApp/BookStack.git
synced 2025-10-26 11:11:56 +00:00
Some checks are pending
analyse-php / build (push) Waiting to run
lint-php / build (push) Waiting to run
test-migrations / build (8.2) (push) Waiting to run
test-migrations / build (8.3) (push) Waiting to run
test-migrations / build (8.4) (push) Waiting to run
test-php / build (8.2) (push) Waiting to run
test-php / build (8.3) (push) Waiting to run
test-php / build (8.4) (push) Waiting to run
Updated base entity class, and worked through BaseRepo. Need to go through other repos next. Removed a couple of redundant interfaces as part of this since we can move the logic onto the shared ContainerData model as needed.
123 lines
3.6 KiB
PHP
123 lines
3.6 KiB
PHP
<?php
|
|
|
|
namespace BookStack\Entities\Models;
|
|
|
|
use BookStack\Sorting\SortRule;
|
|
use BookStack\Uploads\Image;
|
|
use Exception;
|
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
|
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
|
use Illuminate\Support\Collection;
|
|
|
|
/**
|
|
* Class Book.
|
|
*
|
|
* @property string $description
|
|
* @property int $image_id
|
|
* @property ?int $default_template_id
|
|
* @property ?int $sort_rule_id
|
|
* @property Image|null $cover
|
|
* @property \Illuminate\Database\Eloquent\Collection $chapters
|
|
* @property \Illuminate\Database\Eloquent\Collection $pages
|
|
* @property \Illuminate\Database\Eloquent\Collection $directPages
|
|
* @property \Illuminate\Database\Eloquent\Collection $shelves
|
|
* @property ?Page $defaultTemplate
|
|
* @property ?SortRule $sortRule
|
|
*/
|
|
class Book extends Entity
|
|
{
|
|
use HasFactory;
|
|
|
|
public float $searchFactor = 1.2;
|
|
|
|
protected $hidden = ['pivot', 'image_id', 'deleted_at', 'description_html'];
|
|
|
|
/**
|
|
* Get the url for this book.
|
|
*/
|
|
public function getUrl(string $path = ''): string
|
|
{
|
|
return url('/books/' . implode('/', [urlencode($this->slug), trim($path, '/')]));
|
|
}
|
|
|
|
/**
|
|
* Returns book cover image, if book cover not exists return default cover image.
|
|
*/
|
|
public function getBookCover(int $width = 440, int $height = 250): string
|
|
{
|
|
$default = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==';
|
|
if (!$this->containerData->image_id || !$this->containerData->cover) {
|
|
return $default;
|
|
}
|
|
|
|
try {
|
|
return $this->containerData->cover->getThumb($width, $height, false) ?? $default;
|
|
} catch (Exception $err) {
|
|
return $default;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get the Page that is used as default template for newly created pages within this Book.
|
|
*/
|
|
public function defaultTemplate(): BelongsTo
|
|
{
|
|
return $this->belongsTo(Page::class, 'default_template_id');
|
|
}
|
|
|
|
/**
|
|
* Get the sort set assigned to this book, if existing.
|
|
*/
|
|
public function sortRule(): BelongsTo
|
|
{
|
|
return $this->belongsTo(SortRule::class);
|
|
}
|
|
|
|
/**
|
|
* Get all pages within this book.
|
|
* @return HasMany<Page, $this>
|
|
*/
|
|
public function pages(): HasMany
|
|
{
|
|
return $this->hasMany(Page::class);
|
|
}
|
|
|
|
/**
|
|
* Get the direct child pages of this book.
|
|
*/
|
|
public function directPages(): HasMany
|
|
{
|
|
return $this->pages()->where('chapter_id', '=', '0');
|
|
}
|
|
|
|
/**
|
|
* Get all chapters within this book.
|
|
* @return HasMany<Chapter, $this>
|
|
*/
|
|
public function chapters(): HasMany
|
|
{
|
|
return $this->hasMany(Chapter::class);
|
|
}
|
|
|
|
/**
|
|
* Get the shelves this book is contained within.
|
|
*/
|
|
public function shelves(): BelongsToMany
|
|
{
|
|
return $this->belongsToMany(Bookshelf::class, 'bookshelves_books', 'book_id', 'bookshelf_id');
|
|
}
|
|
|
|
/**
|
|
* Get the direct child items within this book.
|
|
*/
|
|
public function getDirectVisibleChildren(): Collection
|
|
{
|
|
$pages = $this->directPages()->scopes('visible')->get();
|
|
$chapters = $this->chapters()->scopes('visible')->get();
|
|
|
|
return $pages->concat($chapters)->sortBy('priority')->sortByDesc('draft');
|
|
}
|
|
}
|