Passed
Push — master ( fc42a6...b0746a )
by Marcel
02:44 queued 11s
created

DatasetMapper::indexByUser()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 8
nc 1
nop 1
dl 0
loc 10
rs 10
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\DB\Exception;
15
use OCP\IDBConnection;
16
use OCP\IL10N;
17
use Psr\Log\LoggerInterface;
18
19
class DatasetMapper
20
{
21
    private $l10n;
22
    private $userId;
23
    private $db;
24
    private $logger;
25
    const TABLE_NAME = 'analytics_dataset';
26
27
    public function __construct(
28
        $userId,
29
        IL10N $l10n,
30
        IDBConnection $db,
31
        LoggerInterface $logger
32
    )
33
    {
34
        $this->userId = $userId;
35
        $this->l10n = $l10n;
36
        $this->db = $db;
37
        $this->logger = $logger;
38
    }
39
40
    /**
41
     * get datasets
42
     * @return array
43
     * @throws Exception
44
     */
45
    public function index(): array
46
    {
47
        $sql = $this->db->getQueryBuilder();
48
        $sql->from(self::TABLE_NAME)
49
            ->select('id')
50
            ->addSelect('name')
51
            ->addSelect('dimension1')
52
            ->addSelect('dimension2')
53
            ->addSelect('value')
54
            ->where($sql->expr()->eq('user_id', $sql->createNamedParameter($this->userId)))
55
            ->andWhere($sql->expr()->eq('type', $sql->createNamedParameter('2')))
56
            ->addOrderBy('name', 'ASC');
57
        $statement = $sql->execute();
58
        $result = $statement->fetchAll();
59
        $statement->closeCursor();
60
        return $result;
61
    }
62
63
    /**
64
     * get datasets
65
     * @param $userId
66
     * @return array
67
     * @throws Exception
68
     */
69
    public function indexByUser($userId): array
70
    {
71
        $sql = $this->db->getQueryBuilder();
72
        $sql->from(self::TABLE_NAME)
73
            ->select('id')
74
            ->where($sql->expr()->eq('user_id', $sql->createNamedParameter($userId)));
75
        $statement = $sql->execute();
76
        $result = $statement->fetchAll();
77
        $statement->closeCursor();
78
        return $result;
79
    }
80
81
        /**
82
     * create dataset
83
     * @param $name
84
     * @param $dimension1
85
     * @param $dimension2
86
     * @param $value
87
     * @return int
88
     * @throws Exception
89
     */
90
    public function create($name, $dimension1, $dimension2, $value): int
91
    {
92
        $sql = $this->db->getQueryBuilder();
93
        $sql->insert(self::TABLE_NAME)
94
            ->values([
95
                'user_id' => $sql->createNamedParameter($this->userId),
96
                'name' => $sql->createNamedParameter($name),
97
                'dimension1' => $sql->createNamedParameter($dimension1),
98
                'dimension2' => $sql->createNamedParameter($dimension2),
99
                'value' => $sql->createNamedParameter($value),
100
                'type' => $sql->createNamedParameter('2'),
101
            ]);
102
        $sql->execute();
103
        return $sql->getLastInsertId();
104
    }
105
106
    /**
107
     * get single dataset
108
     * @param int $id
109
     * @return array|bool
110
     * @throws Exception
111
     */
112
    public function readOwn(int $id)
113
    {
114
        $sql = $this->db->getQueryBuilder();
115
        $sql->from(self::TABLE_NAME)
116
            ->select('*')
117
            ->where($sql->expr()->eq('id', $sql->createNamedParameter($id)))
118
            ->andWhere($sql->expr()->eq('user_id', $sql->createNamedParameter($this->userId)))
119
            ->orderBy('parent', 'ASC')
120
            ->addOrderBy('name', 'ASC');
121
        $statement = $sql->execute();
122
        $result = $statement->fetch();
123
        $statement->closeCursor();
124
        return $result;
125
    }
126
127
    /**
128
     * get single dataset
129
     * @param int $id
130
     * @return array|bool
131
     * @throws Exception
132
     */
133
    public function read(int $id)
134
    {
135
        $sql = $this->db->getQueryBuilder();
136
        $sql->from(self::TABLE_NAME)
137
            ->select('*')
138
            ->where($sql->expr()->eq('id', $sql->createNamedParameter($id)))
139
            ->orderBy('parent', 'ASC')
140
            ->addOrderBy('name', 'ASC');
141
        $statement = $sql->execute();
142
        $result = $statement->fetch();
143
        $statement->closeCursor();
144
        return $result;
145
    }
146
147
    /**
148
     * update dataset
149
     * @param $id
150
     * @param $name
151
     * @param $dimension1
152
     * @param $dimension2
153
     * @param $value
154
     * @return bool
155
     * @throws Exception
156
     */
157
    public function update($id, $name, $dimension1, $dimension2, $value): bool
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('dimension1', $sql->createNamedParameter($dimension1))
164
            ->set('dimension2', $sql->createNamedParameter($dimension2))
165
            ->set('value', $sql->createNamedParameter($value))
166
            ->where($sql->expr()->eq('user_id', $sql->createNamedParameter($this->userId)))
167
            ->andWhere($sql->expr()->eq('id', $sql->createNamedParameter($id)));
168
        $sql->execute();
169
        return true;
170
    }
171
172
    /**
173
     * delete dataset
174
     * @param $id
175
     * @return bool
176
     * @throws Exception
177
     */
178
    public function delete($id): bool
179
    {
180
        $sql = $this->db->getQueryBuilder();
181
        $sql->delete(self::TABLE_NAME)
182
            ->where($sql->expr()->eq('id', $sql->createNamedParameter($id)));
183
        $sql->execute();
184
        return true;
185
    }
186
187
    /**
188
     * get the newest timestamp of the data of a dataset
189
     * @param $datasetId
190
     * @return int
191
     * @throws Exception
192
     */
193
    public function getLastUpdate($datasetId): int
194
    {
195
        $sql = $this->db->getQueryBuilder();
196
        $sql->from('analytics_facts')
197
            ->select($sql->func()->max('timestamp'))
198
            ->where($sql->expr()->eq('dataset', $sql->createNamedParameter($datasetId)));
199
        return (int)$sql->execute()->fetchOne();
200
    }
201
202
    /**
203
     * get the report owner
204
     * @param $datasetId
205
     * @return string
206
     * @throws Exception
207
     */
208
    public function getOwner($datasetId): string
209
    {
210
        $sql = $this->db->getQueryBuilder();
211
        $sql->from(self::TABLE_NAME)
212
            ->select('user_id')
213
            ->where($sql->expr()->eq('id', $sql->createNamedParameter($datasetId)));
214
        return (string)$sql->execute()->fetchOne();
215
    }
216
217
    /**
218
     * truncates fields do DB-field size
219
     *
220
     * @param $string
221
     * @param int $length
222
     * @param string $dots
223
     * @return string
224
     */
225
    private function truncate($string, int $length, string $dots = "..."): string
226
    {
227
        return (strlen($string) > $length) ? mb_strcut($string, 0, $length - strlen($dots)) . $dots : $string;
228
    }
229
}