Passed
Push — master ( fc42a6...b0746a )
by Marcel
02:44 queued 11s
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 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
}