@@ -1288,7 +1288,7 @@ public function deleteOldTrashbinItems(int $limit, float|int $maxAge): void {
12881288 $ qb ->where ($ qb ->expr ()->neq ('type ' , $ qb ->createNamedParameter (TreeMapper::TYPE_SHARE , IQueryBuilder::PARAM_STR )));
12891289 $ cutoffDate = $ this ->timeFactory ->getDateTime ();
12901290 $ cutoffDate ->modify ('- ' . ((string )$ maxAge ) . ' seconds ' );
1291- $ qb ->andWhere ($ qb ->expr ()->lt ('soft_deleted_at ' , $ qb ->createNamedParameter ($ cutoffDate , IQueryBuilder::PARAM_DATE )));
1291+ $ qb ->andWhere ($ qb ->expr ()->lt ('soft_deleted_at ' , $ qb ->createNamedParameter ($ cutoffDate , IQueryBuilder::PARAM_DATETIME_MUTABLE )));
12921292 $ qb ->setMaxResults ($ limit );
12931293 try {
12941294 $ result = $ qb ->executeQuery ();
@@ -1301,9 +1301,47 @@ public function deleteOldTrashbinItems(int $limit, float|int $maxAge): void {
13011301 $ this ->deleteEntry ($ row ['type ' ], $ row ['id ' ], $ row ['parent_folder ' ]);
13021302 } catch (DoesNotExistException $ e ) {
13031303 // noop
1304- } catch (UnsupportedOperation |MultipleObjectsReturnedException $ e ) {
1304+ } catch (UnsupportedOperation |MultipleObjectsReturnedException | Exception $ e ) {
13051305 $ this ->logger ->error ('Could not delete old trash bin item: ' . var_export ($ row , true ), ['exception ' => $ e ]);
13061306 }
13071307 }
13081308 }
1309+
1310+ /**
1311+ * @param string $userId
1312+ * @return void
1313+ */
1314+ public function deleteTrashbinItemsForUser (string $ userId ): void {
1315+ $ qb = $ this ->db ->getQueryBuilder ();
1316+ $ qb ->select ('t.type ' , 't.id ' , 't.parent_folder ' )->from ('bookmarks_tree ' , 't ' );
1317+ $ qb ->where ($ qb ->expr ()->neq ('type ' , $ qb ->createNamedParameter (TreeMapper::TYPE_SHARE , IQueryBuilder::PARAM_STR )));
1318+ $ qb ->andWhere ($ qb ->expr ()->isNotNull ('soft_deleted_at ' ));
1319+ $ qb ->leftJoin ('t ' , 'bookmarks ' , 'b ' , 't.id = b.id and t.type = ' . $ qb ->createNamedParameter (TreeMapper::TYPE_BOOKMARK ));
1320+ $ qb ->leftJoin ('t ' , 'bookmarks_folders ' , 'f ' , 't.id = f.id and t.type = ' . $ qb ->createNamedParameter (TreeMapper::TYPE_FOLDER ));
1321+ $ qb ->andWhere ($ qb ->expr ()->orX (
1322+ $ qb ->expr ()->andX (
1323+ $ qb ->expr ()->eq ('t.type ' , $ qb ->createNamedParameter (TreeMapper::TYPE_BOOKMARK )),
1324+ $ qb ->expr ()->eq ('b.user_id ' , $ qb ->createNamedParameter ($ userId )),
1325+ ),
1326+ $ qb ->expr ()->andX (
1327+ $ qb ->expr ()->eq ('t.type ' , $ qb ->createNamedParameter (TreeMapper::TYPE_FOLDER )),
1328+ $ qb ->expr ()->eq ('f.user_id ' , $ qb ->createNamedParameter ($ userId )),
1329+ )
1330+ ));
1331+ try {
1332+ $ result = $ qb ->executeQuery ();
1333+ } catch (Exception $ e ) {
1334+ $ this ->logger ->error ('Could not query for trash bin items of user ' . $ userId , ['exception ' => $ e ]);
1335+ return ;
1336+ }
1337+ while ($ row = $ result ->fetch ()) {
1338+ try {
1339+ $ this ->deleteEntry ($ row ['type ' ], $ row ['id ' ], $ row ['parent_folder ' ]);
1340+ } catch (DoesNotExistException $ e ) {
1341+ // noop
1342+ } catch (UnsupportedOperation |MultipleObjectsReturnedException |Exception $ e ) {
1343+ $ this ->logger ->error ('Could not delete trash bin item: ' . var_export ($ row , true ), ['exception ' => $ e ]);
1344+ }
1345+ }
1346+ }
13091347}
0 commit comments