]> BookStack Code Mirror - bookstack/blob - app/Services/ActivityService.php
Added basic system tests for markdown editor, Added extra test helpers
[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         $activityList = $this->restrictionService
125             ->filterRestrictedEntityRelations($this->activity, 'activities', 'entity_id', 'entity_type')
126             ->orderBy('created_at', 'desc')->where('user_id', '=', $user->id)->skip($count * $page)->take($count)->get();
127         return $this->filterSimilar($activityList);
128     }
129
130     /**
131      * Filters out similar activity.
132      * @param Activity[] $activities
133      * @return array
134      */
135     protected function filterSimilar($activities)
136     {
137         $newActivity = [];
138         $previousItem = false;
139         foreach ($activities as $activityItem) {
140             if ($previousItem === false) {
141                 $previousItem = $activityItem;
142                 $newActivity[] = $activityItem;
143                 continue;
144             }
145             if (!$activityItem->isSimilarTo($previousItem)) {
146                 $newActivity[] = $activityItem;
147             }
148             $previousItem = $activityItem;
149         }
150         return $newActivity;
151     }
152
153     /**
154      * Flashes a notification message to the session if an appropriate message is available.
155      * @param $activityKey
156      */
157     protected function setNotification($activityKey)
158     {
159         $notificationTextKey = 'activities.' . $activityKey . '_notification';
160         if (trans()->has($notificationTextKey)) {
161             $message = trans($notificationTextKey);
162             Session::flash('success', $message);
163         }
164     }
165
166 }