| 
									
										
										
										
											2018-09-25 19:30:50 +08:00
										 |  |  | <?php namespace BookStack\Actions; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-16 17:49:37 +08:00
										 |  |  | use BookStack\Interfaces\Viewable; | 
					
						
							| 
									
										
										
										
											2018-09-25 19:30:50 +08:00
										 |  |  | use BookStack\Model; | 
					
						
							| 
									
										
										
										
											2021-05-16 07:29:56 +08:00
										 |  |  | use Illuminate\Database\Eloquent\Relations\MorphTo; | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-16 17:49:37 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Class View | 
					
						
							|  |  |  |  * Views are stored per-item per-person within the database. | 
					
						
							|  |  |  |  * They can be used to find popular items or recently viewed items | 
					
						
							|  |  |  |  * at a per-person level. They do not record every view instance as an | 
					
						
							|  |  |  |  * activity. Only the latest and original view times could be recognised. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @property int $views | 
					
						
							|  |  |  |  * @property int $user_id | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  | class View extends Model | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     protected $fillable = ['user_id', 'views']; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Get all owning viewable models. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2021-05-16 07:29:56 +08:00
										 |  |  |     public function viewable(): MorphTo | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         return $this->morphTo(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-05-16 17:49:37 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Increment the current user's view count for the given viewable model. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public static function incrementFor(Viewable $viewable): int | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $user = user(); | 
					
						
							|  |  |  |         if (is_null($user) || $user->isDefault()) { | 
					
						
							|  |  |  |             return 0; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         /** @var View $view */ | 
					
						
							|  |  |  |         $view = $viewable->views()->firstOrNew([ | 
					
						
							|  |  |  |             'user_id' => $user->id, | 
					
						
							|  |  |  |         ], ['views' => 0]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-22 21:05:28 +08:00
										 |  |  |         $view->forceFill(['views' => $view->views + 1])->save(); | 
					
						
							| 
									
										
										
										
											2021-05-16 17:49:37 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return $view->views; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Clear all views from the system. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public static function clearAll() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         static::query()->truncate(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  | } |