Completed
Push — master ( f6e372...4f54c4 )
by Julius
13s
created

FullTextSearchService::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 10
rs 9.9332
c 0
b 0
f 0
cc 1
nc 1
nop 4
1
<?php
2
declare(strict_types=1);
3
4
5
/**
6
 * This file is licensed under the Affero General Public License version 3 or
7
 * later. See the COPYING file.
8
 *
9
 * @author Maxence Lange <[email protected]>
10
 * @copyright 2019
11
 * @license GNU AGPL version 3 or any later version
12
 *
13
 * This program is free software: you can redistribute it and/or modify
14
 * it under the terms of the GNU Affero General Public License as
15
 * published by the Free Software Foundation, either version 3 of the
16
 * License, or (at your option) any later version.
17
 *
18
 * This program is distributed in the hope that it will be useful,
19
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21
 * GNU Affero General Public License for more details.
22
 *
23
 * You should have received a copy of the GNU Affero General Public License
24
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
25
 *
26
 */
27
28
29
namespace OCA\Deck\Service;
30
31
32
use OC\FullTextSearch\Model\DocumentAccess;
33
use OC\FullTextSearch\Model\IndexDocument;
34
use OCA\Deck\Db\Board;
35
use OCA\Deck\Db\BoardMapper;
36
use OCA\Deck\Db\Card;
37
use OCA\Deck\Db\CardMapper;
38
use OCA\Deck\Db\Stack;
39
use OCA\Deck\Db\StackMapper;
40
use OCA\Deck\Provider\DeckProvider;
41
use OCP\AppFramework\Db\DoesNotExistException;
42
use OCP\AppFramework\Db\MultipleObjectsReturnedException;
43
use OCP\FullTextSearch\IFullTextSearchManager;
44
use OCP\FullTextSearch\Model\IDocumentAccess;
45
use OCP\FullTextSearch\Model\IIndex;
46
use OCP\FullTextSearch\Model\IIndexDocument;
47
use Symfony\Component\EventDispatcher\GenericEvent;
48
49
50
/**
51
 * Class FullTextSearchService
52
 *
53
 * @package OCA\Deck\Service
54
 */
