diff --git a/composer.lock b/composer.lock index 28fd0c5ab..5581c36b0 100644 --- a/composer.lock +++ b/composer.lock @@ -437,12 +437,12 @@ "source": { "type": "git", "url": "https://github.com/nextcloud-deps/ocp.git", - "reference": "d42bd36d0413b881b7459b220e1328bc57e48b38" + "reference": "6c1e5686d00c40f57abd83e8ad268e9ab34825bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/d42bd36d0413b881b7459b220e1328bc57e48b38", - "reference": "d42bd36d0413b881b7459b220e1328bc57e48b38", + "url": "https://api.github.com/repos/nextcloud-deps/ocp/zipball/6c1e5686d00c40f57abd83e8ad268e9ab34825bb", + "reference": "6c1e5686d00c40f57abd83e8ad268e9ab34825bb", "shasum": "" }, "require": { @@ -478,7 +478,7 @@ "issues": "https://github.com/nextcloud-deps/ocp/issues", "source": "https://github.com/nextcloud-deps/ocp/tree/master" }, - "time": "2025-12-11T00:55:32+00:00" + "time": "2026-01-09T00:57:54+00:00" }, { "name": "nikic/php-parser", diff --git a/lib/Controller/CardApiController.php b/lib/Controller/CardApiController.php index bc1359250..4a3187e01 100644 --- a/lib/Controller/CardApiController.php +++ b/lib/Controller/CardApiController.php @@ -72,11 +72,11 @@ public function create($title, $type = 'plain', $order = 999, $description = '', $card = $this->cardService->create($title, $this->request->getParam('stackId'), $type, $order, $this->userId, $description, $duedate); foreach ($labels as $labelId) { - $this->cardService->assignLabel($card->id, $labelId); + $this->cardService->assignLabel($card->getId(), $labelId); } foreach ($users as $user) { - $this->assignmentService->assignUser($card->id, $user['id'], $user['type']); + $this->assignmentService->assignUser($card->getId(), $user['id'], $user['type']); } return new DataResponse($card, HTTP::STATUS_OK); diff --git a/lib/Service/FilesAppService.php b/lib/Service/FilesAppService.php index 38f3cf373..dda58be0f 100644 --- a/lib/Service/FilesAppService.php +++ b/lib/Service/FilesAppService.php @@ -312,7 +312,7 @@ public function markAsDeleted(Attachment $attachment) { */ private function getShareForAttachment(Attachment $attachment): IShare { try { - $share = $this->shareProvider->getShareById($attachment->getId()); + $share = $this->shareProvider->getShareById((string)$attachment->getId()); } catch (ShareNotFound $e) { throw new NoPermissionException('No permission to access the attachment from the card'); } diff --git a/lib/Sharing/DeckShareProvider.php b/lib/Sharing/DeckShareProvider.php index ca0dbc5e7..626b6f577 100644 --- a/lib/Sharing/DeckShareProvider.php +++ b/lib/Sharing/DeckShareProvider.php @@ -32,6 +32,7 @@ use OCP\Share\Exceptions\GenericShareException; use OCP\Share\Exceptions\ShareNotFound; use OCP\Share\IManager; +use OCP\Share\IPartialShareProvider; use OCP\Share\IShare; /** Taken from the talk shareapicontroller helper */ @@ -42,7 +43,7 @@ public function formatShare(IShare $share): array; public function canAccessShare(IShare $share, string $user): bool; } -class DeckShareProvider implements \OCP\Share\IShareProvider { +class DeckShareProvider implements \OCP\Share\IShareProvider, IPartialShareProvider { public const DECK_FOLDER = '/Deck'; public const DECK_FOLDER_PLACEHOLDER = '/{DECK_PLACEHOLDER}'; @@ -419,7 +420,7 @@ public function restore(IShare $share, string $recipient): IShare { $qb->executeStatement(); - return $this->getShareById((int)$share->getId(), $recipient); + return $this->getShareById((string)$share->getId(), $recipient); } /** @@ -702,6 +703,34 @@ public function getSharesByPath(Node $path): array { * @return IShare[] */ public function getSharedWith($userId, $shareType, $node, $limit, $offset): array { + return $this->_getSharedWith($userId, $limit, $offset, $node); + } + + public function getSharedWithByPath( + string $userId, + int $shareType, + string $path, + bool $forChildren, + int $limit, + int $offset, + ): iterable { + return $this->_getSharedWith($userId, $limit, $offset, null, $path, $forChildren); + } + + /** + * Get received shared for the given user. + * You can optionally provide a node or a path to filter the shares. + * + * @return IShare[] + */ + private function _getSharedWith( + string $userId, + int $limit, + int $offset, + ?Node $node = null, + ?string $path = null, + ?bool $forChildren = false, + ): array { $allBoards = $this->boardMapper->findBoardIds($userId); /** @var IShare[] $shares */ @@ -740,6 +769,17 @@ public function getSharedWith($userId, $shareType, $node, $limit, $offset): arra $qb->andWhere($qb->expr()->eq('s.file_source', $qb->createNamedParameter($node->getId()))); } + if ($path !== null) { + $qb->leftJoin('s', 'share', 'sc', $qb->expr()->eq('s.parent', 'sc.id')) + ->andWhere($qb->expr()->eq('sc.share_type', $qb->createNamedParameter(IShare::TYPE_DECK_USER))); + + if ($forChildren) { + $qb->andWhere($qb->expr()->like('sc.file_target', $qb->createNamedParameter($this->dbConnection->escapeLikeParameter($path) . '_%'))); + } else { + $qb->andWhere($qb->expr()->eq('sc.file_target', $qb->createNamedParameter($path))); + } + } + $qb->andWhere($qb->expr()->eq('s.share_type', $qb->createNamedParameter(IShare::TYPE_DECK))) ->andWhere($qb->expr()->in('db.id', $qb->createNamedParameter( $boards,