Passed
Push — master ( 9df72b...a7b6af )
by Marcel
02:33
created

ReportMapper::readOwn()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 13
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

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