Passed
Push — master ( 9e4d93...df17d4 )
by Marcel
03:16 queued 12s
created

ShareMapper::getSharedReport()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 14
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

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