Passed
Push — master ( 6af222...b64086 )
by Marcel
06:06 queued 02:54
created

DatasetService::update()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 2
eloc 3
c 2
b 0
f 0
nc 2
nop 13
dl 0
loc 6
rs 10

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\Service;
13
14
use OCA\Analytics\Activity\ActivityManager;
15
use OCA\Analytics\Controller\DatasourceController;
16
use OCA\Analytics\Db\DataloadMapper;
17
use OCA\Analytics\Db\DatasetMapper;
18
use OCA\Analytics\Db\StorageMapper;
19
use OCP\AppFramework\Http\DataDownloadResponse;
20
use OCP\AppFramework\Http\DataResponse;
21
use OCP\Files\IRootFolder;
22
use OCP\ILogger;
23
use OCP\ITagManager;
24
25
class DatasetService
26
{
27
    private $userId;
28
    private $logger;
29
    private $tagManager;
30
    private $ShareService;
31
    private $StorageMapper;
32
    private $DatasetMapper;
33
    private $ThresholdService;
34
    private $DataloadMapper;
35
    private $ActivityManager;
36
    private $rootFolder;
37
38
    public function __construct(
39
        $userId,
40
        ILogger $logger,
41
        ITagManager $tagManager,
42
        ShareService $ShareService,
43
        StorageMapper $StorageMapper,
44
        DatasetMapper $DatasetMapper,
45
        ThresholdService $ThresholdService,
46
        DataloadMapper $DataloadMapper,
47
        ActivityManager $ActivityManager,
48
        IRootFolder $rootFolder
49
    )
50
    {
51
        $this->userId = $userId;
52
        $this->logger = $logger;
53
        $this->tagManager = $tagManager;
54
        $this->ShareService = $ShareService;
55
        $this->ThresholdService = $ThresholdService;
56
        $this->StorageMapper = $StorageMapper;
57
        $this->DatasetMapper = $DatasetMapper;
58
        $this->DataloadMapper = $DataloadMapper;
59
        $this->ActivityManager = $ActivityManager;
60
        $this->rootFolder = $rootFolder;
61
    }
62
63
    /**
64
     * get all datasets
65
     *
66
     * @return DataResponse
67
     */
68
    public function index()
69
    {
70
        $ownDatasets = $this->DatasetMapper->index();
71
72
        // get dataload indicators for icons shown in the advanced screen
73
        $dataloads = $this->DataloadMapper->getAllDataloadMetadata();
74
        foreach ($dataloads as $dataload) {
75
            $key = array_search($dataload['dataset'], array_column($ownDatasets, 'id'));
76
            if ($key !== '') {
77
                if ($dataload['schedules'] !== '' and $dataload['schedules'] !== null) {
78
                    $dataload['schedules'] = 1;
79
                } else {
80
                    $dataload['schedules'] = 0;
81
                }
82
                $ownDatasets[$key]['dataloads'] = $dataload['dataloads'];
83
                $ownDatasets[$key]['schedules'] = $dataload['schedules'];
84
            }
85
        }
86
87
        // get shared datasets and remove doublicates
88
        $sharedDatasets = $this->ShareService->getSharedDatasets();
89
        foreach ($sharedDatasets as $sharedDataset) {
90
            if (!array_search($sharedDataset['id'], array_column($ownDatasets, 'id'))) {
91
                $sharedDataset['type'] = '99';
92
                $sharedDataset['parrent'] = '0';
93
                array_push($ownDatasets, $sharedDataset);
94
            }
95
        }
96
97
        $favorites = $this->tagManager->load('analytics')->getFavorites();
98
        foreach ($ownDatasets as &$ownDataset) {
99
            $hasTag = 0;
100
            if (is_array($favorites) and in_array($ownDataset['id'], $favorites)) {
101
                $hasTag = 1;
102
            }
103
            $ownDataset['favorite'] = $hasTag;
104
        }
105
106
        return new DataResponse($ownDatasets);
107
    }
108
109
    /**
110
     * get own dataset details
111
     *
112
     * @param int $datasetId
113
     * @return array
114
     */
115
    public function read(int $datasetId)
116
    {
117
        return $this->getOwnDataset($datasetId);
118
    }
119
120
    /**
121
     * get own dataset details
122
     *
123
     * @param int $datasetId
124
     * @param string|null $user_id
125
     * @return array
126
     */
127
    public function getOwnDataset(int $datasetId, string $user_id = null)
128
    {
129
        // default permission UPDATE only for internal reports; all others can not change filters
130
        $ownDataset = $this->DatasetMapper->read($datasetId, $user_id);
131
        if (!empty($ownDataset) && (int)$ownDataset['type'] === DatasourceController::DATASET_TYPE_INTERNAL_DB) {
132
            $ownDataset['permissions'] = \OCP\Constants::PERMISSION_UPDATE;
133
        } elseif (!empty($ownDataset)) {
134
            $ownDataset['permissions'] = \OCP\Constants::PERMISSION_READ;
135
        }
136
        return $ownDataset;
137
    }
138
139
    /**
140
     * get own datasets which are marked as favorites
141
     *
142
     * @return array|bool
143
     */
144
    public function getOwnFavoriteDatasets()
145
    {
146
        $ownDatasets = $this->DatasetMapper->index();
147
        $favorits = $this->tagManager->load('analytics')->getFavorites();
148
        $sharedDatasets = $this->ShareService->getSharedDatasets();
149
150
        foreach ($favorits as $favorite) {
151
            if (!array_search($favorite, array_column($ownDatasets, 'id'))
152
                && !array_search($favorite, array_column($sharedDatasets, 'id'))) {
153
                unset($favorits[$favorite]);
154
                $this->tagManager->load('analytics')->removeFromFavorites($favorite);
155
            }
156
        }
157
158
        return $favorits;
159
    }
160
161
    /**
162
     * create new dataset
163
     *
164
     * @param string $file
165
     * @return int
166
     */
167
    public function create($file = '')
168
    {
169
        $this->ActivityManager->triggerEvent(0, ActivityManager::OBJECT_DATASET, ActivityManager::SUBJECT_DATASET_ADD);
170
        $datasetId = $this->DatasetMapper->create();
171
172
        if ($file !== '') {
173
            $name = explode('.', end(explode('/', $file)))[0];
174
            $subheader = $file;
175
            $parent = 0;
176
            $type = DatasourceController::DATASET_TYPE_INTERNAL_FILE;
177
            $link = $file;
178
            $visualization = 'table';
179
            $chart = 'line';
180
            $this->update($datasetId, $name, $subheader, $parent, $type, $link, $visualization, $chart, '', '');
181
        }
182
        return $datasetId;
183
    }
184
185
    /**
186
     * get dataset details
187
     *
188
     * @param int $datasetId
189
     * @param $name
190
     * @param $subheader
191
     * @param int $parent
192
     * @param int $type
193
     * @param $link
194
     * @param $visualization
195
     * @param $chart
196
     * @param $chartoptions
197
     * @param $dataoptions
198
     * @param $dimension1
199
     * @param $dimension2
200
     * @param $value
201
     * @return bool
202
     */
203
    public function update(int $datasetId, $name, $subheader, int $parent, int $type, $link, $visualization, $chart, $chartoptions, $dataoptions, $dimension1 = null, $dimension2 = null, $value = null)
204
    {
205
        if ($type === DatasourceController::DATASET_TYPE_GROUP) {
206
            $parent = 0;
207
        }
208
        return $this->DatasetMapper->update($datasetId, $name, $subheader, $parent, $type, $link, $visualization, $chart, $chartoptions, $dataoptions, $dimension1, $dimension2, $value);
209
    }
210
211
    /**
212
     * set/remove the favorite flag for a report
213
     *
214
     * @param int $datasetId
215
     * @param string $favorite
216
     * @return bool
217
     */
218
    public function setFavorite(int $datasetId, string $favorite)
219
    {
220
        if ($favorite === 'true') {
221
            $return = $this->tagManager->load('analytics')->addToFavorites($datasetId);
222
        } else {
223
            $return = $this->tagManager->load('analytics')->removeFromFavorites($datasetId);
224
        }
225
        return $return;
226
    }
227
228
    /**
229
     * Import Dataset from File
230
     *
231
     * @param string|null $path
232
     * @param string|null $raw
233
     * @return int
234
     * @throws \OCP\Files\NotFoundException
235
     * @throws \OCP\Files\NotPermittedException
236
     */
237
    public function import(string $path = null, string $raw = null)
238
    {
239
        if ($path !== '') {
240
            $file = $this->rootFolder->getUserFolder($this->userId)->get($path);
241
            $data = $file->getContent();
0 ignored issues
show
Bug introduced by
The method getContent() does not exist on OCP\Files\Node. It seems like you code against a sub-type of OCP\Files\Node such as OCP\Files\File. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

241
            /** @scrutinizer ignore-call */ 
242
            $data = $file->getContent();
Loading history...
242
        } else if ($raw !== null) {
243
            $data = $raw;
244
        } else {
245
            return false;
0 ignored issues
show
Bug Best Practice introduced by
The expression return false returns the type false which is incompatible with the documented return type integer.
Loading history...
246
        }
247
        $data = json_decode($data, true);
248
249
        $dataset = $data['dataset'];
250
        isset($dataset['name']) ? $name = $dataset['name'] : $name = '';
251
        isset($dataset['subheader']) ? $subheader = $dataset['subheader'] : $subheader = '';
252
        $parent = 0;
253
        isset($dataset['type']) ? $type = $dataset['type'] : $type = null;
254
        isset($dataset['link']) ? $link = $dataset['link'] : $link = null;
255
        isset($dataset['visualization']) ? $visualization = $dataset['visualization'] : $visualization = null;
256
        isset($dataset['chart']) ? $chart = $dataset['chart'] : $chart = null;
257
        isset($dataset['chartoptions']) ? $chartoptions = $dataset['chartoptions'] : $chartoptions = null;
258
        isset($dataset['dataoptions']) ? $dataoptions = $dataset['dataoptions'] : $dataoptions = null;
259
        isset($dataset['filteroptions']) ? $filteroptions = $dataset['filteroptions'] : $filteroptions = null;
260
        isset($dataset['dimension1']) ? $dimension1 = $dataset['dimension1'] : $dimension1 = null;
261
        isset($dataset['dimension2']) ? $dimension2 = $dataset['dimension2'] : $dimension2 = null;
262
        isset($dataset['value']) ? $value = $dataset['value'] : $value = null;
263
264
        $datasetId = $this->DatasetMapper->create();
265
        $this->DatasetMapper->update($datasetId, $name, $subheader, $parent, $type, $link, $visualization, $chart, $chartoptions, $dataoptions, $dimension1, $dimension2, $value, $filteroptions);
266
267
        foreach ($data['dataload'] as $dataload) {
268
            isset($dataload['datasource']) ? $datasource = $dataload['datasource'] : $datasource = null;
269
            isset($dataload['name']) ? $name = $dataload['name'] : $name = null;
270
            isset($dataload['option']) ? $option = $dataload['option'] : $option = null;
271
            $schedule = null;
272
273
            $dataloadId = $this->DataloadMapper->create($datasetId, $datasource);
274
            $this->DataloadMapper->update($dataloadId, $name, $option, $schedule);
275
        }
276
277
        foreach ($data['threshold'] as $threshold) {
278
            isset($threshold['dimension1']) ? $dimension1 = $threshold['dimension1'] : $dimension1 = null;
279
            isset($threshold['value']) ? $value = $threshold['value'] : $value = null;
280
            isset($threshold['option']) ? $option = $threshold['option'] : $option = null;
281
            isset($threshold['severity']) ? $severity = $threshold['severity'] : $severity = null;
282
            $this->ThresholdService->create($datasetId, $dimension1, $option, $value, $severity);
283
        }
284
285
        foreach ($data['data'] as $dData) {
286
            isset($dData[0]) ? $dimension1 = $dData[0] : $dimension1 = null;
287
            isset($dData[1]) ? $dimension2 = $dData[1] : $dimension2 = null;
288
            isset($dData[2]) ? $value = $dData[2] : $value = null;
289
            $this->StorageMapper->create($datasetId, $dimension1, $dimension2, $value);
290
        }
291
292
        if (isset($data['favorite'])) {
293
            $this->setFavorite($datasetId, $data['favorite']);
294
        }
295
296
        return $datasetId;
297
    }
298
299
    /**
300
     * Export Dataset
301
     *
302
     * @param int $datasetId
303
     * @return DataDownloadResponse
304
     */
305
    public function export(int $datasetId)
306
    {
307
        $result = array();
308
        $result['dataset'] = $this->DatasetMapper->read($datasetId);
309
        $result['dataload'] = $this->DataloadMapper->read($datasetId);
310
        $result['threshold'] = $this->ThresholdService->read($datasetId);
311
        $result['favorite'] = '';
312
313
        if ($result['dataset']['type'] === DatasourceController::DATASET_TYPE_INTERNAL_DB) {
314
            $result['data'] = $this->StorageMapper->read($datasetId);
315
        }
316
317
        unset($result['dataset']['id'], $result['dataset']['user_id'], $result['dataset']['user_id'], $result['dataset']['parent']);
318
        $data = json_encode($result);
319
        return new DataDownloadResponse($data, $result['dataset']['name'] . '.export.txt', 'text/plain; charset=utf-8');
320
    }
321
322
    /**
323
     * Delete Dataset and all depending objects
324
     *
325
     * @param int $datasetId
326
     * @return bool
327
     */
328
    public function delete(int $datasetId)
329
    {
330
        $this->ShareService->deleteShareByDataset($datasetId);
331
        $this->StorageMapper->deleteByDataset($datasetId);
332
        $this->DatasetMapper->delete($datasetId);
333
        $this->ThresholdService->deleteThresholdByDataset($datasetId);
334
        $this->DataloadMapper->deleteDataloadByDataset($datasetId);
335
        $this->ActivityManager->triggerEvent(0, ActivityManager::OBJECT_DATASET, ActivityManager::SUBJECT_DATASET_DELETE);
336
        $this->setFavorite($datasetId, 'false');
337
        return true;
338
    }
339
340
    /**
341
     * get dataset details
342
     *
343
     * @param int $datasetId
344
     * @param $chartoptions
345
     * @param $dataoptions
346
     * @param $filteroptions
347
     * @return bool
348
     */
349
    public function updateOptions(int $datasetId, $chartoptions, $dataoptions, $filteroptions)
350
    {
351
        return $this->DatasetMapper->updateOptions($datasetId, $chartoptions, $dataoptions, $filteroptions);
352
    }
353
354
    /**
355
     * search for datasets
356
     *
357
     * @param string $searchString
358
     * @return array
359
     */
360
    public function search(string $searchString)
361
    {
362
        return $this->DatasetMapper->search($searchString);
363
    }
364
365
}