]> BookStack Code Mirror - bookstack/blob - app/Services/ActivityService.php
118bd6d9c5c4cfca8f6ce83a3a52639927f9c7d7
[bookstack] / app / Services / ActivityService.php
1 <?php namespace BookStack\Services;
2
3 use BookStack\Activity;
4 use BookStack\Entity;
5 use Session;
6
7 class ActivityService
8 {
9     protected $activity;
10     protected $user;
11     protected $restrictionService;
12
13     /**
14      * ActivityService constructor.
15      * @param Activity $activity
16      * @param RestrictionService $restrictionService
17      */
18     public function __construct(Activity $activity, RestrictionService $restrictionService)
19     {
20         $this->activity = $activity;
21         $this->restrictionService = $restrictionService;
22         $this->user = auth()->user();
23     }
24
25     /**
26      * Add activity data to database.
27      * @param Entity $entity
28      * @param        $activityKey
29      * @param int    $bookId
30      * @param bool   $extra
31      */
32     public function add(Entity $entity, $activityKey, $bookId = 0, $extra = false)
33     {
34         $activity = $this->activity->newInstance();
35         $activity->user_id = $this->user->id;
36         $activity->book_id = $bookId;
37         $activity->key = strtolower($activityKey);
38         if ($extra !== false) {
39             $activity->extra = $extra;
40         }
41         $entity->activity()->save($activity);
42         $this->setNotification($activityKey);
43     }
44
45     /**
46      * Adds a activity history with a message & without binding to a entity.
47      * @param            $activityKey
48      * @param int        $bookId
49      * @param bool|false $extra
50      */
51     public function addMessage($activityKey, $bookId = 0, $extra = false)
52     {
53         $this->activity->user_id = $this->user->id;
54         $this->activity->book_id = $bookId;
55         $this->activity->key = strtolower($activityKey);
56         if ($extra !== false) {
57             $this->activity->extra = $extra;
58         }
59         $this->activity->save();
60         $this->setNotification($activityKey);
61     }
62
63
64     /**
65      * Removes the entity attachment from each of its activities
66      * and instead uses the 'extra' field with the entities name.
67      * Used when an entity is deleted.
68      * @param Entity $entity
69      * @return mixed
70      */
71     public function removeEntity(Entity $entity)
72     {
73         $activities = $entity->activity;
74         foreach ($activities as $activity) {
75             $activity->extra = $entity->name;
76             $activity->entity_id = 0;
77             $activity->entity_type = null;
78             $activity->save();
79         }
80         return $activities;
81     }
82
83     /**
84      * Gets the latest activity.
85      * @param int $count
86      * @param int $page
87      * @return array
88      */
89     public function latest($count = 20, $page = 0)
90     {
91         $activityList =  $this->restrictionService
92             ->filterRestrictedEntityRelations($this->activity, 'activities', 'entity_id', 'entity_type')
93             ->orderBy('created_at', 'desc')->skip($count * $page)->take($count)->get();
94
95         return $this->filterSimilar($activityList);
96     }
97
98     /**
99      * Gets the latest activity for an entity, Filtering out similar
100      * items to prevent a message activity list.
101      * @param Entity $entity
102      * @param int    $count
103      * @param int    $page
104      * @return array
105      */
106     public function entityActivity($entity, $count = 20, $page = 0)
107     {
108         $activity = $entity->hasMany('BookStack\Activity')->orderBy('created_at', 'desc')
109             ->skip($count * $page)->take($count)->get();
110
111         return $this->filterSimilar($activity);
112     }
113
114     /**
115      * Get latest activity for a user, Filtering out similar
116      * items.
117      * @param $user
118      * @param int $count
119      * @param int $page
120      * @return array
121      */
122     public function userActivity($user, $count = 20, $page = 0)
123     {
124         $activity = $this->activity->where('user_id', '=', $user->id)
125             ->orderBy('created_at', 'desc')->skip($count * $page)->take($count)->get();
126         return $this->filterSimilar($activity);
127     }
128
129     /**
130      * Filters out similar activity.
131      * @param Activity[] $activities
132      * @return array
133      */
134     protected function filterSimilar($activities)
135     {
136         $newActivity = [];
137         $previousItem = false;
138         foreach ($activities as $activityItem) {
139             if ($previousItem === false) {
140                 $previousItem = $activityItem;
141                 $newActivity[] = $activityItem;
142                 continue;
143             }
144             if (!$activityItem->isSimilarTo($previousItem)) {
145                 $newActivity[] = $activityItem;
146             }
147             $previousItem = $activityItem;
148         }
149         return $newActivity;
150     }
151
152     /**
153      * Flashes a notification message to the session if an appropriate message is available.
154      * @param $activityKey
155      */
156     protected function setNotification($activityKey)
157     {
158         $notificationTextKey = 'activities.' . $activityKey . '_notification';
159         if (trans()->has($notificationTextKey)) {
160             $message = trans($notificationTextKey);
161             Session::flash('success', $message);
162         }
163     }
164
165 }