2018-09-25 19:30:50 +08:00
< ? php namespace BookStack\Entities ;
use BookStack\Uploads\Image ;
2018-06-24 20:38:19 +08:00
2018-08-27 21:18:09 +08:00
class Bookshelf extends Entity
2018-06-24 20:38:19 +08:00
{
protected $table = 'bookshelves' ;
public $searchFactor = 3 ;
protected $fillable = [ 'name' , 'description' , 'image_id' ];
2018-09-25 19:30:50 +08:00
/**
* Get the morph class for this model .
* @ return string
*/
public function getMorphClass ()
{
return 'BookStack\\Bookshelf' ;
}
2018-08-27 21:18:09 +08:00
/**
* Get the books in this shelf .
2018-09-17 02:34:09 +08:00
* Should not be used directly since does not take into account permissions .
2018-08-27 21:18:09 +08:00
* @ return \Illuminate\Database\Eloquent\Relations\BelongsToMany
*/
public function books ()
{
2019-04-16 03:43:25 +08:00
return $this -> belongsToMany ( Book :: class , 'bookshelves_books' , 'bookshelf_id' , 'book_id' )
-> withPivot ( 'order' )
-> orderBy ( 'order' , 'asc' );
2018-08-27 21:18:09 +08:00
}
2018-06-24 20:38:19 +08:00
/**
* Get the url for this bookshelf .
* @ param string | bool $path
* @ return string
*/
public function getUrl ( $path = false )
{
if ( $path !== false ) {
2019-08-04 21:26:39 +08:00
return url ( '/shelves/' . urlencode ( $this -> slug ) . '/' . trim ( $path , '/' ));
2018-06-24 20:38:19 +08:00
}
2019-08-04 21:26:39 +08:00
return url ( '/shelves/' . urlencode ( $this -> slug ));
2018-06-24 20:38:19 +08:00
}
/**
* Returns BookShelf cover image , if cover does not exists return default cover image .
* @ param int $width - Width of the image
* @ param int $height - Height of the image
* @ return string
*/
public function getBookCover ( $width = 440 , $height = 250 )
{
2019-02-03 21:45:45 +08:00
// TODO - Make generic, focused on books right now, Perhaps set-up a better image
2019-02-17 01:13:01 +08:00
$default = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==' ;
2018-06-24 20:38:19 +08:00
if ( ! $this -> image_id ) {
return $default ;
}
try {
2019-08-04 21:26:39 +08:00
$cover = $this -> cover ? url ( $this -> cover -> getThumb ( $width , $height , false )) : $default ;
2018-06-24 20:38:19 +08:00
} catch ( \Exception $err ) {
$cover = $default ;
}
return $cover ;
}
/**
2019-02-03 21:45:45 +08:00
* Get the cover image of the shelf
2018-06-24 20:38:19 +08:00
* @ return \Illuminate\Database\Eloquent\Relations\BelongsTo
*/
public function cover ()
{
return $this -> belongsTo ( Image :: class , 'image_id' );
}
/**
* Get an excerpt of this book ' s description to the specified length or less .
* @ param int $length
* @ return string
*/
2019-04-07 01:47:27 +08:00
public function getExcerpt ( int $length = 100 )
2018-06-24 20:38:19 +08:00
{
$description = $this -> description ;
2019-05-25 23:14:57 +08:00
return mb_strlen ( $description ) > $length ? mb_substr ( $description , 0 , $length - 3 ) . '...' : $description ;
2018-06-24 20:38:19 +08:00
}
/**
* Return a generalised , common raw query that can be 'unioned' across entities .
* @ return string
*/
public function entityRawQuery ()
{
return " 'BookStack \\ \\ BookShelf' as entity_type, id, id as entity_id, slug, name, { $this -> textField } as text,'' as html, '0' as book_id, '0' as priority, '0' as chapter_id, '0' as draft, created_by, updated_by, updated_at, created_at " ;
}
2019-04-08 01:28:11 +08:00
/**
* Check if this shelf contains the given book .
* @ param Book $book
* @ return bool
*/
2019-09-16 06:28:23 +08:00
public function contains ( Book $book ) : bool
2019-04-08 01:28:11 +08:00
{
return $this -> books () -> where ( 'id' , '=' , $book -> id ) -> count () > 0 ;
}
2019-09-20 01:20:09 +08:00
/**
* Add a book to the end of this shelf .
* @ param Book $book
*/
public function appendBook ( Book $book )
{
2019-09-20 07:18:28 +08:00
if ( $this -> contains ( $book )) {
2019-09-20 01:20:09 +08:00
return ;
}
$maxOrder = $this -> books () -> max ( 'order' );
$this -> books () -> attach ( $book -> id , [ 'order' => $maxOrder + 1 ]);
}
2018-06-24 20:38:19 +08:00
}