Revert "perf(sharing): Optimize getSharedWith to fetch permissions right away"
This reverts commit c1dde0cb74.
This commit is contained in:
@@ -268,13 +268,7 @@ class DeckShareProvider implements \OCP\Share\IShareProvider {
|
|||||||
return $share;
|
return $share;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function applyBoardPermission($share, $permissions, $userId, ?array $shareToPermissionMap = null): void {
|
private function applyBoardPermission($share, $permissions, $userId) {
|
||||||
$cardId = (int)$share->getSharedWith();
|
|
||||||
if ($shareToPermissionMap !== null && isset($shareToPermissionMap[$cardId])) {
|
|
||||||
$share->setPermissions($permissions & $this->permissionService->boardToFilePermission($shareToPermissionMap[$cardId]));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$this->permissionService->checkPermission($this->cardMapper, $share->getSharedWith(), Acl::PERMISSION_EDIT, $userId);
|
$this->permissionService->checkPermission($this->cardMapper, $share->getSharedWith(), Acl::PERMISSION_EDIT, $userId);
|
||||||
} catch (NoPermissionException $e) {
|
} catch (NoPermissionException $e) {
|
||||||
@@ -619,7 +613,7 @@ class DeckShareProvider implements \OCP\Share\IShareProvider {
|
|||||||
* @param string $userId
|
* @param string $userId
|
||||||
* @return IShare[]
|
* @return IShare[]
|
||||||
*/
|
*/
|
||||||
private function resolveSharesForRecipient(array $shares, string $userId, ?array $cardPermissionMap = null): array {
|
private function resolveSharesForRecipient(array $shares, string $userId): array {
|
||||||
$result = [];
|
$result = [];
|
||||||
|
|
||||||
$start = 0;
|
$start = 0;
|
||||||
@@ -656,7 +650,7 @@ class DeckShareProvider implements \OCP\Share\IShareProvider {
|
|||||||
$stmt = $query->execute();
|
$stmt = $query->execute();
|
||||||
|
|
||||||
while ($data = $stmt->fetch()) {
|
while ($data = $stmt->fetch()) {
|
||||||
$this->applyBoardPermission($shareMap[$data['parent']], (int)$data['permissions'], $userId, $cardPermissionMap);
|
$this->applyBoardPermission($shareMap[$data['parent']], (int)$data['permissions'], $userId);
|
||||||
$shareMap[$data['parent']]->setTarget($data['file_target']);
|
$shareMap[$data['parent']]->setTarget($data['file_target']);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -705,18 +699,14 @@ class DeckShareProvider implements \OCP\Share\IShareProvider {
|
|||||||
* @return IShare[]
|
* @return IShare[]
|
||||||
*/
|
*/
|
||||||
public function getSharedWith($userId, $shareType, $node, $limit, $offset): array {
|
public function getSharedWith($userId, $shareType, $node, $limit, $offset): array {
|
||||||
// We query all boards fully as we can reuse that to match permissions later on
|
$allBoards = $this->boardMapper->findBoardIds($userId);
|
||||||
$allBoards = $this->boardMapper->findAllForUser($userId);
|
|
||||||
$cardToBoardMapping = [];
|
|
||||||
/** @var IShare[] $shares */
|
/** @var IShare[] $shares */
|
||||||
$shares = [];
|
$shares = [];
|
||||||
|
|
||||||
$start = 0;
|
$start = 0;
|
||||||
while (true) {
|
while (true) {
|
||||||
$boards = array_slice($allBoards, $start, 1000);
|
$boards = array_slice($allBoards, $start, 1000);
|
||||||
$boardIds = array_map(function ($board) {
|
|
||||||
return $board->getId();
|
|
||||||
}, $boards);
|
|
||||||
$start += 1000;
|
$start += 1000;
|
||||||
|
|
||||||
if ($boards === []) {
|
if ($boards === []) {
|
||||||
@@ -730,16 +720,13 @@ class DeckShareProvider implements \OCP\Share\IShareProvider {
|
|||||||
'f.encrypted', 'f.unencrypted_size', 'f.etag', 'f.checksum'
|
'f.encrypted', 'f.unencrypted_size', 'f.etag', 'f.checksum'
|
||||||
)
|
)
|
||||||
->selectAlias('st.id', 'storage_string_id')
|
->selectAlias('st.id', 'storage_string_id')
|
||||||
->selectAlias('db.id', 'board_id')
|
|
||||||
->from('share', 's')
|
->from('share', 's')
|
||||||
->orderBy('s.id')
|
->orderBy('s.id')
|
||||||
->leftJoin('s', 'filecache', 'f', $qb->expr()->eq('s.file_source', 'f.fileid'))
|
->leftJoin('s', 'filecache', 'f', $qb->expr()->eq('s.file_source', 'f.fileid'))
|
||||||
->leftJoin('f', 'storages', 'st', $qb->expr()->eq('f.storage', 'st.numeric_id'))
|
->leftJoin('f', 'storages', 'st', $qb->expr()->eq('f.storage', 'st.numeric_id'))
|
||||||
->leftJoin('s', 'deck_cards', 'dc', $qb->expr()->eq($qb->expr()->castColumn('dc.id', IQueryBuilder::PARAM_STR), 's.share_with'))
|
->leftJoin('s', 'deck_cards', 'dc', $qb->expr()->eq($qb->expr()->castColumn('dc.id', IQueryBuilder::PARAM_STR), 's.share_with'))
|
||||||
->leftJoin('dc', 'deck_stacks', 'ds', $qb->expr()->eq('dc.stack_id', 'ds.id'))
|
->leftJoin('dc', 'deck_stacks', 'ds', $qb->expr()->eq('dc.stack_id', 'ds.id'))
|
||||||
->leftJoin('ds', 'deck_boards', 'db', $qb->expr()->eq('ds.board_id', 'db.id'))
|
->leftJoin('ds', 'deck_boards', 'db', $qb->expr()->eq('ds.board_id', 'db.id'));
|
||||||
->where($qb->expr()->eq('dc.deleted_at', $qb->createNamedParameter(0)))
|
|
||||||
->andWhere($qb->expr()->eq('db.deleted_at', $qb->createNamedParameter(0)));
|
|
||||||
|
|
||||||
if ($limit !== -1) {
|
if ($limit !== -1) {
|
||||||
$qb->setMaxResults($limit);
|
$qb->setMaxResults($limit);
|
||||||
@@ -752,7 +739,7 @@ class DeckShareProvider implements \OCP\Share\IShareProvider {
|
|||||||
|
|
||||||
$qb->andWhere($qb->expr()->eq('s.share_type', $qb->createNamedParameter(IShare::TYPE_DECK)))
|
$qb->andWhere($qb->expr()->eq('s.share_type', $qb->createNamedParameter(IShare::TYPE_DECK)))
|
||||||
->andWhere($qb->expr()->in('db.id', $qb->createNamedParameter(
|
->andWhere($qb->expr()->in('db.id', $qb->createNamedParameter(
|
||||||
$boardIds,
|
$boards,
|
||||||
IQueryBuilder::PARAM_STR_ARRAY
|
IQueryBuilder::PARAM_STR_ARRAY
|
||||||
)))
|
)))
|
||||||
->andWhere($qb->expr()->orX(
|
->andWhere($qb->expr()->orX(
|
||||||
@@ -771,23 +758,11 @@ class DeckShareProvider implements \OCP\Share\IShareProvider {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$shares[] = $this->createShareObject($data);
|
$shares[] = $this->createShareObject($data);
|
||||||
$cardToBoardMapping[(int)$data['share_with']] = $data['board_id'];
|
|
||||||
}
|
}
|
||||||
$cursor->closeCursor();
|
$cursor->closeCursor();
|
||||||
}
|
}
|
||||||
|
|
||||||
$boardPermissions = [];
|
$shares = $this->resolveSharesForRecipient($shares, $userId);
|
||||||
foreach ($allBoards as $board) {
|
|
||||||
$permissions = $this->permissionService->matchPermissions($board);
|
|
||||||
$boardPermissions[$board->getId()] = $permissions;
|
|
||||||
}
|
|
||||||
|
|
||||||
$cardPermissionMap = [];
|
|
||||||
foreach ($cardToBoardMapping as $cardId => $boardId) {
|
|
||||||
$cardPermissionMap[$cardId] = $boardPermissions[$boardId] ?? false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$shares = $this->resolveSharesForRecipient($shares, $userId, $cardPermissionMap);
|
|
||||||
|
|
||||||
return $shares;
|
return $shares;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user