Passed
Push — master ( 7cb5a0...7ee6da )
by Marcel
03:06
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\ITagManager;
23
use Psr\Log\LoggerInterface;
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
    private $VariableService;
38
39
    public function __construct(
40
        $userId,
41
        LoggerInterface $logger,
42
        ITagManager $tagManager,
43
        ShareService $ShareService,
44
        StorageMapper $StorageMapper,
45
        DatasetMapper $DatasetMapper,
46
        ThresholdService $ThresholdService,
47
        DataloadMapper $DataloadMapper,
48
        ActivityManager $ActivityManager,
49
        IRootFolder $rootFolder,
50
        VariableService $VariableService
51
    )
52
    {
53
        $this->userId = $userId;
54
        $this->logger = $logger;
55
        $this->tagManager = $tagManager;
56
        $this->ShareService = $ShareService;
57
        $this->ThresholdService = $ThresholdService;
58
        $this->StorageMapper = $StorageMapper;
59
        $this->DatasetMapper = $DatasetMapper;
60
        $this->DataloadMapper = $DataloadMapper;
61
        $this->ActivityManager = $ActivityManager;
62
        $this->rootFolder = $rootFolder;
63
        $this->VariableService = $VariableService;
64
    }
65
66
    /**
67
     * get all datasets
68
     *
69
     * @return DataResponse
70
     */
71
    public function index()
72
    {
73
        $ownDatasets = $this->DatasetMapper->index();
74
75
        // get dataload indicators for icons shown in the advanced screen
76
        $dataloads = $this->DataloadMapper->getAllDataloadMetadata();
77
        foreach ($dataloads as $dataload) {
78
            $key = array_search($dataload['dataset'], array_column($ownDatasets, 'id'));
79
            if ($key !== '') {
80
                if ($dataload['schedules'] !== '' and $dataload['schedules'] !== null) {
81
                    $dataload['schedules'] = 1;
82
                } else {
83
                    $dataload['schedules'] = 0;
84
                }
85
                $ownDatasets[$key]['dataloads'] = $dataload['dataloads'];
86
                $ownDatasets[$key]['schedules'] = $dataload['schedules'];
87
            }
88
        }
89
90
        // get shared datasets and remove doublicates
91
        $sharedDatasets = $this->ShareService->getSharedDatasets();
92
        foreach ($sharedDatasets as $sharedDataset) {
93
            if (!array_search($sharedDataset['id'], array_column($ownDatasets, 'id'))) {
94
                $sharedDataset['type'] = '99';
95
                $sharedDataset['parrent'] = '0';
96
                array_push($ownDatasets, $sharedDataset);
97
            }
98
        }
99
100
        $favorites = $this->tagManager->load('analytics')->getFavorites();
101
        foreach ($ownDatasets as &$ownDataset) {
102
            $hasTag = 0;
103
            if (is_array($favorites) and in_array($ownDataset['id'], $favorites)) {
104
                $hasTag = 1;
105
            }
106
            $ownDataset['favorite'] = $hasTag;
107
            $ownDataset = $this->VariableService->replaceTextVariables($ownDataset);
108
        }
109
110
        return new DataResponse($ownDatasets);
111
    }
112
113
    /**
114
     * get own dataset details
115
     *
116
     * @param int $datasetId
117
     * @return array
118
     */
119
    public function read(int $datasetId)
120
    {
121
        $ownDataset = $this->DatasetMapper->read($datasetId);
122
        if (!empty($ownDataset)) {
123
            $ownDataset['permissions'] = \OCP\Constants::PERMISSION_UPDATE;
124
        }
125
        return $ownDataset;
126
    }
127
128
    /**
129
     * get own dataset details
130
     *
131
     * @param int $datasetId
132
     * @param string|null $user_id
133
     * @return array
134
     */
135
    public function getOwnDataset(int $datasetId, string $user_id = null)
