@@ -829,7 +829,7 @@ public function getShareById($id, $recipientId = null) {
829829
830830 // If the recipient is set for a group share resolve to that user
831831 if ($ recipientId !== null && $ share ->getShareType () === IShare::TYPE_GROUP ) {
832- $ share = $ this ->resolveGroupShares ([$ share ], $ recipientId )[0 ];
832+ $ share = $ this ->resolveGroupShares ([( int ) $ share -> getId () => $ share ], $ recipientId )[0 ];
833833 }
834834
835835 return $ share ;
@@ -1006,7 +1006,8 @@ public function getSharedWith($userId, $shareType, $node, $limit, $offset) {
10061006 }
10071007
10081008 if ($ this ->isAccessibleResult ($ data )) {
1009- $ shares2 [] = $ this ->createShare ($ data );
1009+ $ share = $ this ->createShare ($ data );
1010+ $ shares2 [$ share ->getId ()] = $ share ;
10101011 }
10111012 }
10121013 $ cursor ->closeCursor ();
@@ -1127,61 +1128,38 @@ private function createShare($data) {
11271128 }
11281129
11291130 /**
1130- * @param Share[] $shares
1131+ * Update the data from group shares with any per-user modifications
1132+ *
1133+ * @param array<int, Share> $shareMap shares indexed by share id
11311134 * @param $userId
11321135 * @return Share[] The updates shares if no update is found for a share return the original
11331136 */
1134- private function resolveGroupShares ($ shares , $ userId ) {
1135- $ result = [];
1136-
1137- $ start = 0 ;
1138- while (true ) {
1139- /** @var Share[] $shareSlice */
1140- $ shareSlice = array_slice ($ shares , $ start , 100 );
1141- $ start += 100 ;
1142-
1143- if ($ shareSlice === []) {
1144- break ;
1145- }
1146-
1147- /** @var int[] $ids */
1148- $ ids = [];
1149- /** @var Share[] $shareMap */
1150- $ shareMap = [];
1151-
1152- foreach ($ shareSlice as $ share ) {
1153- $ ids [] = (int )$ share ->getId ();
1154- $ shareMap [$ share ->getId ()] = $ share ;
1155- }
1156-
1157- $ qb = $ this ->dbConn ->getQueryBuilder ();
1158-
1159- $ query = $ qb ->select ('* ' )
1160- ->from ('share ' )
1161- ->where ($ qb ->expr ()->in ('parent ' , $ qb ->createNamedParameter ($ ids , IQueryBuilder::PARAM_INT_ARRAY )))
1162- ->andWhere ($ qb ->expr ()->eq ('share_with ' , $ qb ->createNamedParameter ($ userId )))
1163- ->andWhere ($ qb ->expr ()->orX (
1164- $ qb ->expr ()->eq ('item_type ' , $ qb ->createNamedParameter ('file ' )),
1165- $ qb ->expr ()->eq ('item_type ' , $ qb ->createNamedParameter ('folder ' ))
1166- ));
1167-
1168- $ stmt = $ query ->execute ();
1169-
1170- while ($ data = $ stmt ->fetch ()) {
1171- $ shareMap [$ data ['parent ' ]]->setPermissions ((int )$ data ['permissions ' ]);
1172- $ shareMap [$ data ['parent ' ]]->setStatus ((int )$ data ['accepted ' ]);
1173- $ shareMap [$ data ['parent ' ]]->setTarget ($ data ['file_target ' ]);
1174- $ shareMap [$ data ['parent ' ]]->setParent ($ data ['parent ' ]);
1175- }
1137+ private function resolveGroupShares ($ shareMap , $ userId ) {
1138+ $ qb = $ this ->dbConn ->getQueryBuilder ();
1139+ $ query = $ qb ->select ('* ' )
1140+ ->from ('share ' )
1141+ ->where ($ qb ->expr ()->eq ('share_with ' , $ qb ->createNamedParameter ($ userId )))
1142+ ->andWhere ($ qb ->expr ()->eq ('share_type ' , $ qb ->createNamedParameter (IShare::TYPE_USERGROUP )))
1143+ ->andWhere ($ qb ->expr ()->in ('item_type ' , [$ qb ->createNamedParameter ('file ' ), $ qb ->createNamedParameter ('folder ' )]));
1144+
1145+ // this is called with either all group shares or one group share.
1146+ // for all shares it's easier to just only search by share_with,
1147+ // for a single share it's efficient to filter by parent
1148+ if (count ($ shareMap ) === 1 ) {
1149+ $ share = reset ($ shareMap );
1150+ $ query ->andWhere ($ qb ->expr ()->eq ('parent ' , $ qb ->createNamedParameter ($ share ->getId ())));
1151+ }
11761152
1177- $ stmt-> closeCursor ();
1153+ $ stmt = $ query -> execute ();
11781154
1179- foreach ($ shareMap as $ share ) {
1180- $ result [] = $ share ;
1181- }
1155+ while ($ data = $ stmt ->fetch ()) {
1156+ $ shareMap [$ data ['parent ' ]]->setPermissions ((int )$ data ['permissions ' ]);
1157+ $ shareMap [$ data ['parent ' ]]->setStatus ((int )$ data ['accepted ' ]);
1158+ $ shareMap [$ data ['parent ' ]]->setTarget ($ data ['file_target ' ]);
1159+ $ shareMap [$ data ['parent ' ]]->setParent ($ data ['parent ' ]);
11821160 }
11831161
1184- return $ result ;
1162+ return array_values ( $ shareMap ) ;
11851163 }
11861164
11871165 /**
0 commit comments