2828
2929use OC \Tagging \TagMapper ;
3030use OCP \DB \QueryBuilder \IQueryBuilder ;
31+ use OCP \EventDispatcher \Event ;
32+ use OCP \EventDispatcher \IEventListener ;
3133use OCP \IDBConnection ;
3234use OCP \ITagManager ;
3335use OCP \ITags ;
3436use OCP \IUserSession ;
37+ use OCP \User \Events \UserDeletedEvent ;
38+ use OCP \Db \Exception as DBException ;
39+ use Psr \Log \LoggerInterface ;
3540
36- class TagManager implements ITagManager {
41+ class TagManager implements ITagManager, IEventListener {
42+ private TagMapper $ mapper ;
43+ private IUserSession $ userSession ;
44+ private IDBConnection $ connection ;
45+ private LoggerInterface $ logger ;
3746
38- /** @var TagMapper */
39- private $ mapper ;
40-
41- /** @var IUserSession */
42- private $ userSession ;
43-
44- /** @var IDBConnection */
45- private $ connection ;
46-
47- public function __construct (TagMapper $ mapper , IUserSession $ userSession , IDBConnection $ connection ) {
47+ public function __construct (TagMapper $ mapper , IUserSession $ userSession , IDBConnection $ connection , LoggerInterface $ logger ) {
4848 $ this ->mapper = $ mapper ;
4949 $ this ->userSession = $ userSession ;
5050 $ this ->connection = $ connection ;
51+ $ this ->logger = $ logger ;
5152 }
5253
5354 /**
@@ -72,7 +73,7 @@ public function load($type, $defaultTags = [], $includeShared = false, $userId =
7273 }
7374 $ userId = $ this ->userSession ->getUser ()->getUId ();
7475 }
75- return new Tags ($ this ->mapper , $ userId , $ type , $ defaultTags );
76+ return new Tags ($ this ->mapper , $ userId , $ type , $ this -> logger , $ this -> connection , $ defaultTags );
7677 }
7778
7879 /**
@@ -97,4 +98,68 @@ public function getUsersFavoritingObject(string $objectType, int $objectId): arr
9798
9899 return $ users ;
99100 }
101+
102+ public function handle (Event $ event ): void {
103+ if (!($ event instanceof UserDeletedEvent)) {
104+ return ;
105+ }
106+
107+ // Find all objectid/tagId pairs.
108+ $ user = $ event ->getUser ();
109+ $ qb = $ this ->connection ->getQueryBuilder ();
110+ $ qb ->select ('id ' )
111+ ->from ('vcategory ' )
112+ ->where ($ qb ->expr ()->eq ('uid ' , $ qb ->createNamedParameter ($ user ->getUID ())));
113+ try {
114+ $ result = $ qb ->executeQuery ();
115+ } catch (DBException $ e ) {
116+ $ this ->logger ->error ($ e ->getMessage (), [
117+ 'app ' => 'core ' ,
118+ 'exception ' => $ e ,
119+ ]);
120+ }
121+
122+ $ tagsIds = array_map (fn (array $ row ) => (int )$ row ['id ' ], $ result ->fetchAll ());
123+ $ result ->closeCursor ();
124+
125+ if (count ($ tagsIds ) === 0 ) {
126+ return ;
127+ }
128+
129+ // Clean vcategory_to_object table
130+ $ qb = $ this ->connection ->getQueryBuilder ();
131+ $ qb = $ qb ->delete ('vcategory_to_object ' )
132+ ->where ($ qb ->expr ()->in ('categoryid ' , $ qb ->createParameter ('chunk ' )));
133+
134+ // Clean vcategory
135+ $ qb1 = $ this ->connection ->getQueryBuilder ();
136+ $ qb1 = $ qb1 ->delete ('vcategory ' )
137+ ->where ($ qb1 ->expr ()->in ('uid ' , $ qb1 ->createParameter ('chunk ' )));
138+
139+ foreach (array_chunk ($ tagsIds , 1000 ) as $ tagChunk ) {
140+ $ qb ->setParameter ('chunk ' , $ tagChunk , IQueryBuilder::PARAM_INT_ARRAY );
141+ $ qb1 ->setParameter ('chunk ' , $ tagChunk , IQueryBuilder::PARAM_INT_ARRAY );
142+ try {
143+ $ qb ->executeStatement ();
144+ $ qb1 ->executeStatement ();
145+ } catch (DBException $ e ) {
146+ $ this ->logger ->error ($ e ->getMessage (), [
147+ 'app ' => 'core ' ,
148+ 'exception ' => $ e ,
149+ ]);
150+ }
151+ }
152+
153+ foreach (array_chunk ($ tagsIds , 1000 ) as $ tagChunk ) {
154+ $ qb ->setParameter ('chunk ' , $ tagChunk , IQueryBuilder::PARAM_INT_ARRAY );
155+ try {
156+ $ qb ->executeStatement ();
157+ } catch (DBException $ e ) {
158+ $ this ->logger ->error ($ e ->getMessage (), [
159+ 'app ' => 'core ' ,
160+ 'exception ' => $ e ,
161+ ]);
162+ }
163+ }
164+ }
100165}
0 commit comments