Passed
Push — master ( da7451...5b8a4a )
by Marcel
07:08
created

ShareMapper::getShare()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

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