Passed
Push — master ( c86b7d...5b39b2 )
by Marcel
02:44
created

ShareMapper::getSharedReceiver()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 12
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 10
nc 1
nop 1
dl 0
loc 12
rs 9.9332
c 1
b 0
f 0
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 2020 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\ILogger;
18
use OCP\IUserSession;
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
        ILogger $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
            ->selectAlias($sql->createNamedParameter(99, IQueryBuilder::PARAM_INT), 'type')
78
            ->selectAlias($sql->createNamedParameter(0, IQueryBuilder::PARAM_INT), 'parrent')
79
            ->where($sql->expr()->eq('SH.uid_owner', $sql->createNamedParameter($group)))
80
            ->andWhere($sql->expr()->eq('SH.type', $sql->createNamedParameter(1)));
81
        $statement = $sql->execute();
82
        $result = $statement->fetchAll();
83
        $statement->closeCursor();
84
        return $result;
85
    }
86
87
    /**
88
     * get all shared datasets by group
89
     * @param $group
90
     * @param $id
91
     * @return array
92
     */
93
    public function getDatasetByGroupId($group, $id)
94
    {
95
        $sql = $this->db->getQueryBuilder();
96
        $sql->from(self::TABLE_NAME_DATASET, 'DS')
97
            ->leftJoin('DS', self::TABLE_NAME, 'SH', $sql->expr()->eq('DS.id', 'SH.dataset'))
98
            ->select('DS.*')
99
            ->addSelect('SH.permissions')
100
            //->selectAlias($sql->createNamedParameter(99), 'type')
101
            ->selectAlias($sql->createNamedParameter(0, IQueryBuilder::PARAM_INT), 'parrent')
102
            ->where($sql->expr()->eq('SH.uid_owner', $sql->createNamedParameter($group)))
103
            ->andWhere($sql->expr()->eq('SH.type', $sql->createNamedParameter(1)))
104
            ->andWhere($sql->expr()->eq('SH.dataset', $sql->createNamedParameter($id)));
105
        $statement = $sql->execute();
106
        $result = $statement->fetch();
107
        $statement->closeCursor();
108
        return $result;
109
    }
110
111
    /**
112
     * get shared datasets for current user
113
     * @return array
114
     */
115
    public function getSharedDatasets()
116
    {
117
        $sql = $this->db->getQueryBuilder();
118
        $sql->from(self::TABLE_NAME_DATASET, 'DS')
119
            ->leftJoin('DS', self::TABLE_NAME, 'SH', $sql->expr()->eq('DS.id', 'SH.dataset'))
120
            ->select('DS.id', 'DS.name')
121
            ->selectAlias($sql->createNamedParameter(99, IQueryBuilder::PARAM_INT), 'type')
122
            ->selectAlias($sql->createNamedParameter(0, IQueryBuilder::PARAM_INT), 'parrent')
123
            ->where($sql->expr()->eq('SH.uid_owner', $sql->createNamedParameter($this->userSession->getUser()->getUID())));
124
        $statement = $sql->execute();
125
        $result = $statement->fetchAll();
126
        $statement->closeCursor();
127
        return $result;
128
    }
129
130
    /**
131
     * get single shared dataset for current user
132
     * @param $id
133
     * @return array
134
     */
135
    public function getSharedDataset($id)
136
    {
137
        $sql = $this->db->getQueryBuilder();
138
        $sql->from(self::TABLE_NAME_DATASET, 'DS')
139
            ->leftJoin('DS', self::TABLE_NAME, 'SH', $sql->expr()->eq('DS.id', 'SH.dataset'))
140
            ->select('DS.*')
141
            ->addSelect('SH.permissions')
142
            ->selectAlias($sql->createNamedParameter(true, IQueryBuilder::PARAM_BOOL), 'isShare')
143
            ->where($sql->expr()->eq('SH.uid_owner', $sql->createNamedParameter($this->userSession->getUser()->getUID())))
144
            ->andWhere($sql->expr()->eq('DS.id', $sql->createNamedParameter($id)));
145
        $statement = $sql->execute();
146
        $result = $statement->fetch();
147
        $statement->closeCursor();
148
        return $result;
149
    }
150
151
    /**
152
     * Create a new share
153
     * @param $datasetId
154
     * @param $type
155
     * @param $uid_owner
156
     * @param $token
157
     * @return bool
158
     */
159
    public function createShare($datasetId, $type, $uid_owner, $token)