55
class FullTextSearchService {
56
57
58
	/** @var BoardMapper */
59
	private $boardMapper;
60
61
	/** @var StackMapper */
62
	private $stackMapper;
63
64
	/** @var CardMapper */
65
	private $cardMapper;
66
67
	/** @var IFullTextSearchManager */
68
	private $fullTextSearchManager;
69
70
71
	/**
72
	 * FullTextSearchService constructor.
73
	 *
74
	 * @param BoardMapper $boardMapper
75
	 * @param StackMapper $stackMapper
76
	 * @param CardMapper $cardMapper
77
	 * @param IFullTextSearchManager $fullTextSearchManager
78
	 */
79
	public function __construct(
80
		BoardMapper $boardMapper, StackMapper $stackMapper, CardMapper $cardMapper,
81
		IFullTextSearchManager $fullTextSearchManager
82
	) {
83
		$this->boardMapper = $boardMapper;
84
		$this->stackMapper = $stackMapper;
85
		$this->cardMapper = $cardMapper;
86
87
		$this->fullTextSearchManager = $fullTextSearchManager;
88
	}
89
90
91
	/**
92
	 * @param GenericEvent $e
93
	 */
94
	public function onCardCreated(GenericEvent $e) {
95
		$cardId = $e->getArgument('id');
96
		$userId = $e->getArgument('userId');
97
98
		$this->fullTextSearchManager->createIndex(
99
			DeckProvider::DECK_PROVIDER_ID, (string)$cardId, $userId, IIndex::INDEX_FULL
100
		);
101
	}
102
103
104
	/**
105
	 * @param GenericEvent $e
106
	 */
107
	public function onCardUpdated(GenericEvent $e) {
108
		$cardId = $e->getArgument('id');
109
110
		$this->fullTextSearchManager->updateIndexStatus(
111
			DeckProvider::DECK_PROVIDER_ID, (string)$cardId, IIndex::INDEX_CONTENT
112
		);
113
	}
114
115
116
	/**
117
	 * @param GenericEvent $e
118
	 */
119
	public function onCardDeleted(GenericEvent $e) {
120
		$cardId = $e->getArgument('id');
121
122
		$this->fullTextSearchManager->updateIndexStatus(
123
			DeckProvider::DECK_PROVIDER_ID, (string)$cardId, IIndex::INDEX_REMOVE
124
		);
125
	}
126
127
128
	/**
129
	 * @param GenericEvent $e
130
	 */
131
	public function onBoardShares(GenericEvent $e) {
132
		$boardId = $e->getArgument('boardId');
133
134
		$cards = array_map(
135
			function(Card $item) {
136
				return $item->getId();
137
			},
138
			$this->getCardsFromBoard($boardId)
139
		);
140
		$this->fullTextSearchManager->updateIndexesStatus(
141
			DeckProvider::DECK_PROVIDER_ID, $cards, IIndex::INDEX_META
142
		);
143
	}
144
145
146
	/**
147
	 * @param Card $card
148
	 *
149
	 * @return IIndexDocument
150
	 */
151
	public function generateIndexDocumentFromCard(Card $card): IIndexDocument {
152
		$document = new IndexDocument(DeckProvider::DECK_PROVIDER_ID, (string)$card->getId());
153
154
		return $document;
155
	}
156
157
158
	/**
159
	 * @param IIndexDocument $document
160
	 *
161
	 * @throws DoesNotExistException
162
	 * @throws MultipleObjectsReturnedException
163
	 */
164
	public function fillIndexDocument(IIndexDocument $document) {
165
		/** @var Card $card */
166
		$card = $this->cardMapper->find((int)$document->getId());
167
168
		$document->setTitle($card->getTitle());
169
		$document->setContent($card->getDescription());
170
		$document->setAccess($this->generateDocumentAccessFromCardId($card->getId()));
171
	}
172
173
174
	/**
175
	 * @param int $cardId
176
	 *
177
	 * @return IDocumentAccess
178
	 * @throws DoesNotExistException
179
	 * @throws MultipleObjectsReturnedException
180
	 */
181
	public function generateDocumentAccessFromCardId(int $cardId): IDocumentAccess {
182
		$board = $this->getBoardFromCardId($cardId);
183
184
		$access = new DocumentAccess($board->getOwner());
185
186
		return $access;
187
	}
188
189
190
	/**
191
	 * @param string $userId
192
	 *
193
	 * @return Card[]
194
	 */
195
	public function getCardsFromUser(string $userId): array {
196
		$cards = [];
197
		$boards = $this->getBoardsFromUser($userId);
198
		foreach ($boards as $board) {
199
			$stacks = $this->getStacksFromBoard($board->getId());
200
			foreach ($stacks as $stack) {
201
				$cards = array_merge($cards, $this->getCardsFromStack($stack->getId()));
202
			}
203
		}
204
205
		return $cards;
206
	}
207
208
209
	/**
210
	 * @param int $boardId
211
	 *
212
	 * @return Card[]
213
	 */
214
	public function getCardsFromBoard(int $boardId): array {
215
		$cards = [];
216
		$stacks = $this->getStacksFromBoard($boardId);
217
		foreach ($stacks as $stack) {
218
			$cards = array_merge($cards, $this->getCardsFromStack($stack->getId()));
219
		}
220
221
		return $cards;
222
	}
223
224
225
	/**
226
	 * @param int $cardId
227
	 *
228
	 * @return Board
229
	 * @throws DoesNotExistException
230
	 * @throws MultipleObjectsReturnedException
231
	 */
232
	public function getBoardFromCardId(int $cardId): Board {
233
		$boardId = (int)$this->cardMapper->findBoardId($cardId);
234
		/** @var Board $board */
235
		$board = $this->boardMapper->find($boardId);
236
237
		return $board;
238
	}
239
240
241
	/**
242
	 * @param int $stackId
243
	 *
244
	 * @return Card[]
245
	 */
246
	private function getCardsFromStack(int $stackId): array {
247
		return $this->cardMapper->findAll($stackId, null, null);
248
	}
249
250
251
	/**
252
	 * @param int $boardId
253
	 *
254
	 * @return Stack[]
255
	 */
256
	private function getStacksFromBoard(int $boardId): array {
257
		return $this->stackMapper->findAll($boardId, null, null);
258
259
	}
260
261
262
	/**
263
	 * @param string $userId
264
	 *
265
	 * @return Board[]
266
	 */
267
	private function getBoardsFromUser(string $userId): array {
268
		return $this->boardMapper->findAllByUser($userId, null, null, -1);
269
	}
270
271
272
}
273
274