Passed
Push — master ( 7cb5a0...7ee6da )
by Marcel
03:06
created

DatasetService::updateOptions()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 1
c 1
b 0
f 0
nc 1
nop 4
dl 0
loc 3
rs 10
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
}