Passed
Push — master ( 6fe14f...44c396 )
by Marcel
03:09 queued 13s
created

ShareMapper   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 256
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 118
dl 0
loc 256
rs 10
c 1
b 0
f 0
wmc 14

12 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 9 1
A getReportByToken() 0 14 1
A getAllSharedReports() 0 14 1
A updateSharePassword() 0 9 1
A deleteShareByReport() 0 7 1
A getShares() 0 14 1
A getSharedReceiver() 0 11 1
A updateShareDomain() 0 9 1
A deleteShare() 0 11 1
A updateSharePermissions() 0 11 1
A createShare() 0 31 3
A deleteByUser() 0 8 1
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 2019-2022 Marcel Scherello
10
 */
11
12
namespace OCA\Analytics\Db;
13
14
use OCP\DB\Exception;
15
use OCP\DB\QueryBuilder\IQueryBuilder;
16
use OCP\IDBConnection;
17
use OCP\IUserSession;
18
use Psr\Log\LoggerInterface;
19
20
class ShareMapper
21
{
22
    /** @var IUserSession */
23
    private $userSession;
24
    /** @var IDBConnection */
25
    private $db;
26
    private $logger;
27
    const TABLE_NAME = 'analytics_share';
28
    const TABLE_NAME_REPORT = 'analytics_report';
29
30
    public function __construct(
31
        IDBConnection $db,
32
        IUserSession $userSession,
33
        LoggerInterface $logger
34
    )
35
    {
36
        $this->userSession = $userSession;
37
        $this->db = $db;
38
        $this->logger = $logger;
39
    }
40
41
    /**
42
     * get all shared reports by token
43
     * uses for public pages
44
     * @param $token
45
     * @return array
46
     * @throws Exception
47
     */
48
    public function getReportByToken($token)
49
    {
50
        $sql = $this->db->getQueryBuilder();
51
        $sql->from(self::TABLE_NAME_REPORT, 'DS')
52
            ->leftJoin('DS', self::TABLE_NAME, 'SH', $sql->expr()->eq('DS.id', 'SH.report'))
53
            ->select('DS.*')
54
            ->addSelect('SH.permissions')
55
            ->selectAlias('SH.domain', 'domain')
56
            ->selectAlias('SH.password', 'password')
57
            ->where($sql->expr()->eq('SH.token', $sql->createNamedParameter($token)));
58
        $statement = $sql->executeQuery();
59
        $result = $statement->fetch();
60
        $statement->closeCursor();
61
        return $result;
62
    }
63
64
    /**
65
     * get all shared reports
66
     * @return array
67
     * @throws Exception
68
     */
69
    public function getAllSharedReports()
70
    {
71
        $sql = $this->db->getQueryBuilder();
72
        $sql->from(self::TABLE_NAME_REPORT, 'REPORT')
73
            ->rightJoin('REPORT', self::TABLE_NAME, 'SHARE', $sql->expr()->eq('REPORT.id', 'SHARE.report'))
74
            ->select('REPORT.*')
75
            ->selectAlias('SHARE.id', 'shareId')
76
            ->selectAlias('SHARE.type', 'shareType')
77
            ->selectAlias('SHARE.uid_owner', 'shareUid_owner')
78
            ->addSelect('SHARE.permissions');
79
        $statement = $sql->executeQuery();
80
        $result = $statement->fetchAll();
81
        $statement->closeCursor();
82
        return $result;
83
    }
84
85
    /**
86
     * Create a new share
87
     * @param $reportId
88
     * @param $type
89
     * @param $uid_owner
90
     * @param $token
91
     * @param $parent
92
     * @return bool
93
     * @throws \OCP\DB\Exception
94
     */
95
    public function createShare($reportId, $type, $uid_owner, $token, $parent = null)
96
    {
97
        $sql = $this->db->getQueryBuilder();
98
        $sql->from(self::TABLE_NAME)
99
            ->Select('id')
100
            ->where($sql->expr()->eq('report', $sql->createNamedParameter($reportId)))
101
            ->andWhere($sql->expr()->eq('type', $sql->createNamedParameter($type)))
102
            ->andWhere($sql->expr()->eq('uid_owner', $sql->createNamedParameter($uid_owner)))
103
            ->andWhere($sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID())));
104
        $statement = $sql->executeQuery();
105
        $result = $statement->fetchAll();
106
        $statement->closeCursor();
107
108
        if ($result && ($type !== 3)) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $result of type array<mixed,mixed> is implicitly converted to a boolean; are you sure this is intended? If so, consider using ! empty($expr) instead to make it clear that you intend to check for an array without elements.

This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.

Consider making the comparison explicit by using empty(..) or ! empty(...) instead.

Loading history...
109
            // don´t create double shares
110
            // multiple link shares (3) are possible
111
            return false;
112
        } else {
113
            $sql = $this->db->getQueryBuilder();
114
            $sql->insert(self::TABLE_NAME)
115
                ->values([
116
                    'report' => $sql->createNamedParameter($reportId),
117
                    'type' => $sql->createNamedParameter($type),
118
                    'uid_owner' => $sql->createNamedParameter($uid_owner),
119
                    'uid_initiator' => $sql->createNamedParameter($this->userSession->getUser()->getUID()),
120
                    'token' => $sql->createNamedParameter($token),
121
                    'parent' => $sql->createNamedParameter($parent),
122
                ]);
123
            $sql->executeStatement();
124
        }
125
        return $sql->getLastInsertId();
