Passed
Push — master ( e1d9e3...479464 )
by Marcel
03:19 queued 15s
created

ShareMapper   A

Complexity

Total Complexity 16

Size/Duplication

Total Lines 284
Duplicated Lines 0 %

Importance

Changes 5
Bugs 0 Features 0
Metric Value
eloc 139
dl 0
loc 284
rs 10
c 5
b 0
f 0
wmc 16

14 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 9 1
A updateSharePassword() 0 9 1
A createShare() 0 32 3
A deleteShareByReport() 0 8 1
A getShares() 0 14 1
A getReportByToken() 0 14 1
A deleteShareByParent() 0 8 1
A getSharedReceiver() 0 11 1
A updateShareDomain() 0 9 1
A getSharedReport() 0 14 1
A getShare() 0 10 1
A getSharedReports() 0 13 1
A deleteShare() 0 11 1
A updateSharePermissions() 0 9 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 2021 Marcel Scherello
10
 */
11
12
namespace OCA\Analytics\Db;
13
14
use OCP\DB\QueryBuilder\IQueryBuilder;
15
use OCP\IDBConnection;
16
use OCP\IUserSession;
17
use Psr\Log\LoggerInterface;
18
19
class ShareMapper
20
{
21
    /** @var IUserSession */
22
    private $userSession;
23
    /** @var IDBConnection */
24
    private $db;
25
    private $logger;
26
    const TABLE_NAME = 'analytics_share';
27
    const TABLE_NAME_REPORT = 'analytics_report';
28
29
    public function __construct(
30
        IDBConnection $db,
31
        IUserSession $userSession,
32
        LoggerInterface $logger
33
    )
34
    {
35
        $this->userSession = $userSession;
36
        $this->db = $db;
37
        $this->logger = $logger;
38
    }
39
40
    /**
41
     * get all shared reports by token
42
     * uses for public pages
43
     * @param $token
44
     * @return array
45
     */
46
    public function getReportByToken($token)
47
    {
48
        $sql = $this->db->getQueryBuilder();
49
        $sql->from(self::TABLE_NAME_REPORT, 'DS')
50
            ->leftJoin('DS', self::TABLE_NAME, 'SH', $sql->expr()->eq('DS.id', 'SH.report'))
51
            ->select('DS.*')
52
            ->addSelect('SH.permissions')
53
            ->selectAlias('SH.domain', 'domain')
54
            ->selectAlias('SH.password', 'password')
55
            ->where($sql->expr()->eq('SH.token', $sql->createNamedParameter($token)));
56
        $statement = $sql->execute();
57
        $result = $statement->fetch();
58
        $statement->closeCursor();
59
        return $result;
60
    }
61
62
    /**
63
     * get shared reports for current user
64
     * @return array
65
     */
66
    public function getSharedReports()
67
    {
68
        $sql = $this->db->getQueryBuilder();
69
        $sql->from(self::TABLE_NAME_REPORT, 'DS')
70
            ->leftJoin('DS', self::TABLE_NAME, 'SH', $sql->expr()->eq('DS.id', 'SH.report'))
71
            ->select('DS.id', 'DS.name')
72
            ->selectAlias('SH.id', 'shareId')
73
            ->where($sql->expr()->eq('SH.uid_owner', $sql->createNamedParameter($this->userSession->getUser()->getUID())))
74
            ->andWhere($sql->expr()->neq('SH.type', $sql->createNamedParameter(1))); // don´t find groups with the same name
75
        $statement = $sql->execute();
76
        $result = $statement->fetchAll();
77
        $statement->closeCursor();
78
        return $result;
79
    }
80
81
    /**
82
     * get single shared report for current user
83
     * @param $id
84
     * @return array
85
     */
86
    public function getSharedReport($id)
87
    {
88
        $sql = $this->db->getQueryBuilder();
89
        $sql->from(self::TABLE_NAME_REPORT, 'DS')
90
            ->leftJoin('DS', self::TABLE_NAME, 'SH', $sql->expr()->eq('DS.id', 'SH.report'))
91
            ->select('DS.*')
92
            ->addSelect('SH.permissions')
93
            ->selectAlias($sql->createNamedParameter(true, IQueryBuilder::PARAM_BOOL), 'isShare')
94
            ->where($sql->expr()->eq('SH.uid_owner', $sql->createNamedParameter($this->userSession->getUser()->getUID())))
95
            ->andWhere($sql->expr()->eq('DS.id', $sql->createNamedParameter($id)));
96
        $statement = $sql->execute();
97
        $result = $statement->fetch();
98
        $statement->closeCursor();
99
        return $result;
100
    }
101
102
    /**
103
     * Create a new share
104
     * @param $reportId
105
     * @param $type
106
     * @param $uid_owner
107
     * @param $token
108
     * @param $parent
109
     * @return bool
110
     * @throws \OCP\DB\Exception
111
     */
112
    public function createShare($reportId, $type, $uid_owner, $token, $parent = null)
113
    {
114
        $sql = $this->db->getQueryBuilder();
115
        $sql->from(self::TABLE_NAME)
116
            ->Select('id')
117
            ->where($sql->expr()->eq('report', $sql->createNamedParameter($reportId)))
118
            ->andWhere($sql->expr()->eq('type', $sql->createNamedParameter($type)))
119
            ->andWhere($sql->expr()->eq('uid_owner', $sql->createNamedParameter($uid_owner)))
120
            ->andWhere($sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID())));