160
    {
161
        $sql = $this->db->getQueryBuilder();
162
        $sql->from(self::TABLE_NAME)
163
            ->Select('id')
164
            ->where($sql->expr()->eq('dataset', $sql->createNamedParameter($datasetId)))
165
            ->andWhere($sql->expr()->eq('type', $sql->createNamedParameter($type)))
166
            ->andWhere($sql->expr()->eq('uid_owner', $sql->createNamedParameter($uid_owner)))
167
            ->andWhere($sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID())));
168
        $statement = $sql->execute();
169
        $result = $statement->fetchAll();
170
        $statement->closeCursor();
171
172
        if ($result && ($type !== 3)) {
173
            // don´t create double shares
174
            return false;
175
        } else {
176
            $sql = $this->db->getQueryBuilder();
177
            $sql->insert(self::TABLE_NAME)
178
                ->values([
179
                    'dataset' => $sql->createNamedParameter($datasetId),
180
                    'type' => $sql->createNamedParameter($type),
181
                    'uid_owner' => $sql->createNamedParameter($uid_owner),
182
                    'uid_initiator' => $sql->createNamedParameter($this->userSession->getUser()->getUID()),
183
                    'token' => $sql->createNamedParameter($token),
184
                ]);
185
            $sql->execute();
186
        }
187
        return true;
188
    }
189
190
    /**
191
     * Get all shares of a dataset
192
     * @param $datasetId
193
     * @return array
194
     */
195
    public function getShares($datasetId)
196
    {
197
        $sql = $this->db->getQueryBuilder();
198
        $sql->from(self::TABLE_NAME)
199
            ->select('id', 'type', 'uid_owner', 'token', 'permissions')
200
            ->selectAlias('password', 'pass')
201
            ->where($sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID())))
202
            ->andWhere($sql->expr()->eq('dataset', $sql->createNamedParameter($datasetId)));
203
        $statement = $sql->execute();
204
        $result = $statement->fetchAll();
205
        $statement->closeCursor();
206
        return $result;
207
    }
208
209
    /**
210
     * Get the all receivers of shares of a dataset
211
     * Used to derive who has to receive activites when a dataset changes
212
     * @param $datasetId
213
     * @return array
214
     */
215
    public function getSharedReceiver($datasetId)
216
    {
217
        $sql = $this->db->getQueryBuilder();
218
        $sql->from(self::TABLE_NAME)
219
            ->select('uid_owner')
220
            ->where($sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID())))
221
            ->andWhere($sql->expr()->eq('dataset', $sql->createNamedParameter($datasetId)))
222
            ->andWhere($sql->expr()->eq('type', $sql->createNamedParameter(0)));
223
        $statement = $sql->execute();
224
        $result = $statement->fetchAll();
225
        $statement->closeCursor();
226
        return $result;
227
    }
228
229
    /**
230
     * Update the password of a share
231
     * @param $shareId
232
     * @param $password
233
     * @return bool
234
     */
235
    public function updateSharePassword($shareId, $password)
236
    {
237
        $sql = $this->db->getQueryBuilder();
238
        $sql->update(self::TABLE_NAME)
239
            ->set('password', $sql->createNamedParameter($password))
240
            ->where($sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID())))
241
            ->andWhere($sql->expr()->eq('id', $sql->createNamedParameter($shareId)));
242
        $sql->execute();
243
        return true;
244
    }
245
246
    /**
247
     * Update the permissions of a share
248
     * @param $shareId
249
     * @param $password
250
     * @return bool
251
     */
252
    public function updateSharePermissions($shareId, $permissions)
253
    {
254
        $sql = $this->db->getQueryBuilder();
255
        $sql->update(self::TABLE_NAME)
256
            ->set('permissions', $sql->createNamedParameter($permissions))
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
     * Delete a share
265
     * @param $shareId
266
     * @return bool
267
     */
268
    public function deleteShare($shareId)
269
    {
270
        $sql = $this->db->getQueryBuilder();
271
        $sql->delete(self::TABLE_NAME)
272
            ->where($sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID())))
273
            ->andWhere($sql->expr()->eq('id', $sql->createNamedParameter($shareId)));
274
        $sql->execute();
275
        return true;
276
    }
277
278
    /**
279
     * Delete all shares of a dataset
280
     * Used during dataset deletion
281
     * @param $datasetId
282
     * @return bool
283
     */
284
    public function deleteShareByDataset($datasetId)
285
    {
286
        $sql = $this->db->getQueryBuilder();
287
        $sql->delete(self::TABLE_NAME)
288
            ->where($sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID())))
289
            ->andWhere($sql->expr()->eq('dataset', $sql->createNamedParameter($datasetId)));
290
        $sql->execute();
291
        return true;
292
    }
293
}