136
    {
137
        $ownDataset = $this->DatasetMapper->read($datasetId, $user_id);
138
        if (!empty($ownDataset)) {
139
            $ownDataset['permissions'] = \OCP\Constants::PERMISSION_UPDATE;
140
            $ownDataset = $this->VariableService->replaceTextVariables($ownDataset);
141
        }
142
        return $ownDataset;
143
    }
144
145
    /**
146
     * get own datasets which are marked as favorites
147
     *
148
     * @return array|bool
149
     */
150
    public function getOwnFavoriteDatasets()
151
    {
152
        $ownDatasets = $this->DatasetMapper->index();
153
        $favorits = $this->tagManager->load('analytics')->getFavorites();
154
        $sharedDatasets = $this->ShareService->getSharedDatasets();
155
156
        foreach ($favorits as $favorite) {
157
            if (array_search($favorite, array_column($ownDatasets, 'id')) === false
158
                && array_search($favorite, array_column($sharedDatasets, 'id')) === false) {
159
                unset($favorits[$favorite]);
160
                $this->tagManager->load('analytics')->removeFromFavorites($favorite);
161
            }
162
        }
163
164
        return $favorits;
165
    }
166
167
    /**
168
     * create new dataset
169
     *
170
     * @param string $file
171
     * @return int
172
     */
173
    public function create($file = '')
174
    {
175
        $this->ActivityManager->triggerEvent(0, ActivityManager::OBJECT_DATASET, ActivityManager::SUBJECT_DATASET_ADD);
176
        $datasetId = $this->DatasetMapper->create();
177
178
        if ($file !== '') {
179
            $name = explode('.', end(explode('/', $file)))[0];
180
            $subheader = $file;
181
            $parent = 0;
182
            $type = DatasourceController::DATASET_TYPE_FILE;
183
            $link = $file;
184
            $visualization = 'table';
185
            $chart = 'line';
186
            $this->update($datasetId, $name, $subheader, $parent, $type, $link, $visualization, $chart, '', '');
187
        }
188
        return $datasetId;
189
    }
190
191
    /**
192
     * get dataset details
193
     *
194
     * @param int $datasetId
195
     * @param $name
196
     * @param $subheader
197
     * @param int $parent
198
     * @param int $type
199
     * @param $link
200
     * @param $visualization
201
     * @param $chart
202
     * @param $chartoptions
203
     * @param $dataoptions
204
     * @param $dimension1
205
     * @param $dimension2
206
     * @param $value
207
     * @return bool
208
     */
209
    public function update(int $datasetId, $name, $subheader, int $parent, int $type, $link, $visualization, $chart, $chartoptions, $dataoptions, $dimension1 = null, $dimension2 = null, $value = null)
210
    {
211
        if ($type === DatasourceController::DATASET_TYPE_GROUP) {
212
            $parent = 0;
213
        }
214
        return $this->DatasetMapper->update($datasetId, $name, $subheader, $parent, $type, $link, $visualization, $chart, $chartoptions, $dataoptions, $dimension1, $dimension2, $value);
215
    }
216
217
    /**
218
     * set/remove the favorite flag for a report
219
     *
220
     * @param int $datasetId
221
     * @param string $favorite
222
     * @return bool
223
     */
224
    public function setFavorite(int $datasetId, string $favorite)
225
    {
226
        if ($favorite === 'true') {
227
            $return = $this->tagManager->load('analytics')->addToFavorites($datasetId);
228
        } else {
229
            $return = $this->tagManager->load('analytics')->removeFromFavorites($datasetId);
230
        }
231
        return $return;
232
    }
233
234
    /**
235
     * Import Dataset from File
236
     *
237
     * @param string|null $path
238
     * @param string|null $raw
239
     * @return int
240
     * @throws \OCP\Files\NotFoundException
241
     * @throws \OCP\Files\NotPermittedException
242
     */
243
    public function import(string $path = null, string $raw = null)
244
    {
245
        if ($path !== '') {
246
            $file = $this->rootFolder->getUserFolder($this->userId)->get($path);
247
            $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

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