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 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								}