121
        $statement = $sql->execute();
122
        $result = $statement->fetchAll();
123
        $statement->closeCursor();
124
125
        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...
126
            // don´t create double shares
127
            // multiple link shares (3) are possible
128
            return false;
129
        } else {
130
            $sql = $this->db->getQueryBuilder();
131
            $sql->insert(self::TABLE_NAME)
132
                ->values([
133
                    'report' => $sql->createNamedParameter($reportId),
134
                    'dataset' => $sql->createNamedParameter($reportId),
135
                    'type' => $sql->createNamedParameter($type),
136
                    'uid_owner' => $sql->createNamedParameter($uid_owner),
137
                    'uid_initiator' => $sql->createNamedParameter($this->userSession->getUser()->getUID()),
138
                    'token' => $sql->createNamedParameter($token),
139
                    'parent' => $sql->createNamedParameter($parent),
140
                ]);
141
            $sql->execute();
142
        }
143
        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...
144
    }
145
146
    /**
147
     * Get single shares metadata
148
     * @param $shareId
149
     * @return array
150
     */
151
    public function getShare($shareId)
152
    {
153
        $sql = $this->db->getQueryBuilder();
154
        $sql->from(self::TABLE_NAME)
155
            ->select('id', 'type', 'parent')
156
            ->where($sql->expr()->eq('id', $sql->createNamedParameter($shareId)));
157
        $statement = $sql->execute();
158
        $result = $statement->fetch();
159
        $statement->closeCursor();
160
        return $result;
161
    }
162
163
    /**
164
     * Get all shares of a report
165
     * @param $reportId
166
     * @return array
167
     */
168
    public function getShares($reportId)
169
    {
170
        $sql = $this->db->getQueryBuilder();
171
        $sql->from(self::TABLE_NAME)
172
            ->select('id', 'type', 'uid_owner', 'token', 'permissions', 'domain')
173
            ->selectAlias('password', 'pass')
174
            ->where($sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID())))
175
            ->andWhere($sql->expr()->eq('report', $sql->createNamedParameter($reportId)))
176
            ->andWhere($sql->expr()->neq('type', $sql->createNamedParameter(2)))
177
            ->orderBy('id', 'ASC');
178
        $statement = $sql->execute();
179
        $result = $statement->fetchAll();
180
        $statement->closeCursor();
181
        return $result;
182
    }
183
184
    /**
185
     * Get the all receivers of shares of a report
186
     * Used to derive who has to receive activities when a report changes
187
     * @param $reportId
188
     * @return array
189
     */
