b7e813008037c35c2dd3313e04f72c4a14a78227
[GitHub/WoltLab/WCF.git] / wcfsetup / install / files / lib / data / user / activity / event / ViewableUserActivityEventList.class.php
1 <?php
2
3 namespace wcf\data\user\activity\event;
4
5 use wcf\system\cache\runtime\UserProfileRuntimeCache;
6 use wcf\system\language\LanguageFactory;
7 use wcf\system\user\activity\event\UserActivityEventHandler;
8 use wcf\system\WCF;
9
10 /**
11 * Represents a list of viewable user activity events.
12 *
13 * @author Alexander Ebert
14 * @copyright 2001-2019 WoltLab GmbH
15 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
16 * @package WoltLabSuite\Core\Data\User\Activity\Event
17 *
18 * @method ViewableUserActivityEvent current()
19 * @method ViewableUserActivityEvent[] getObjects()
20 * @method ViewableUserActivityEvent|null getSingleObject()
21 * @method ViewableUserActivityEvent|null seach($objectID)
22 * @property ViewableUserActivityEvent[] $objects
23 */
24 class ViewableUserActivityEventList extends UserActivityEventList
25 {
26 /**
27 * @inheritDoc
28 */
29 public $className = UserActivityEvent::class;
30
31 /**
32 * @inheritDoc
33 */
34 public $decoratorClassName = ViewableUserActivityEvent::class;
35
36 /**
37 * @inheritDoc
38 */
39 public $sqlLimit = 20;
40
41 /**
42 * @inheritDoc
43 */
44 public $sqlOrderBy = 'user_activity_event.time DESC, user_activity_event.eventID DESC';
45
46 /**
47 * @inheritDoc
48 */
49 public function __construct()
50 {
51 parent::__construct();
52
53 if (LanguageFactory::getInstance()->multilingualismEnabled() && \count(WCF::getUser()->getLanguageIDs())) {
54 $this->getConditionBuilder()->add(
55 '(user_activity_event.languageID IN (?) OR user_activity_event.languageID IS NULL)',
56 [WCF::getUser()->getLanguageIDs()]
57 );
58 }
59 }
60
61 /**
62 * @inheritDoc
63 */
64 public function readObjects()
65 {
66 parent::readObjects();
67
68 $userIDs = [];
69 $eventGroups = [];
70 foreach ($this->objects as $event) {
71 $userIDs[] = $event->userID;
72
73 if (!isset($eventGroups[$event->objectTypeID])) {
74 $objectType = UserActivityEventHandler::getInstance()->getObjectType($event->objectTypeID);
75 $eventGroups[$event->objectTypeID] = [
76 'className' => $objectType->className,
77 'objects' => [],
78 ];
79 }
80
81 $eventGroups[$event->objectTypeID]['objects'][] = $event;
82 }
83
84 // set user profiles
85 if (!empty($userIDs)) {
86 UserProfileRuntimeCache::getInstance()->cacheObjectIDs(\array_unique($userIDs));
87 }
88
89 // parse events
90 foreach ($eventGroups as $eventData) {
91 $eventClass = \call_user_func([$eventData['className'], 'getInstance']);
92 $eventClass->prepare($eventData['objects']);
93 }
94 }
95
96 /**
97 * Returns timestamp of oldest entry fetched.
98 *
99 * @return int
100 */
101 public function getLastEventTime()
102 {
103 $lastEventTime = 0;
104 foreach ($this->objects as $event) {
105 if (!$lastEventTime) {
106 $lastEventTime = $event->time;
107 }
108
109 $lastEventTime = \min($lastEventTime, $event->time);
110 }
111
112 return $lastEventTime;
113 }
114
115 /**
116 * Validates event permissions and returns a list of orphaned event ids.
117 *
118 * @return int[]
119 */
120 public function validateEvents()
121 {
122 $orphanedEventIDs = [];
123
124 foreach ($this->objects as $index => $event) {
125 if ($event->isOrphaned()) {
126 $orphanedEventIDs[] = $event->eventID;
127 unset($this->objects[$index]);
128 } elseif (!$event->isAccessible()) {
129 unset($this->objects[$index]);
130 }
131 }
132 $this->indexToObject = \array_keys($this->objects);
133
134 return $orphanedEventIDs;
135 }
136
137 /**
138 * Truncates the items in object list to given number of items.
139 *
140 * @param int $limit
141 */
142 public function truncate($limit)
143 {
144 $this->objects = \array_slice($this->objects, 0, $limit, true);
145 $this->indexToObject = \array_keys($this->objects);
146 }
147 }