Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/deck.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorJulien Veyssier <eneiluj@posteo.net>2022-09-12 20:49:23 +0300
committerJulien Veyssier <eneiluj@posteo.net>2022-09-14 13:00:30 +0300
commit395c79b32a63dcf4399f4960bea0c1f58aaa456b (patch)
tree0add7a74719ac8864941c749038b32ec1e534d9a /lib
parent7c683efce674d6deacdfd15af5ad54e204a6fb52 (diff)
perform deep serialization/sanitizing of reference rich object to avoid caching issuesfix/4018/reference-card
Signed-off-by: Julien Veyssier <eneiluj@posteo.net>
Diffstat (limited to 'lib')
-rw-r--r--lib/Reference/CardReferenceProvider.php68
1 files changed, 61 insertions, 7 deletions
diff --git a/lib/Reference/CardReferenceProvider.php b/lib/Reference/CardReferenceProvider.php
index a4e4a9c8..ba3327b9 100644
--- a/lib/Reference/CardReferenceProvider.php
+++ b/lib/Reference/CardReferenceProvider.php
@@ -24,6 +24,10 @@ namespace OCA\Deck\Reference;
use OC\Collaboration\Reference\Reference;
use OCA\Deck\AppInfo\Application;
+use OCA\Deck\Db\Assignment;
+use OCA\Deck\Db\Attachment;
+use OCA\Deck\Db\Label;
+use OCA\Deck\Model\CardDetails;
use OCA\Deck\Service\BoardService;
use OCA\Deck\Service\CardService;
use OCA\Deck\Service\StackService;
@@ -67,14 +71,20 @@ class CardReferenceProvider implements IReferenceProvider {
*/
public function resolveReference(string $referenceText): ?IReference {
if ($this->matchReference($referenceText)) {
- $cardIds = $this->getBoardCardId($referenceText);
- if ($cardIds !== null) {
- [$boardId, $cardId] = $cardIds;
- $card = $this->cardService->find((int) $cardId);
- $board = $this->boardService->find((int) $boardId);
- $stack = $this->stackService->find((int) $card->jsonSerialize()['stackId']);
+ $ids = $this->getBoardCardId($referenceText);
+ if ($ids !== null) {
+ [$boardId, $cardId] = $ids;
+ $card = $this->cardService->find((int) $cardId)->jsonSerialize();
+ $board = $this->boardService->find((int) $boardId)->jsonSerialize();
+ $stack = $this->stackService->find((int) $card['stackId'])->jsonSerialize();
+
+ $card = $this->sanitizeSerializedCard($card);
+ $board = $this->sanitizeSerializedBoard($board);
+ $stack = $this->sanitizeSerializedStack($stack);
+
$reference = new Reference($referenceText);
$reference->setRichObject(Application::APP_ID . '-card', [
+ 'id' => $boardId . '/' . $cardId,
'card' => $card,
'board' => $board,
'stack' => $stack,
@@ -86,6 +96,44 @@ class CardReferenceProvider implements IReferenceProvider {
return null;
}
+ private function sanitizeSerializedStack(array $stack): array {
+ $stack['cards'] = array_map(function (CardDetails $cardDetails) {
+ $result = $cardDetails->jsonSerialize();
+ unset($result['assignedUsers']);
+ return $result;
+ }, $stack['cards']);
+
+ return $stack;
+ }
+
+ private function sanitizeSerializedBoard(array $board): array {
+ unset($board['labels']);
+ $board['owner'] = $board['owner']->jsonSerialize();
+ unset($board['acl']);
+ unset($board['users']);
+
+ return $board;
+ }
+
+ private function sanitizeSerializedCard(array $card): array {
+ $card['labels'] = array_map(function (Label $label) {
+ return $label->jsonSerialize();
+ }, $card['labels']);
+ $card['assignedUsers'] = array_map(function (Assignment $assignment) {
+ $result = $assignment->jsonSerialize();
+ $result['participant'] = $result['participant']->jsonSerialize();
+ return $result;
+ }, $card['assignedUsers']);
+ $card['owner'] = $card['owner']->jsonSerialize();
+ unset($card['relatedStack']);
+ unset($card['relatedBoard']);
+ $card['attachments'] = array_map(function (Attachment $attachment) {
+ return $attachment->jsonSerialize();
+ }, $card['attachments']);
+
+ return $card;
+ }
+
private function getBoardCardId(string $url): ?array {
$start = $this->urlGenerator->getAbsoluteURL('/apps/' . Application::APP_ID);
$startIndex = $this->urlGenerator->getAbsoluteURL('/index.php/apps/' . Application::APP_ID);
@@ -104,10 +152,16 @@ class CardReferenceProvider implements IReferenceProvider {
}
public function getCachePrefix(string $referenceId): string {
+ $ids = $this->getBoardCardId($referenceId);
+ if ($ids !== null) {
+ [$boardId, $cardId] = $ids;
+ return $boardId . '/' . $cardId;
+ }
+
return $referenceId;
}
public function getCacheKey(string $referenceId): ?string {
- return null;
+ return $this->userId ?? '';
}
}