0 ignored issues
show
Bug Best Practice introduced by
The expression return $sql->getLastInsertId() returns the type integer which is incompatible with the documented return type boolean.
Loading history...
126
    }
127
128
    /**
129
     * Get all shares of a report
130
     * @param $reportId
131
     * @return array
132
     * @throws Exception
133
     */
134
    public function getShares($reportId)
135
    {
136
        $sql = $this->db->getQueryBuilder();
137
        $sql->from(self::TABLE_NAME)
138
            ->select('id', 'type', 'uid_owner', 'token', 'permissions', 'domain')
139
            ->selectAlias('password', 'pass')
140
            ->where($sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID())))
141
            ->andWhere($sql->expr()->eq('report', $sql->createNamedParameter($reportId)))
142
            ->andWhere($sql->expr()->neq('type', $sql->createNamedParameter(2)))
143
            ->orderBy('id', 'ASC');
144
        $statement = $sql->executeQuery();
145
        $result = $statement->fetchAll();
146
        $statement->closeCursor();
147
        return $result;
148
    }
149
150
    /**
151
     * Get the all receivers of shares of a report
152
     * Used to derive who has to receive activities when a report changes
153
     * @param $reportId
154
     * @return array
155
     * @throws Exception
156
     */
157
    public function getSharedReceiver($reportId)
158
    {
159
        $sql = $this->db->getQueryBuilder();
160
        $sql->from(self::TABLE_NAME)
161
            ->select('uid_owner')
162
            ->where($sql->expr()->eq('report', $sql->createNamedParameter($reportId)))
163
            ->andWhere($sql->expr()->eq('type', $sql->createNamedParameter(0)));
164
        $statement = $sql->executeQuery();
165
        $result = $statement->fetchAll();
166
        $statement->closeCursor();
167
        return $result;
168
    }
169
170
    /**
171
     * Update the password of a share
172
     * @param $shareId
173
     * @param $password
174
     * @return bool
175
     * @throws Exception
176
     */
177
    public function updateSharePassword($shareId, $password)
178
    {
179
        $sql = $this->db->getQueryBuilder();
180
        $sql->update(self::TABLE_NAME)
181
            ->set('password', $sql->createNamedParameter($password))
182
            ->where($sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID())))
183
            ->andWhere($sql->expr()->eq('id', $sql->createNamedParameter($shareId)));
184
        $sql->executeStatement();
185
        return true;
186
    }
187
188
    /**
189
     * Update the password of a share
190
     * @param $shareId
191
     * @param $domain
192
     * @return bool
193
     * @throws Exception
194
     */
195
    public function updateShareDomain($shareId, $domain)
196
    {
197
        $sql = $this->db->getQueryBuilder();
198
        $sql->update(self::TABLE_NAME)
199
            ->set('domain', $sql->createNamedParameter($domain))
200
            ->where($sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID())))
201
            ->andWhere($sql->expr()->eq('id', $sql->createNamedParameter($shareId)));
202
        $sql->executeStatement();
203
        return true;
204
    }
205
206
    /**
207
     * Update the permissions of a share
208
     * @param $shareId
209
     * @param $permissions
210
     * @return bool
211
     * @throws Exception
212
     */
213
    public function updateSharePermissions($shareId, $permissions)
214
    {
215
        // update the share itself
216
        $sql = $this->db->getQueryBuilder();
217
        $sql->update(self::TABLE_NAME)
218
            ->set('permissions', $sql->createNamedParameter($permissions))
219
            ->where($sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID())))
220
            ->andWhere($sql->expr()->eq('id', $sql->createNamedParameter($shareId)));
221
        $sql->executeStatement();
222
223
        return true;
224
    }
225
226
    /**
227
     * Delete an own share (sharee or receiver)
228
     * @param $shareId
229
     * @return bool
230
     * @throws Exception
231
     */
232
    public function deleteShare($shareId)
233
    {
234
        $sql = $this->db->getQueryBuilder();
235
        $sql->delete(self::TABLE_NAME)
236
            ->where($sql->expr()->eq('id', $sql->createNamedParameter($shareId)))
237
            ->andWhere($sql->expr()->orX(
238
                $sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID())),
239
                $sql->expr()->eq('uid_owner', $sql->createNamedParameter($this->userSession->getUser()->getUID()))
240
            ));
241
        $sql->executeStatement();
242
        return true;
243
    }
244
245
    /**
246
     * Delete all shares of a report
247
     * Used during report deletion
248
     * @param $reportId
249
     * @return bool
250
     * @throws Exception
251
     */
252
    public function deleteShareByReport($reportId)
253
    {
254
        $sql = $this->db->getQueryBuilder();
255
        $sql->delete(self::TABLE_NAME)
256
            ->where($sql->expr()->eq('report', $sql->createNamedParameter($reportId)));
257
        $sql->executeStatement();
258
        return true;
259
    }
260
261
    /**
262
     * delete all shares when a share-receiving-user is deleted
263
     *
264
     * @param $userId
265
     * @return bool
266
     * @throws Exception
267
     */
268
    public function deleteByUser($userId)
269
    {
270
        $sql = $this->db->getQueryBuilder();
271
        $sql->delete(self::TABLE_NAME)
272
            ->where($sql->expr()->eq('uid_owner', $sql->createNamedParameter($userId)))
273
            ->andWhere($sql->expr()->eq('type', $sql->createNamedParameter(0)));
274
        $sql->executeStatement();
275
        return true;
276
    }
277
278
}