Passed
Push — master ( d12bea...e67840 )
by Marcel
02:49
created

ReportMapper::getReportsByGroup()   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
nc 1
nop 1
dl 0
loc 10
rs 10
c 0
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 2019-2022 Marcel Scherello
10
 */
11
12
namespace OCA\Analytics\Db;
13
14
use OCP\DB\Exception;
15
use OCP\IDBConnection;
16
use OCP\IL10N;
17
use Psr\Log\LoggerInterface;
18
19
class ReportMapper
20
{
21
    private $userId;
22
    private $l10n;
23
    private $db;
24
    private $logger;
25
    const TABLE_NAME = 'analytics_report';
26
27
    public function __construct(
28
        $userId,
29
        IL10N $l10n,
30
        IDBConnection $db,
31
        LoggerInterface $logger
32
    )
33
    {
34
        $this->userId = $userId;
35
        $this->l10n = $l10n;
36
        $this->db = $db;
37
        $this->logger = $logger;
38
    }
39
40
    /**
41
     * get reports
42
     * @return array
43
     */
44
    public function index()
45
    {
46
        $sql = $this->db->getQueryBuilder();
47
        $sql->from(self::TABLE_NAME)
48
            ->select('id')
49
            ->addSelect('name')
50
            ->addSelect('type')
51
            ->addSelect('parent')
52
            ->addSelect('dataset')
53
            ->where($sql->expr()->eq('user_id', $sql->createNamedParameter($this->userId)))
54
            ->orderBy('parent', 'ASC')
55
            ->addOrderBy('name', 'ASC');
56
        $statement = $sql->execute();
57
        $result = $statement->fetchAll();
58
        $statement->closeCursor();
59
        return $result;
60
    }
61
62
    /**
63
     * get reports for user
64
     * @param $userId
65
     * @return array
66
     */
67
    public function indexByUser($userId)
68
    {
69
        $sql = $this->db->getQueryBuilder();
70
        $sql->from(self::TABLE_NAME)
71
            ->select('id')
72
            ->where($sql->expr()->eq('user_id', $sql->createNamedParameter($userId)));
73
        $statement = $sql->execute();
74
        $result = $statement->fetchAll();
75
        $statement->closeCursor();
76
        return $result;
77
    }
78
79
    /**
80
     * create report
81
     * @param $name
82
     * @param $subheader
83
     * @param $parent
84
     * @param $type
85
     * @param $dataset
86
     * @param $link
87
     * @param $visualization
88
     * @param $chart
89
     * @param $dimension1
90
     * @param $dimension2
91
     * @param $value
92
     * @return int
93
     * @throws \OCP\DB\Exception
94
     */
95
    public function create($name, $subheader, $parent, $type, $dataset, $link, $visualization, $chart, $dimension1, $dimension2, $value)
96
    {
97
        $sql = $this->db->getQueryBuilder();
98
        $sql->insert(self::TABLE_NAME)
99
            ->values([
100
                'user_id' => $sql->createNamedParameter($this->userId),
101
                'dataset' => $sql->createNamedParameter($dataset),
102
                'name' => $sql->createNamedParameter($name),
103
                'subheader' => $sql->createNamedParameter($subheader),
104
                'link' => $sql->createNamedParameter($link),
105
                'type' => $sql->createNamedParameter($type),
106
                'parent' => $sql->createNamedParameter($parent),
107
                'dimension1' => $sql->createNamedParameter($dimension1),
108
                'dimension2' => $sql->createNamedParameter($dimension2),
109
                //'dimension3' => $sql->createNamedParameter($this->l10n->t('Value')),
110
                //'dimension4' => $sql->createNamedParameter($this->l10n->t('Value')),
111
                //'timestamp' => $sql->createNamedParameter($this->l10n->t('Date')),
112
                //'unit' => $sql->createNamedParameter($this->l10n->t('Value')),
113
                'value' => $sql->createNamedParameter($value),
114
                'chart' => $sql->createNamedParameter($chart),
115
                'visualization' => $sql->createNamedParameter($visualization),
116
            ]);
117
        $sql->execute();
118
        return (int)$sql->getLastInsertId();
119
    }
120
121
    /**
122
     * get single report for user
123
     * @param int $id
124
     * @return array
125
     */
126
    public function readOwn(int $id)
127
    {
128
        $sql = $this->db->getQueryBuilder();
129
        $sql->from(self::TABLE_NAME)
130
            ->select('*')
131
            ->where($sql->expr()->eq('id', $sql->createNamedParameter($id)))
132
            ->andWhere($sql->expr()->eq('user_id', $sql->createNamedParameter($this->userId)))
133
            ->orderBy('parent', 'ASC')
134
            ->addOrderBy('name', 'ASC');
135
        $statement = $sql->execute();
136
        $result = $statement->fetch();
137
        $statement->closeCursor();
138
        return $result;
139
    }
140
141
    /**
142
     * get single report
143
     * @param int $id
144
     * @return array
145
     */
146
    public function read(int $id)
147
    {
148
        $sql = $this->db->getQueryBuilder();
149
        $sql->from(self::TABLE_NAME)
150
            ->select('*')
151
            ->where($sql->expr()->eq('id', $sql->createNamedParameter($id)));
152
        $statement = $sql->execute();
153
        $result = $statement->fetch();
154
        $statement->closeCursor();
155
        return $result;
156
    }
157
158
    /**
159
     * update report
160
     * @param $id
161
     * @param $name
162
     * @param $subheader
163
     * @param $parent
164
     * @param $link
165
     * @param $visualization
166
     * @param $chart
167
     * @param $chartoptions
168
     * @param $dataoptions
169
     * @param $dimension1
170
     * @param $dimension2
171
     * @param $value
172
     * @param $filteroptions
173
     * @return bool
174
     */
175
    public function update($id, $name, $subheader, $parent, $link, $visualization, $chart, $chartoptions, $dataoptions, $dimension1, $dimension2, $value, $filteroptions = null)
176
    {
177
        $name = $this->truncate($name, 64);
178
        $sql = $this->db->getQueryBuilder();
179
        $sql->update(self::TABLE_NAME)
180
            ->set('name', $sql->createNamedParameter($name))
181
            ->set('subheader', $sql->createNamedParameter($subheader))
182
            ->set('link', $sql->createNamedParameter($link))
183
            ->set('visualization', $sql->createNamedParameter($visualization))
184
            ->set('chart', $sql->createNamedParameter($chart))
185
            ->set('chartoptions', $sql->createNamedParameter($chartoptions))
186
            ->set('dataoptions', $sql->createNamedParameter($dataoptions))
187
            ->set('parent', $sql->createNamedParameter($parent))
188
            ->set('dimension1', $sql->createNamedParameter($dimension1))
189
            ->set('dimension2', $sql->createNamedParameter($dimension2))
190
            ->set('value', $sql->createNamedParameter($value))
191
            ->where($sql->expr()->eq('user_id', $sql->createNamedParameter($this->userId)))
192
            ->andWhere($sql->expr()->eq('id', $sql->createNamedParameter($id)));
193
        if ($filteroptions !== null) $sql->set('filteroptions', $sql->createNamedParameter($filteroptions));
194
        $sql->execute();
195
        return true;
196
    }
197
198
    /**
199
     * update report options
200
     * @param $id
201
     * @param $chartoptions
202
     * @param $dataoptions
203
     * @param $filteroptions
204
     * @return bool
205
     */
206
    public function updateOptions($id, $chartoptions, $dataoptions, $filteroptions)
207
    {
208
        $sql = $this->db->getQueryBuilder();
209
        $sql->update(self::TABLE_NAME)
210
            ->set('chartoptions', $sql->createNamedParameter($chartoptions))
211
            ->set('dataoptions', $sql->createNamedParameter($dataoptions))
212
            ->set('filteroptions', $sql->createNamedParameter($filteroptions))
213
            ->where($sql->expr()->eq('user_id', $sql->createNamedParameter($this->userId)))
214
            ->andWhere($sql->expr()->eq('id', $sql->createNamedParameter($id)));
215
        $sql->execute();
216
        return true;
217
    }
218
219
    /**
220
     * update report refresh interval
221
     * @param $id
222
     * @param $chartoptions
223
     * @param $dataoptions
224
     * @param $filteroptions
225
     * @return bool
226
     */
227
    public function updateRefresh($id, $refresh)
228
    {
229
        $sql = $this->db->getQueryBuilder();
230
        $sql->update(self::TABLE_NAME)
231
            ->set('refresh', $sql->createNamedParameter($refresh))
232
            ->where($sql->expr()->eq('user_id', $sql->createNamedParameter($this->userId)))
233
            ->andWhere($sql->expr()->eq('id', $sql->createNamedParameter($id)));
234
        $sql->execute();
235
        return true;
236
    }
237
238
    /**
239
     * update report group assignment (from drag & drop)
240
     * @param $id
241
     * @param $groupId
242
     * @return bool
243
     * @throws \OCP\DB\Exception
244
     */
245
    public function updateGroup($id, $groupId)
246
    {
247
        $sql = $this->db->getQueryBuilder();
248
        $sql->update(self::TABLE_NAME)
249
            ->set('parent', $sql->createNamedParameter($groupId))
250
            ->where($sql->expr()->eq('user_id', $sql->createNamedParameter($this->userId)))
251
            ->andWhere($sql->expr()->eq('id', $sql->createNamedParameter($id)));
252
        $sql->execute();
253
        return true;
254
    }
255
256
    /**
257
     * read report options
258
     * @param $id
259
     * @return array
260
     */
261
    public function readOptions($id)
262
    {
263
        $sql = $this->db->getQueryBuilder();
264
        $sql->from(self::TABLE_NAME)
265
            ->select('name')
266
            ->addSelect('visualization')
267
            ->addSelect('chart')
268
            ->addSelect('user_id')
269
            ->where($sql->expr()->eq('id', $sql->createNamedParameter($id)));
270
        $statement = $sql->execute();
271
        $result = $statement->fetch();
272
        $statement->closeCursor();
273
        return $result;
274
    }
275
276
    /**
277
     * delete report
278
     * @param $id
279
     * @return bool
280
     */
281
    public function delete($id)
282
    {
283
        $sql = $this->db->getQueryBuilder();
284
        $sql->delete(self::TABLE_NAME)
285
            ->where($sql->expr()->eq('id', $sql->createNamedParameter($id)));
286
        $sql->execute();
287
        return true;
288
    }
289
290
    /**
291
     * search reports by searchstring
292
     * @param $searchString
293
     * @return array
294
     */
295
    public function search($searchString)
296
    {
297
        $sql = $this->db->getQueryBuilder();
298
        $sql->from(self::TABLE_NAME)
299
            ->select('id')
300
            ->addSelect('name')
301
            ->addSelect('type')
302
            ->where($sql->expr()->eq('user_id', $sql->createNamedParameter($this->userId)))
303
            ->andWhere($sql->expr()->iLike('name', $sql->createNamedParameter('%' . $this->db->escapeLikeParameter($searchString) . '%')))
304
            ->orderBy('name', 'ASC');
305
        $statement = $sql->execute();
306
        $result = $statement->fetchAll();
307
        $statement->closeCursor();
308
        return $result;
309
    }
310
311
    /**
312
     * get the report owner
313
     * @param $reportId
314
     * @return int
315
     */
316
    public function getOwner($reportId)
317
    {
318
        $sql = $this->db->getQueryBuilder();
319
        $sql->from(self::TABLE_NAME)
320
            ->select('user_id')
321
            ->where($sql->expr()->eq('id', $sql->createNamedParameter($reportId)));
322
        $result = (string)$sql->execute()->fetchOne();
323
        return $result;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $result returns the type string which is incompatible with the documented return type integer.
Loading history...
324
    }
325
326
    /**
327
     * get reports by group
328
     * @param $groupId
329
     * @return array
330
     * @throws Exception
331
     */
332
    public function getReportsByGroup($groupId)
333
    {
334
        $sql = $this->db->getQueryBuilder();
335
        $sql->from(self::TABLE_NAME)
336
            ->select('*')
337
            ->where($sql->expr()->eq('parent', $sql->createNamedParameter($groupId)));
338
        $statement = $sql->executeQuery();
339
        $result = $statement->fetchAll();
340
        $statement->closeCursor();
341
        return $result;
342
    }
343
344
    /**
345
     * reports for a dataset
346
     * @param $datasetId
347
     * @return array
348
     * @throws \OCP\DB\Exception
349
     */
350
    public function reportsForDataset($datasetId)
351
    {
352
        $sql = $this->db->getQueryBuilder();
353
        $sql->from(self::TABLE_NAME)
354
            ->select('id')
355
            ->addSelect('name')
356
            ->addSelect('user_id')
357
            ->where($sql->expr()->eq('dataset', $sql->createNamedParameter($datasetId)));
358
        $statement = $sql->execute();
359
        $result = $statement->fetchAll();
360
        $statement->closeCursor();
361
        return $result;
362
    }
363
364
    /**
365
     * truncates fiels do DB-field size
366
     *
367
     * @param $string
368
     * @param $length
369
     * @param $dots
370
     * @return string
371
     */
372
    private function truncate($string, $length, $dots = "...")
373
    {
374
        return (strlen($string) > $length) ? mb_strcut($string, 0, $length - strlen($dots)) . $dots : $string;
375
    }
376
}