Passed
Push — master ( 9179ab...b51dc7 )
by Marcel
02:24
created

DatasetMapper::getLastUpdate()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 5
c 0
b 0
f 0
nc 1
nop 1
dl 0
loc 7
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\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
     * create dataset
65
     * @param $name
66
     * @param $dimension1
67
     * @param $dimension2
68
     * @param $value
69
     * @return int
70
     * @throws Exception
71
     */
72
    public function create($name, $dimension1, $dimension2, $value): int
73
    {
74
        $sql = $this->db->getQueryBuilder();
75
        $sql->insert(self::TABLE_NAME)
76
            ->values([
77
                'user_id' => $sql->createNamedParameter($this->userId),
78
                'name' => $sql->createNamedParameter($name),
79
                'dimension1' => $sql->createNamedParameter($dimension1),
80
                'dimension2' => $sql->createNamedParameter($dimension2),
81
                'value' => $sql->createNamedParameter($value),
82
                'type' => $sql->createNamedParameter('2'),
83
            ]);
84
        $sql->execute();
85
        return $sql->getLastInsertId();
86
    }
87
88
    /**
89
     * get single dataset
90
     * @param int $id
91
     * @return array|bool
92
     * @throws Exception
93
     */
94
    public function readOwn(int $id)
95
    {
96
        $sql = $this->db->getQueryBuilder();
97
        $sql->from(self::TABLE_NAME)
98
            ->select('*')
99
            ->where($sql->expr()->eq('id', $sql->createNamedParameter($id)))
100
            ->andWhere($sql->expr()->eq('user_id', $sql->createNamedParameter($this->userId)))
101
            ->orderBy('parent', 'ASC')
102
            ->addOrderBy('name', 'ASC');
103
        $statement = $sql->execute();
104
        $result = $statement->fetch();
105
        $statement->closeCursor();
106
        return $result;
107
    }
108
109
    /**
110
     * get single dataset
111
     * @param int $id
112
     * @return array|bool
113
     * @throws Exception
114
     */
115
    public function read(int $id)
116
    {
117
        $sql = $this->db->getQueryBuilder();
118
        $sql->from(self::TABLE_NAME)
119
            ->select('*')
120
            ->where($sql->expr()->eq('id', $sql->createNamedParameter($id)))
121
            ->orderBy('parent', 'ASC')
122
            ->addOrderBy('name', 'ASC');
123
        $statement = $sql->execute();
124
        $result = $statement->fetch();
125
        $statement->closeCursor();
126
        return $result;
127
    }
128
129
    /**
130
     * update dataset
131
     * @param $id
132
     * @param $name
133
     * @param $dimension1
134
     * @param $dimension2
135
     * @param $value
136
     * @return bool
137
     * @throws Exception
138
     */
139
    public function update($id, $name, $dimension1, $dimension2, $value): bool
140
    {
141
        $name = $this->truncate($name, 64);
142
        $sql = $this->db->getQueryBuilder();
143
        $sql->update(self::TABLE_NAME)
144
            ->set('name', $sql->createNamedParameter($name))
145
            ->set('dimension1', $sql->createNamedParameter($dimension1))
146
            ->set('dimension2', $sql->createNamedParameter($dimension2))
147
            ->set('value', $sql->createNamedParameter($value))
148
            ->where($sql->expr()->eq('user_id', $sql->createNamedParameter($this->userId)))
149
            ->andWhere($sql->expr()->eq('id', $sql->createNamedParameter($id)));
150
        $sql->execute();
151
        return true;
152
    }
153
154
    /**
155
     * delete dataset
156
     * @param $id
157
     * @return bool
158
     * @throws Exception
159
     */
160
    public function delete($id): bool
161
    {
162
        $sql = $this->db->getQueryBuilder();
163
        $sql->delete(self::TABLE_NAME)
164
            ->where($sql->expr()->eq('user_id', $sql->createNamedParameter($this->userId)))
165
            ->andWhere($sql->expr()->eq('id', $sql->createNamedParameter($id)));
166
        $sql->execute();
167
        return true;
168
    }
169
170
    /**
171
     * get the newest timestamp of the data of a dataset
172
     * @param $datasetId
173
     * @return int
174
     * @throws Exception
175
     */
176
    public function getLastUpdate($datasetId): int
177
    {
178
        $sql = $this->db->getQueryBuilder();
179
        $sql->from('analytics_facts')
180
            ->select($sql->func()->max('timestamp'))
181
            ->where($sql->expr()->eq('dataset', $sql->createNamedParameter($datasetId)));
182
        return (int)$sql->execute()->fetchOne();
183
    }
184
185
    /**
186
     * get the report owner
187
     * @param $datasetId
188
     * @return string
189
     * @throws Exception
190
     */
191
    public function getOwner($datasetId): string
192
    {
193
        $sql = $this->db->getQueryBuilder();
194
        $sql->from(self::TABLE_NAME)
195
            ->select('user_id')
196
            ->where($sql->expr()->eq('id', $sql->createNamedParameter($datasetId)));
197
        return (string)$sql->execute()->fetchOne();
198
    }
199
200
    /**
201
     * truncates fields do DB-field size
202
     *
203
     * @param $string
204
     * @param int $length
205
     * @param string $dots
206
     * @return string
207
     */
208
    private function truncate($string, int $length, string $dots = "..."): string
209
    {
210
        return (strlen($string) > $length) ? mb_strcut($string, 0, $length - strlen($dots)) . $dots : $string;
211
    }
212
}