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

ReportMapper::update()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 21
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 19
c 1
b 0
f 0
nc 2
nop 13
dl 0
loc 21
rs 9.6333

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\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
}