+ $activityList = $this->permissionService
+ ->filterRestrictedEntityRelations($this->activity, 'activities', 'entity_id', 'entity_type')
+ ->orderBy('created_at', 'desc')->with('user', 'entity')->skip($count * $page)->take($count)->get();
+
+ return $this->filterSimilar($activityList);
+ }
+
+ /**
+ * Gets the latest activity for an entity, Filtering out similar
+ * items to prevent a message activity list.
+ * @param Entity $entity
+ * @param int $count
+ * @param int $page
+ * @return array
+ */
+ public function entityActivity($entity, $count = 20, $page = 0)
+ {
+ if ($entity->isA('book')) {
+ $query = $this->activity->where('book_id', '=', $entity->id);
+ } else {
+ $query = $this->activity->where('entity_type', '=', get_class($entity))
+ ->where('entity_id', '=', $entity->id);
+ }
+
+ $activity = $this->permissionService
+ ->filterRestrictedEntityRelations($query, 'activities', 'entity_id', 'entity_type')
+ ->orderBy('created_at', 'desc')->with(['entity', 'user.avatar'])->skip($count * $page)->take($count)->get();
+
+ return $this->filterSimilar($activity);
+ }
+
+ /**
+ * Get latest activity for a user, Filtering out similar
+ * items.
+ * @param $user
+ * @param int $count
+ * @param int $page
+ * @return array
+ */
+ public function userActivity($user, $count = 20, $page = 0)
+ {
+ $activityList = $this->permissionService
+ ->filterRestrictedEntityRelations($this->activity, 'activities', 'entity_id', 'entity_type')
+ ->orderBy('created_at', 'desc')->where('user_id', '=', $user->id)->skip($count * $page)->take($count)->get();
+ return $this->filterSimilar($activityList);
+ }
+
+ /**
+ * Filters out similar activity.
+ * @param Activity[] $activities
+ * @return array
+ */
+ protected function filterSimilar($activities)
+ {
+ $newActivity = [];
+ $previousItem = false;
+ foreach ($activities as $activityItem) {
+ if ($previousItem === false) {
+ $previousItem = $activityItem;
+ $newActivity[] = $activityItem;
+ continue;
+ }
+ if (!$activityItem->isSimilarTo($previousItem)) {
+ $newActivity[] = $activityItem;
+ }
+ $previousItem = $activityItem;
+ }
+ return $newActivity;
+ }
+
+ /**
+ * Flashes a notification message to the session if an appropriate message is available.
+ * @param $activityKey
+ */
+ protected function setNotification($activityKey)
+ {
+ $notificationTextKey = 'activities.' . $activityKey . '_notification';
+ if (trans()->has($notificationTextKey)) {
+ $message = trans($notificationTextKey);
+ Session::flash('success', $message);
+ }