-<?php namespace Oxbow\Services;
+<?php namespace BookStack\Services;
-use Illuminate\Support\Facades\Auth;
-use Oxbow\Activity;
-use Oxbow\Entity;
+use BookStack\Activity;
+use BookStack\Entity;
use Session;
class ActivityService
{
protected $activity;
protected $user;
+ protected $permissionService;
/**
* ActivityService constructor.
- * @param $activity
+ * @param Activity $activity
+ * @param PermissionService $permissionService
*/
- public function __construct(Activity $activity)
+ public function __construct(Activity $activity, PermissionService $permissionService)
{
$this->activity = $activity;
- $this->user = Auth::user();
+ $this->permissionService = $permissionService;
+ $this->user = user();
}
/**
* Add activity data to database.
* @param Entity $entity
- * @param $activityKey
+ * @param $activityKey
* @param int $bookId
* @param bool $extra
*/
public function add(Entity $entity, $activityKey, $bookId = 0, $extra = false)
{
- $this->activity->user_id = $this->user->id;
- $this->activity->book_id = $bookId;
- $this->activity->key = strtolower($activityKey);
- if($extra !== false) {
- $this->activity->extra = $extra;
+ $activity = $this->activity->newInstance();
+ $activity->user_id = $this->user->id;
+ $activity->book_id = $bookId;
+ $activity->key = strtolower($activityKey);
+ if ($extra !== false) {
+ $activity->extra = $extra;
}
- $entity->activity()->save($this->activity);
+ $entity->activity()->save($activity);
$this->setNotification($activityKey);
}
/**
- * Adds a activity history with a message & without binding to a entitiy.
- * @param $activityKey
+ * Adds a activity history with a message & without binding to a entity.
+ * @param $activityKey
* @param int $bookId
* @param bool|false $extra
*/
$this->activity->user_id = $this->user->id;
$this->activity->book_id = $bookId;
$this->activity->key = strtolower($activityKey);
- if($extra !== false) {
+ if ($extra !== false) {
$this->activity->extra = $extra;
}
$this->activity->save();
public function removeEntity(Entity $entity)
{
$activities = $entity->activity;
- foreach($activities as $activity) {
+ foreach ($activities as $activity) {
$activity->extra = $entity->name;
$activity->entity_id = 0;
$activity->entity_type = null;
* Gets the latest activity.
* @param int $count
* @param int $page
+ * @return array
*/
public function latest($count = 20, $page = 0)
{
- return $this->activity->orderBy('created_at', 'desc')
- ->skip($count*$page)->take($count)->get();
+ $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;
}
/**