Passed
Push — master ( 2cb37e...453655 )
by Marcel
02:42
created

ActivityManager::createEvent()   B

Complexity

Conditions 7
Paths 8

Size

Total Lines 18
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 7
eloc 14
c 1
b 0
f 0
nc 8
nop 4
dl 0
loc 18
rs 8.8333
1
<?php
2
/**
3
 * Analytics
4
 *
5
 * This file is licensed under the Affero General Public License version 3 or
6
 * later. See the LICENSE.md file.
7
 *
8
 * @author Marcel Scherello <[email protected]>
9
 * @copyright 2021 Marcel Scherello
10
 */
11
12
namespace OCA\Analytics\Activity;
13
14
use OCA\Analytics\Db\ReportMapper;
15
use OCA\Analytics\Db\DatasetMapper;
16
use OCA\Analytics\Db\ShareMapper;
17
use OCP\Activity\IEvent;
18
use OCP\Activity\IManager;
19
use Psr\Log\LoggerInterface;
20
21
class ActivityManager
22
{
23
    const OBJECT_REPORT = 'analytics_report';
24
    const OBJECT_DATA = 'analytics_data';
25
    const SUBJECT_REPORT_ADD = 'report_add';
26
    const SUBJECT_REPORT_DELETE = 'report_delete';
27
    const SUBJECT_REPORT_SHARE = 'report_share';
28
    const SUBJECT_DATA_ADD = 'data_add';
29
    const SUBJECT_DATA_ADD_API = 'data_add_api';
30
    const SUBJECT_DATA_ADD_IMPORT = 'data_add_import';
31
    const SUBJECT_DATA_ADD_DATALOAD = 'data_add_dataload';
32
33
    const SUBJECT_REPORT_ADD_depr = 'dataset_add';
34
    const SUBJECT_REPORT_DELETE_depr = 'dataset_delete';
35
    const SUBJECT_REPORT_SHARE_depr = 'dataset_share';
36
37
    private $manager;
38
    private $userId;
39
    private $ShareMapper;
40
    private $logger;
41
    private $ReportMapper;
42
    private $DatasetMapper;
43
44
    public function __construct(
45
        IManager $manager,
46
        ShareMapper $ShareMapper,
47
        $userId,
48
        ReportMapper $ReportMapper,
49
        DatasetMapper $DatasetMapper,
50
        LoggerInterface $logger
51
    )
52
    {
53
        $this->manager = $manager;
54
        $this->userId = $userId;
55
        $this->ShareMapper = $ShareMapper;
56
        $this->ReportMapper = $ReportMapper;
57
        $this->DatasetMapper = $DatasetMapper;
58
        $this->logger = $logger;
59
    }
60
61
    /**
62
     * @param $datasetId
63
     * @param $eventType
64
     * @param $eventSubject
65
     * @param string|null $user_id
66
     */
67
    public function triggerEvent($datasetId, $eventType, $eventSubject, string $user_id = null)
68
    {
69
        try {
70
            $event = $this->createEvent($datasetId, $eventType, $eventSubject, $user_id);
71
            if ($event !== null) {
72
                $this->sendToUsers($event);
73
            }
74
        } catch (\Exception $e) {
75
            // Ignore exception for undefined activities on update events
76
        }
77
    }
78
79
    /**
80
     * @param $reportId
81
     * @param $eventType
82
     * @param $eventSubject
83
     * @param string|null $user_id
84
     * @return IEvent
85
     * @throws \OCP\DB\Exception
86
     */
87
    private function createEvent($objectId, $eventType, $eventSubject, string $user_id = null)
88
    {
89
        if ($eventSubject === ActivityManager::SUBJECT_REPORT_ADD || $eventSubject === ActivityManager::SUBJECT_REPORT_DELETE || $eventSubject === ActivityManager::SUBJECT_REPORT_SHARE) {
90
            $name = $objectId !== 0 ? $this->ReportMapper->read($objectId)['name'] : '';
91
        } else {
92
            $name = $objectId !== 0 ? $this->DatasetMapper->read($objectId)['name'] : '';
93
            $objectId = 0;
94
        }
95
96
        if ($user_id) $this->userId = $user_id;
97
        $event = $this->manager->generateEvent();
98
        $event->setApp('analytics')
99
            ->setType($eventType)
100
            ->setAuthor($this->userId)
101
            ->setObject('report', (int)$objectId, $name)
102
            ->setSubject($eventSubject, ['author' => $this->userId])
103
            ->setTimestamp(time());
104
        return $event;
105
    }
106
107
    /**
108
     * Publish activity to all users that are part of the dataset
109
     *
110
     * @param IEvent $event
111
     */
112
    private function sendToUsers(IEvent $event)
113
    {
114
        $users = $this->ShareMapper->getSharedReceiver($event->getObjectId());
115
        foreach ($users as $user) {
116
            $event->setAffectedUser($user['uid_owner']);
117
            $this->manager->publish($event);
118
        }
119
        $event->setAffectedUser($this->userId);
120
        $this->manager->publish($event);
121
    }
122
}