Passed
Push — master ( cb24fc...339795 )
by Marcel
04:00 queued 12s
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
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
     * update report
142
     * @param $id
143
     * @param $name
144
     * @param $subheader
145
     * @param $parent
146
     * @param $link
147
     * @param $visualization
148
     * @param $chart
149
     * @param $chartoptions
150
     * @param $dataoptions
151
     * @param $dimension1
152
     * @param $dimension2
153
     * @param $value
154
     * @param $filteroptions
155
     * @return bool
156
     */
157
    public function update($id, $name, $subheader, $parent, $link, $visualization, $chart, $chartoptions, $dataoptions, $dimension1, $dimension2, $value, $filteroptions = null)
158
    {
159
        $name = $this->truncate($name, 64);
160
        $sql = $this->db->getQueryBuilder();
161
        $sql->update(self::TABLE_NAME)
162
            ->set('name', $sql->createNamedParameter($name))
163
            ->set('subheader', $sql->createNamedParameter($subheader))
164
            ->set('link', $sql->createNamedParameter($link))
165
            ->set('visualization', $sql->createNamedParameter($visualization))
166
            ->set('chart', $sql->createNamedParameter($chart))
167
            ->set('chartoptions', $sql->createNamedParameter($chartoptions))
168
            ->set('dataoptions', $sql->createNamedParameter($dataoptions))
169
            ->set('parent', $sql->createNamedParameter($parent))
170
            ->set('dimension1', $sql->createNamedParameter($dimension1))
171
            ->set('dimension2', $sql->createNamedParameter($dimension2))
172
            ->set('value', $sql->createNamedParameter($value))
173
            ->where($sql->expr()->eq('user_id', $sql->createNamedParameter($this->userId)))
174
            ->andWhere($sql->expr()->eq('id', $sql->createNamedParameter($id)));
175
        if ($filteroptions !== null) $sql->set('filteroptions', $sql->createNamedParameter($filteroptions));
176
        $sql->execute();
177
        return true;
178
    }
179
180
    /**
181
     * update report options
182
     * @param $id
183
     * @param $chartoptions
184
     * @param $dataoptions
185
     * @param $filteroptions
186
     * @return bool
187
     */
188
    public function updateOptions($id, $chartoptions, $dataoptions, $filteroptions)
189
    {
190
        $sql = $this->db->getQueryBuilder();
191
        $sql->update(self::TABLE_NAME)
192
            ->set('chartoptions', $sql->createNamedParameter($chartoptions))
193
            ->set('dataoptions', $sql->createNamedParameter($dataoptions))
194
            ->set('filteroptions', $sql->createNamedParameter($filteroptions))
195
            ->where($sql->expr()->eq('user_id', $sql->createNamedParameter($this->userId)))
196
            ->andWhere($sql->expr()->eq('id', $sql->createNamedParameter($id)));
197
        $sql->execute();
198
        return true;
199
    }
200
201
    /**
202
     * update report refresh interval
203
     * @param $id
204
     * @param $chartoptions
205
     * @param $dataoptions
206
     * @param $filteroptions
207
     * @return bool
208
     */
209
    public function updateRefresh($id, $refresh)
210
    {
211
        $sql = $this->db->getQueryBuilder();
212
        $sql->update(self::TABLE_NAME)
213
            ->set('refresh', $sql->createNamedParameter($refresh))
214
            ->where($sql->expr()->eq('user_id', $sql->createNamedParameter($this->userId)))
215
            ->andWhere($sql->expr()->eq('id', $sql->createNamedParameter($id)));
216
        $sql->execute();
217
        return true;
218
    }
219
220
    /**
221
     * update report group assignment (from drag & drop)
222
     * @param $id
223
     * @param $groupId
224
     * @return bool
225
     * @throws \OCP\DB\Exception
226
     */
227
    public function updateGroup($id, $groupId)
228
    {
229
        $sql = $this->db->getQueryBuilder();
230
        $sql->update(self::TABLE_NAME)
231
            ->set('parent', $sql->createNamedParameter($groupId))
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
     * read report options
240
     * @param $id
241
     * @return array
242
     */
243
    public function readOptions($id)
244
    {
245
        $sql = $this->db->getQueryBuilder();
246
        $sql->from(self::TABLE_NAME)
247
            ->select('name')
248
            ->addSelect('visualization')
249
            ->addSelect('chart')
250
            ->addSelect('user_id')
251
            ->where($sql->expr()->eq('id', $sql->createNamedParameter($id)));
252
        $statement = $sql->execute();
253
        $result = $statement->fetch();
254
        $statement->closeCursor();
255
        return $result;
256
    }
257
258
    /**
259
     * delete report
260
     * @param $id
261
     * @return bool
262
     */
263
    public function delete($id)
264
    {
265
        $sql = $this->db->getQueryBuilder();
266
        $sql->delete(self::TABLE_NAME)
267
            ->where($sql->expr()->eq('id', $sql->createNamedParameter($id)));
268
        $sql->execute();
269
        return true;
270
    }
271
272
    /**
273
     * search reports by searchstring
274
     * @param $searchString
275
     * @return array
276
     */
277
    public function search($searchString)
278
    {
279
        $sql = $this->db->getQueryBuilder();
280
        $sql->from(self::TABLE_NAME)
281
            ->select('id')
282
            ->addSelect('name')
283
            ->addSelect('type')
284
            ->where($sql->expr()->eq('user_id', $sql->createNamedParameter($this->userId)))
285
            ->andWhere($sql->expr()->iLike('name', $sql->createNamedParameter('%' . $this->db->escapeLikeParameter($searchString) . '%')))
286
            ->orderBy('name', 'ASC');
287
        $statement = $sql->execute();
288
        $result = $statement->fetchAll();
289
        $statement->closeCursor();
290
        return $result;
291
    }
292
293
    /**
294
     * get the report owner
295
     * @param $reportId
296
     * @return int
297
     */
298
    public function getOwner($reportId)
299
    {
300
        $sql = $this->db->getQueryBuilder();
301
        $sql->from(self::TABLE_NAME)
302
            ->select('user_id')
303
            ->where($sql->expr()->eq('id', $sql->createNamedParameter($reportId)));
304
        $result = (string)$sql->execute()->fetchOne();
305
        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...
306
    }
307
308
    /**
309
     * reports for a dataset
310
     * @param $datasetId
311
     * @return array
312
     * @throws \OCP\DB\Exception
313
     */
314
    public function reportsForDataset($datasetId)
315
    {
316
        $sql = $this->db->getQueryBuilder();
317
        $sql->from(self::TABLE_NAME)
318
            ->select('id')
319
            ->addSelect('name')
320
            ->addSelect('user_id')
321
            ->where($sql->expr()->eq('dataset', $sql->createNamedParameter($datasetId)));
322
        $statement = $sql->execute();
323
        $result = $statement->fetchAll();
324
        $statement->closeCursor();
325
        return $result;
326
    }
327
328
    /**
329
     * truncates fiels do DB-field size
330
     *
331
     * @param $string
332
     * @param $length
333
     * @param $dots
334
     * @return string
335
     */
336
    private function truncate($string, $length, $dots = "...")
337
    {
338
        return (strlen($string) > $length) ? mb_strcut($string, 0, $length - strlen($dots)) . $dots : $string;
339
    }
340
}