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
Changes to core entity models are now done on clones to ensure clean state before save, and those clones are returned back if changes are needed after that action.
126 lines
3.7 KiB
PHP
126 lines
3.7 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;
|
|
}
|
|
}
|
|
|
|
// TODO - Still handle cover as relation through containerData (since it's used in code)
|
|
// TODO - Remove above since we can access that via containerData
|
|
|
|
/**
|
|
* 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');
|
|
}
|
|
}
|