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

ReportMapper::create()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 24
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 17
c 1
b 0
f 0
nc 1
nop 11
dl 0
loc 24
rs 9.7

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

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
}