@@ -1234,18 +1234,14 @@ public function getChildren(IShare $parent): array {
12341234 }
12351235
12361236 /**
1237- * Delete all shares in a room, or only those from the given user.
1238- *
1239- * When a user is given all their shares are removed, both own shares and
1240- * received shares.
1237+ * Delete all shares in a room
12411238 *
12421239 * Not part of IShareProvider API, but needed by the hooks in
1243- * OCA\Talk\AppInfo\Application
1240+ * {@see Listener::roomDeletedEvent()}
12441241 *
12451242 * @param string $roomToken
1246- * @param string|null $user
12471243 */
1248- public function deleteInRoom (string $ roomToken, ? string $ user = null ): void {
1244+ public function deleteInRoom (string $ roomToken ): void {
12491245 $ this ->cleanSharesByIdCache ();
12501246
12511247 //First delete all custom room shares for the original shares to be removed
@@ -1255,10 +1251,6 @@ public function deleteInRoom(string $roomToken, ?string $user = null): void {
12551251 ->where ($ qb ->expr ()->eq ('share_type ' , $ qb ->createNamedParameter (IShare::TYPE_ROOM )))
12561252 ->andWhere ($ qb ->expr ()->eq ('share_with ' , $ qb ->createNamedParameter ($ roomToken )));
12571253
1258- if ($ user !== null ) {
1259- $ qb ->andWhere ($ qb ->expr ()->eq ('uid_initiator ' , $ qb ->createNamedParameter ($ user )));
1260- }
1261-
12621254 $ cursor = $ qb ->executeQuery ();
12631255 $ ids = [];
12641256 while ($ row = $ cursor ->fetchAssociative ()) {
@@ -1285,36 +1277,49 @@ public function deleteInRoom(string $roomToken, ?string $user = null): void {
12851277 $ delete ->delete ('share ' )
12861278 ->where ($ delete ->expr ()->eq ('share_type ' , $ delete ->createNamedParameter (IShare::TYPE_ROOM )))
12871279 ->andWhere ($ delete ->expr ()->eq ('share_with ' , $ delete ->createNamedParameter ($ roomToken )));
1280+ $ delete ->executeStatement ();
1281+ }
12881282
1289- if ($ user !== null ) {
1290- $ delete ->andWhere ($ delete ->expr ()->eq ('uid_initiator ' , $ delete ->createNamedParameter ($ user )));
1291- }
1283+ /**
1284+ * Delete all received shares for a user in a room
1285+ *
1286+ * Not part of IShareProvider API, but needed by the hooks in
1287+ * {@see Listener::roomAttendeesRemovedEvent()}
1288+ *
1289+ * @param string $roomToken
1290+ * @param list<string> $userIds
1291+ */
1292+ public function deleteReceivedSharesInRoom (string $ roomToken , array $ userIds ): void {
1293+ $ this ->cleanSharesByIdCache ();
12921294
1293- $ delete ->executeStatement ();
1295+ $ qb = $ this ->dbConnection ->getQueryBuilder ();
1296+ $ qb ->select ('id ' )
1297+ ->from ('share ' )
1298+ ->where ($ qb ->expr ()->eq ('share_type ' , $ qb ->createNamedParameter (IShare::TYPE_ROOM )))
1299+ ->andWhere ($ qb ->expr ()->eq ('share_with ' , $ qb ->createNamedParameter ($ roomToken )));
12941300
1295- // Finally delete all custom room shares leftovers for the given user
1296- if ($ user !== null ) {
1297- $ query = $ this ->dbConnection ->getQueryBuilder ();
1298- $ query ->select ('id ' )
1299- ->from ('share ' )
1300- ->where ($ query ->expr ()->eq ('share_type ' , $ query ->createNamedParameter (IShare::TYPE_ROOM )))
1301- ->andWhere ($ query ->expr ()->eq ('share_with ' , $ query ->createNamedParameter ($ roomToken )));
1301+ $ cursor = $ qb ->executeQuery ();
1302+ $ ids = [];
1303+ while ($ row = $ cursor ->fetchAssociative ()) {
1304+ $ ids [] = (int )$ row ['id ' ];
1305+ }
1306+ $ cursor ->closeCursor ();
13021307
1303- $ cursor = $ query ->executeQuery ();
1304- $ ids = [];
1305- while ($ row = $ cursor ->fetchAssociative ()) {
1306- $ ids [] = (int )$ row ['id ' ];
1307- }
1308- $ cursor ->closeCursor ();
1308+ if (!empty ($ ids )) {
1309+ $ delete = $ this ->dbConnection ->getQueryBuilder ();
1310+ $ delete ->delete ('share ' )
1311+ ->where ($ delete ->expr ()->eq ('share_type ' , $ delete ->createNamedParameter (self ::SHARE_TYPE_USERROOM )))
1312+ ->andWhere ($ delete ->expr ()->in ('share_with ' , $ delete ->createParameter ('userids ' )))
1313+ ->andWhere ($ delete ->expr ()->in ('parent ' , $ delete ->createParameter ('ids ' )));
1314+
1315+ $ chunkSize = min (100 , IQueryBuilder::MAX_IN_PARAMETERS );
13091316
1310- if (! empty ( $ ids )) {
1311- $ chunkSize = min ( 100 , IQueryBuilder:: MAX_IN_PARAMETERS );
1312- $ chunks = array_chunk ( $ ids , $ chunkSize );
1317+ $ userChunks = array_chunk ( $ userIds , $ chunkSize );
1318+ $ chunks = array_chunk ( $ ids , $ chunkSize );
1319+ foreach ( $ userChunks as $ userChunk ) {
13131320 foreach ($ chunks as $ chunk ) {
1314- $ delete ->delete ('share ' )
1315- ->where ($ delete ->expr ()->eq ('share_type ' , $ delete ->createNamedParameter (self ::SHARE_TYPE_USERROOM )))
1316- ->andWhere ($ delete ->expr ()->in ('share_with ' , $ delete ->createNamedParameter ($ user )))
1317- ->andWhere ($ delete ->expr ()->in ('parent ' , $ delete ->createNamedParameter ($ chunk , IQueryBuilder::PARAM_INT_ARRAY )));
1321+ $ delete ->setParameter ('userids ' , $ userChunk , IQueryBuilder::PARAM_STR_ARRAY )
1322+ ->setParameter ('ids ' , $ chunk , IQueryBuilder::PARAM_INT_ARRAY );
13181323 $ delete ->executeStatement ();
13191324 }
13201325 }
0 commit comments