Passed
Push — master ( fc42a6...b0746a )
by Marcel
02:44 queued 11s
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 2021 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
     * read report options
222
     * @param $id
223
     * @return array
224
     */
225
    public function readOptions($id)
226
    {
227
        $sql = $this->db->getQueryBuilder();
228
        $sql->from(self::TABLE_NAME)
229
            ->select('name')
230
            ->addSelect('visualization')
231
            ->addSelect('chart')
232
            ->addSelect('user_id')
233
            ->where($sql->expr()->eq('id', $sql->createNamedParameter($id)));
234
        $statement = $sql->execute();
235
        $result = $statement->fetch();
236
        $statement->closeCursor();
237
        return $result;
238
    }
239
240
    /**
241
     * delete report
242
     * @param $id
243
     * @return bool
244
     */
245
    public function delete($id)
246
    {
247
        $sql = $this->db->getQueryBuilder();
248
        $sql->delete(self::TABLE_NAME)
249
            ->where($sql->expr()->eq('id', $sql->createNamedParameter($id)));
250
        $sql->execute();
251
        return true;
252
    }
253
254
    /**
255
     * search reports by searchstring
256
     * @param $searchString
257
     * @return array
258
     */
259
    public function search($searchString)
260
    {
261
        $sql = $this->db->getQueryBuilder();
262
        $sql->from(self::TABLE_NAME)
263
            ->select('id')
264
            ->addSelect('name')
265
            ->addSelect('type')
266
            ->where($sql->expr()->eq('user_id', $sql->createNamedParameter($this->userId)))
267
            ->andWhere($sql->expr()->iLike('name', $sql->createNamedParameter('%' . $this->db->escapeLikeParameter($searchString) . '%')))
268
            ->orderBy('name', 'ASC');
269
        $statement = $sql->execute();
270
        $result = $statement->fetchAll();
271
        $statement->closeCursor();
272
        return $result;
273
    }
274
275
    /**
276
     * get the report owner
277
     * @param $reportId
278
     * @return int
279
     */
280
    public function getOwner($reportId)
281
    {
282
        $sql = $this->db->getQueryBuilder();
283
        $sql->from(self::TABLE_NAME)
284
            ->select('user_id')
285
            ->where($sql->expr()->eq('id', $sql->createNamedParameter($reportId)));
286
        $result = (string)$sql->execute()->fetchOne();
287
        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...
288
    }
289
290
    /**
291
     * reports for a dataset
292
     * @param $datasetId
293
     * @return array
294
     * @throws \OCP\DB\Exception
295
     */
296
    public function reportsForDataset($datasetId)
297
    {
298
        $sql = $this->db->getQueryBuilder();
299
        $sql->from(self::TABLE_NAME)
300
            ->select('id')
301
            ->addSelect('name')
302
            ->addSelect('user_id')
303
            ->where($sql->expr()->eq('dataset', $sql->createNamedParameter($datasetId)));
304
        $statement = $sql->execute();
305
        $result = $statement->fetchAll();
306
        $statement->closeCursor();
307
        return $result;
308
    }
309
310
    /**
311
     * truncates fiels do DB-field size
312
     *
313
     * @param $string
314
     * @param $length
315
     * @param $dots
316
     * @return string
317
     */
318
    private function truncate($string, $length, $dots = "...")
319
    {
320
        return (strlen($string) > $length) ? mb_strcut($string, 0, $length - strlen($dots)) . $dots : $string;
321
    }
322
}