190
    public function getSharedReceiver($reportId)
191
    {
192
        $sql = $this->db->getQueryBuilder();
193
        $sql->from(self::TABLE_NAME)
194
            ->select('uid_owner')
195
            ->where($sql->expr()->eq('report', $sql->createNamedParameter($reportId)))
196
            ->andWhere($sql->expr()->eq('type', $sql->createNamedParameter(0)));
197
        $statement = $sql->execute();
198
        $result = $statement->fetchAll();
199
        $statement->closeCursor();
200
        return $result;
201
    }
202
203
    /**
204
     * Update the password of a share
205
     * @param $shareId
206
     * @param $password
207
     * @return bool
208
     */
209
    public function updateSharePassword($shareId, $password)
210
    {
211
        $sql = $this->db->getQueryBuilder();
212
        $sql->update(self::TABLE_NAME)
213
            ->set('password', $sql->createNamedParameter($password))
214
            ->where($sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID())))
215
            ->andWhere($sql->expr()->eq('id', $sql->createNamedParameter($shareId)));
216
        $sql->execute();
217
        return true;
218
    }
219
220
    /**
221
     * Update the password of a share
222
     * @param $shareId
223
     * @param $domain
224
     * @return bool
225
     * @throws \OCP\DB\Exception
226
     */
227
    public function updateShareDomain($shareId, $domain)
228
    {
229
        $sql = $this->db->getQueryBuilder();
230
        $sql->update(self::TABLE_NAME)
231
            ->set('domain', $sql->createNamedParameter($domain))
232
            ->where($sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID())))
233
            ->andWhere($sql->expr()->eq('id', $sql->createNamedParameter($shareId)));
234
        $sql->execute();
235
        return true;
236
    }
237
238
    /**
239
     * Update the permissions of a share
240
     * @param $shareId
241
     * @param $password
242
     * @return bool
243
     */
244
    public function updateSharePermissions($shareId, $permissions)
245
    {
246
        $sql = $this->db->getQueryBuilder();
247
        $sql->update(self::TABLE_NAME)
248
            ->set('permissions', $sql->createNamedParameter($permissions))
249
            ->where($sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID())))
250
            ->andWhere($sql->expr()->eq('id', $sql->createNamedParameter($shareId)));
251
        $sql->execute();
252
        return true;
253
    }
254
255
    /**
256
     * Delete a share
257
     * @param $shareId
258
     * @return bool
259
     * @throws \OCP\DB\Exception
260
     */
261
    public function deleteShare($shareId)
262
    {
263
        $sql = $this->db->getQueryBuilder();
264
        $sql->delete(self::TABLE_NAME)
265
            ->where($sql->expr()->eq('id', $sql->createNamedParameter($shareId)))
266
            ->andWhere($sql->expr()->orX(
267
                $sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID())),
268
                $sql->expr()->eq('uid_owner', $sql->createNamedParameter($this->userSession->getUser()->getUID()))
269
            ));
270
        $sql->execute();
271
        return true;
272
    }
273
274
    /**
275
     * Delete all shares by parent ID (users of a group share)
276
     * @param $parent
277
     * @return bool
278
     */
279
    public function deleteShareByParent($parent)
280
    {
281
        $sql = $this->db->getQueryBuilder();
282
        $sql->delete(self::TABLE_NAME)
283
            ->where($sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID())))
284
            ->andWhere($sql->expr()->eq('parent', $sql->createNamedParameter($parent)));
285
        $sql->execute();
286
        return true;
287
    }
288
289
    /**
290
     * Delete all shares of a report
291
     * Used during report deletion
292
     * @param $reportId
293
     * @return bool
294
     */
295
    public function deleteShareByReport($reportId)
296
    {
297
        $sql = $this->db->getQueryBuilder();
298
        $sql->delete(self::TABLE_NAME)
299
            ->where($sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID())))
300
            ->andWhere($sql->expr()->eq('report', $sql->createNamedParameter($reportId)));
301
        $sql->execute();
302
        return true;
303
    }
304
}