Completed
Pull Request — master (#8)
by Joas
78:41 queued 76:37
created

Manager   A

Complexity

Total Complexity 20

Size/Duplication

Total Lines 194
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 0

Test Coverage

Coverage 3.57%

Importance

Changes 11
Bugs 1 Features 3
Metric Value
wmc 20
c 11
b 1
f 3
lcom 1
cbo 0
dl 0
loc 194
ccs 4
cts 112
cp 0.0357
rs 10

8 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
B announce() 0 57 6
A addGroupLink() 0 9 1
A delete() 0 11 1
B getAnnouncement() 0 22 4
B getAnnouncements() 0 29 5
A parseMessage() 0 3 1
A parseSubject() 0 3 1
1
<?php
2
/**
3
 * @author Joas Schilling <[email protected]>
4
 *
5
 * @copyright Copyright (c) 2016, Joas Schilling <[email protected]>
6
 * @license AGPL-3.0
7
 *
8
 * This code is free software: you can redistribute it and/or modify
9
 * it under the terms of the GNU Affero General Public License, version 3,
10
 * as published by the Free Software Foundation.
11
 *
12
 * This program is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15
 * GNU Affero General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU Affero General Public License, version 3,
18
 * along with this program.  If not, see <http://www.gnu.org/licenses/>
19
 *
20
 */
21
22
namespace OCA\AnnouncementCenter;
23
24
use OCP\DB\QueryBuilder\IQueryBuilder;
25
use OCP\IDBConnection;
26
use OCP\IGroupManager;
27
28
class Manager {
29
30
	/** @var IDBConnection */
31
	private $connection;
32
33
	/** @var IGroupManager */
34
	private $groupManager;
35
36
	/**
37
	 * @param IDBConnection $connection
38
	 * @param IGroupManager $groupManager
39
	 */
40 3
	public function __construct(IDBConnection $connection, IGroupManager $groupManager) {
41 3
		$this->connection = $connection;
42 3
		$this->groupManager = $groupManager;
43 3
	}
44
45
	/**
46
	 * @param string $subject
47
	 * @param string $message
48
	 * @param string $user
49
	 * @param int $time
50
	 * @param string[] $groups
51
	 * @return array
52
	 * @throws \InvalidArgumentException when the subject is empty or invalid
53
	 */
54
	public function announce($subject, $message, $user, $time, array $groups) {
55
		$subject = trim($subject);
56
		$message = trim($message);
57
		if (isset($subject[512])) {
58
			throw new \InvalidArgumentException('Invalid subject', 1);
59
		}
60
61
		if ($subject === '') {
62
			throw new \InvalidArgumentException('Invalid subject', 2);
63
		}
64
65
		$queryBuilder = $this->connection->getQueryBuilder();
66
		$queryBuilder->insert('announcements')
67
			->values([
68
				'announcement_time' => $queryBuilder->createParameter('time'),
69
				'announcement_user' => $queryBuilder->createParameter('user'),
70
				'announcement_subject' => $queryBuilder->createParameter('subject'),
71
				'announcement_message' => $queryBuilder->createParameter('message'),
72
			])
73
			->setParameter('time', $time)
74
			->setParameter('user', $user)
75
			->setParameter('subject', $subject)
76
			->setParameter('message', $message);
77
		$queryBuilder->execute();
78
79
		$queryBuilder = $this->connection->getQueryBuilder();
80
		$query = $queryBuilder->select('*')
81
			->from('announcements')
82
			->where($queryBuilder->expr()->eq('announcement_time', $queryBuilder->createParameter('time')))
83
			->andWhere($queryBuilder->expr()->eq('announcement_user', $queryBuilder->createParameter('user')))
84
			->orderBy('announcement_id', 'DESC')
85
			->setParameter('time', (int) $time)
86
			->setParameter('user', $user);
87
		$result = $query->execute();
88
		$row = $result->fetch();
89
		$result->closeCursor();
90
91
		$addedGroups = 0;
92
		foreach ($groups as $group) {
93
			if ($this->groupManager->groupExists($group)) {
94
				$this->addGroupLink((int) $row['announcement_id'], $group);
95
				$addedGroups++;
96
			}
97
		}
98
99
		if ($addedGroups === 0) {
100
			$this->addGroupLink((int) $row['announcement_id'], 'everyone');
101
		}
102
103
		return [
104
			'id'		=> (int) $row['announcement_id'],
105
			'author'	=> $row['announcement_user'],
106
			'time'		=> (int) $row['announcement_time'],
107
			'subject'	=> $this->parseSubject($row['announcement_subject']),
108
			'message'	=> $this->parseMessage($row['announcement_message']),
109
		];
110
	}
111
112
	/**
113
	 * @param int $announcementId
114
	 * @param string $group
115
	 */
116
	protected function addGroupLink($announcementId, $group) {
117
		$query = $this->connection->getQueryBuilder();
118
		$query->insert('announcements_groups')
119
			->values([
120
				'announcement_id' => $query->createNamedParameter($announcementId),
121
				'gid' => $query->createNamedParameter($group),
122
			]);
123
		$query->execute();
124
	}
125
126
	/**
127
	 * @param int $id
128
	 */
129
	public function delete($id) {
130
		$query = $this->connection->getQueryBuilder();
131
		$query->delete('announcements')
132
			->where($query->expr()->eq('announcement_id', $query->createNamedParameter((int) $id)));
133
		$query->execute();
134
135
		$query = $this->connection->getQueryBuilder();
136
		$query->delete('announcements_groups')
137
			->where($query->expr()->eq('announcement_id', $query->createNamedParameter((int) $id)));
138
		$query->execute();
139
	}
140
141
	/**
142
	 * @param int $id
143
	 * @param bool $parseStrings
144
	 * @return array
145
	 * @throws \InvalidArgumentException when the id is invalid
146
	 */
147
	public function getAnnouncement($id, $parseStrings = true) {
148
		$queryBuilder = $this->connection->getQueryBuilder();
149
		$query = $queryBuilder->select('*')
150
			->from('announcements')
151
			->where($queryBuilder->expr()->eq('announcement_id', $queryBuilder->createParameter('id')))
152
			->setParameter('id', (int) $id);
153
		$result = $query->execute();
154
		$row = $result->fetch();
155
		$result->closeCursor();
156
157
		if ($row === false) {
158
			throw new \InvalidArgumentException('Invalid ID');
159
		}
160
161
		return [
162
			'id'		=> (int) $row['announcement_id'],
163
			'author'	=> $row['announcement_user'],
164
			'time'		=> (int) $row['announcement_time'],
165
			'subject'	=> ($parseStrings) ? $this->parseSubject($row['announcement_subject']) : $row['announcement_subject'],
166
			'message'	=> ($parseStrings) ? $this->parseMessage($row['announcement_message']) : $row['announcement_message'],
167
		];
168
	}
169
170
	/**
171
	 * @param int $limit
172
	 * @param int $offset
173
	 * @param bool $parseStrings
174
	 * @return array
175
	 */
176
	public function getAnnouncements($limit = 15, $offset = 0, $parseStrings = true) {
177
		$queryBuilder = $this->connection->getQueryBuilder();
178
		$query = $queryBuilder->select('*')
179
			->from('announcements')
180
			->orderBy('announcement_time', 'DESC')
181
			->setMaxResults($limit);
182
183
		if ($offset > 0) {
184
			$query->where($query->expr()->lt('announcement_id', $query->createNamedParameter($offset, IQueryBuilder::PARAM_INT)));
185
		}
186
187
		$result = $query->execute();
188
189
190
		$announcements = [];
191
		while ($row = $result->fetch()) {
192
			$announcements[] = [
193
				'id'		=> (int) $row['announcement_id'],
194
				'author'	=> $row['announcement_user'],
195
				'time'		=> (int) $row['announcement_time'],
196
				'subject'	=> ($parseStrings) ? $this->parseSubject($row['announcement_subject']) : $row['announcement_subject'],
197
				'message'	=> ($parseStrings) ? $this->parseMessage($row['announcement_message']) : $row['announcement_message'],
198
			];
199
		}
200
		$result->closeCursor();
201
202
203
		return $announcements;
204
	}
205
206
	/**
207
	 * @param string $message
208
	 * @return string
209
	 */
210
	protected function parseMessage($message) {
211
		return str_replace("\n", '<br />', str_replace(['<', '>'], ['&lt;', '&gt;'], $message));
212
	}
213
214
	/**
215
	 * @param string $subject
216
	 * @return string
217
	 */
218
	protected function parseSubject($subject) {
219
		return str_replace("\n", ' ', str_replace(['<', '>'], ['&lt;', '&gt;'], $subject));
220
	}
221
}
222