| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-18 00:56:55 +08:00
										 |  |  | namespace BookStack\Activity; | 
					
						
							| 
									
										
										
										
											2015-08-17 01:59:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-18 00:56:55 +08:00
										 |  |  | use BookStack\Activity\Models\Activity; | 
					
						
							| 
									
										
										
										
											2021-11-20 22:03:56 +08:00
										 |  |  | use BookStack\Entities\Models\Book; | 
					
						
							| 
									
										
										
										
											2020-11-22 08:17:45 +08:00
										 |  |  | use BookStack\Entities\Models\Chapter; | 
					
						
							|  |  |  | use BookStack\Entities\Models\Entity; | 
					
						
							|  |  |  | use BookStack\Entities\Models\Page; | 
					
						
							| 
									
										
										
										
											2024-02-04 22:39:01 +08:00
										 |  |  | use BookStack\Entities\Tools\MixedEntityListLoader; | 
					
						
							| 
									
										
										
										
											2023-05-18 00:56:55 +08:00
										 |  |  | use BookStack\Permissions\PermissionApplicator; | 
					
						
							|  |  |  | use BookStack\Users\Models\User; | 
					
						
							| 
									
										
										
										
											2020-11-08 07:15:13 +08:00
										 |  |  | use Illuminate\Database\Eloquent\Builder; | 
					
						
							| 
									
										
										
										
											2020-11-07 22:28:50 +08:00
										 |  |  | use Illuminate\Database\Eloquent\Relations\Relation; | 
					
						
							| 
									
										
										
										
											2015-08-17 01:59:23 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-12 01:29:33 +08:00
										 |  |  | class ActivityQueries | 
					
						
							| 
									
										
										
										
											2015-08-17 01:59:23 +08:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2024-02-04 22:39:01 +08:00
										 |  |  |     public function __construct( | 
					
						
							|  |  |  |         protected PermissionApplicator $permissions, | 
					
						
							|  |  |  |         protected MixedEntityListLoader $listLoader, | 
					
						
							|  |  |  |     ) { | 
					
						
							| 
									
										
										
										
											2015-08-17 01:59:23 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-17 03:11:21 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Gets the latest activity. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-04-11 03:55:33 +08:00
										 |  |  |     public function latest(int $count = 20, int $page = 0): array | 
					
						
							| 
									
										
										
										
											2015-08-17 03:11:21 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-07-13 03:15:41 +08:00
										 |  |  |         $activityList = $this->permissions | 
					
						
							| 
									
										
										
										
											2024-05-04 23:28:18 +08:00
										 |  |  |             ->restrictEntityRelationQuery(Activity::query(), 'activities', 'loggable_id', 'loggable_type') | 
					
						
							| 
									
										
										
										
											2019-09-20 01:03:17 +08:00
										 |  |  |             ->orderBy('created_at', 'desc') | 
					
						
							| 
									
										
										
										
											2024-02-04 22:39:01 +08:00
										 |  |  |             ->with(['user']) | 
					
						
							| 
									
										
										
										
											2019-09-20 01:03:17 +08:00
										 |  |  |             ->skip($count * $page) | 
					
						
							|  |  |  |             ->take($count) | 
					
						
							|  |  |  |             ->get(); | 
					
						
							| 
									
										
										
										
											2016-02-29 03:03:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-04 23:28:18 +08:00
										 |  |  |         $this->listLoader->loadIntoRelations($activityList->all(), 'loggable', false); | 
					
						
							| 
									
										
										
										
											2024-02-04 22:39:01 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-30 22:31:16 +08:00
										 |  |  |         return $this->filterSimilar($activityList); | 
					
						
							| 
									
										
										
										
											2015-08-30 18:47:58 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2016-02-17 05:25:11 +08:00
										 |  |  |      * Gets the latest activity for an entity, Filtering out similar | 
					
						
							| 
									
										
										
										
											2015-08-30 18:47:58 +08:00
										 |  |  |      * items to prevent a message activity list. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-04-11 03:55:33 +08:00
										 |  |  |     public function entityActivity(Entity $entity, int $count = 20, int $page = 1): array | 
					
						
							| 
									
										
										
										
											2015-08-30 18:47:58 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-11-20 22:03:56 +08:00
										 |  |  |         /** @var array<string, int[]> $queryIds */ | 
					
						
							| 
									
										
										
										
											2020-11-08 07:15:13 +08:00
										 |  |  |         $queryIds = [$entity->getMorphClass() => [$entity->id]]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-20 22:03:56 +08:00
										 |  |  |         if ($entity instanceof Book) { | 
					
						
							| 
									
										
										
										
											2021-11-23 07:33:55 +08:00
										 |  |  |             $queryIds[(new Chapter())->getMorphClass()] = $entity->chapters()->scopes('visible')->pluck('id'); | 
					
						
							| 
									
										
										
										
											2020-11-08 07:15:13 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-11-20 22:03:56 +08:00
										 |  |  |         if ($entity instanceof Book || $entity instanceof Chapter) { | 
					
						
							| 
									
										
										
										
											2021-11-23 07:33:55 +08:00
										 |  |  |             $queryIds[(new Page())->getMorphClass()] = $entity->pages()->scopes('visible')->pluck('id'); | 
					
						
							| 
									
										
										
										
											2016-04-24 23:54:20 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-07-28 19:59:43 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-12 01:29:33 +08:00
										 |  |  |         $query = Activity::query(); | 
					
						
							| 
									
										
										
										
											2020-11-08 07:15:13 +08:00
										 |  |  |         $query->where(function (Builder $query) use ($queryIds) { | 
					
						
							|  |  |  |             foreach ($queryIds as $morphClass => $idArr) { | 
					
						
							|  |  |  |                 $query->orWhere(function (Builder $innerQuery) use ($morphClass, $idArr) { | 
					
						
							| 
									
										
										
										
											2024-05-04 23:28:18 +08:00
										 |  |  |                     $innerQuery->where('loggable_type', '=', $morphClass) | 
					
						
							|  |  |  |                         ->whereIn('loggable_id', $idArr); | 
					
						
							| 
									
										
										
										
											2020-11-08 07:15:13 +08:00
										 |  |  |                 }); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $activity = $query->orderBy('created_at', 'desc') | 
					
						
							| 
									
										
										
										
											2024-05-05 22:44:58 +08:00
										 |  |  |             ->with(['loggable' => function (Relation $query) { | 
					
						
							| 
									
										
										
										
											2020-11-07 22:28:50 +08:00
										 |  |  |                 $query->withTrashed(); | 
					
						
							|  |  |  |             }, 'user.avatar']) | 
					
						
							| 
									
										
										
										
											2019-05-05 22:54:22 +08:00
										 |  |  |             ->skip($count * ($page - 1)) | 
					
						
							|  |  |  |             ->take($count) | 
					
						
							|  |  |  |             ->get(); | 
					
						
							| 
									
										
										
										
											2015-08-30 18:47:58 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return $this->filterSimilar($activity); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-17 05:25:11 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2021-11-30 08:06:17 +08:00
										 |  |  |      * Get the latest activity for a user, Filtering out similar items. | 
					
						
							| 
									
										
										
										
											2016-02-17 05:25:11 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-04-11 03:55:33 +08:00
										 |  |  |     public function userActivity(User $user, int $count = 20, int $page = 0): array | 
					
						
							| 
									
										
										
										
											2016-02-17 05:25:11 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-07-13 03:15:41 +08:00
										 |  |  |         $activityList = $this->permissions | 
					
						
							| 
									
										
										
										
											2024-05-04 23:28:18 +08:00
										 |  |  |             ->restrictEntityRelationQuery(Activity::query(), 'activities', 'loggable_id', 'loggable_type') | 
					
						
							| 
									
										
										
										
											2020-04-11 03:55:33 +08:00
										 |  |  |             ->orderBy('created_at', 'desc') | 
					
						
							|  |  |  |             ->where('user_id', '=', $user->id) | 
					
						
							|  |  |  |             ->skip($count * $page) | 
					
						
							|  |  |  |             ->take($count) | 
					
						
							| 
									
										
										
										
											2020-04-11 05:49:52 +08:00
										 |  |  |             ->get(); | 
					
						
							| 
									
										
										
										
											2020-04-11 03:55:33 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-03-06 21:17:46 +08:00
										 |  |  |         return $this->filterSimilar($activityList); | 
					
						
							| 
									
										
										
										
											2016-02-17 05:25:11 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-30 18:47:58 +08:00
										 |  |  |     /** | 
					
						
							| 
									
										
										
										
											2016-01-01 17:03:40 +08:00
										 |  |  |      * Filters out similar activity. | 
					
						
							| 
									
										
										
										
											2021-06-26 23:23:15 +08:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2016-02-17 05:25:11 +08:00
										 |  |  |      * @param Activity[] $activities | 
					
						
							| 
									
										
										
										
											2015-08-30 18:47:58 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2020-04-11 03:55:33 +08:00
										 |  |  |     protected function filterSimilar(iterable $activities): array | 
					
						
							| 
									
										
										
										
											2015-08-30 22:31:16 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2015-08-30 18:47:58 +08:00
										 |  |  |         $newActivity = []; | 
					
						
							| 
									
										
										
										
											2020-04-11 03:55:33 +08:00
										 |  |  |         $previousItem = null; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-17 05:25:11 +08:00
										 |  |  |         foreach ($activities as $activityItem) { | 
					
						
							| 
									
										
										
										
											2020-04-11 03:55:33 +08:00
										 |  |  |             if (!$previousItem || !$activityItem->isSimilarTo($previousItem)) { | 
					
						
							| 
									
										
										
										
											2015-08-30 18:47:58 +08:00
										 |  |  |                 $newActivity[] = $activityItem; | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2020-04-11 03:55:33 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-30 18:47:58 +08:00
										 |  |  |             $previousItem = $activityItem; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-04-11 03:55:33 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-30 18:47:58 +08:00
										 |  |  |         return $newActivity; | 
					
						
							| 
									
										
										
										
											2015-08-17 03:11:21 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-12-18 19:43:05 +08:00
										 |  |  | } |