diff --git a/db/migrations/5.1.56_cleanup_blubber.php b/db/migrations/5.1.56_cleanup_blubber.php new file mode 100644 index 0000000000000000000000000000000000000000..86348bcb0ba9960f46654d4850b7c883612e5d32 --- /dev/null +++ b/db/migrations/5.1.56_cleanup_blubber.php @@ -0,0 +1,46 @@ +<?php +/** + * @see https://gitlab.studip.de/studip/studip/-/issues/4097 + */ +return new class extends Migration +{ + public function description() + { + return 'Removes orhpaned blubber entries'; + } + + protected function up() + { + $query = "DELETE bt, ouv + FROM `blubber_threads` AS bt + LEFT JOIN `object_user_visits` AS ouv + ON (bt.`thread_id` = ouv.`object_id`) + WHERE bt.`external_contact` = 0 + AND bt.`user_id` NOT IN ( + SELECT `user_id` FROM `auth_user_md5` + )"; + DBManager::get()->exec($query); + + $query = "DELETE FROM `blubber_comments` + WHERE ( + `external_contact` = 0 + AND `user_id` NOT IN ( + SELECT `user_id` FROM `auth_user_md5` + ) + ) OR `thread_id` NOT IN ( + SELECT `thread_id` FROM `blubber_threads` + )"; + DBManager::get()->exec($query); + + $query = "DELETE FROM `blubber_mentions` + WHERE ( + `external_contact` = 0 + AND `user_id` NOT IN ( + SELECT `user_id` FROM `auth_user_md5` + ) + ) OR `thread_id` NOT IN ( + SELECT `thread_id` FROM `blubber_threads` + )"; + DBManager::get()->exec($query); + } +}; diff --git a/lib/classes/UserManagement.class.php b/lib/classes/UserManagement.class.php index c831b855a4a5253af330fa13b6883b946304a965..e3d9aa38be2be383085413dfdb79df90d057465b 100644 --- a/lib/classes/UserManagement.class.php +++ b/lib/classes/UserManagement.class.php @@ -1122,18 +1122,6 @@ class UserManagement // delete the datafields $localEntries = DataFieldEntry::removeAll($user_id); - // delete all blubber entrys - $query = "DELETE blubber_threads, blubber_mentions, blubber_comments - FROM blubber_threads - LEFT JOIN blubber_mentions USING (user_id) - LEFT JOIN blubber_comments USING (user_id) - WHERE user_id = ?"; - $statement = DBManager::get()->prepare($query); - $statement->execute([$user_id]); - if ($count = $statement->rowCount()) { - $msg .= 'info§' . sprintf(_('%s Blubber gelöscht.'), $count) . '§'; - } - // delete user from waiting lists $query = "SELECT seminar_id FROM admission_seminar_user WHERE user_id = ?"; $statement = DBManager::get()->prepare($query); diff --git a/lib/models/User.class.php b/lib/models/User.class.php index 056b48aea9bd6ac7c0290124a3acdfe2009e12de..ab92bade91297faddc679da133943db30ffa9e12 100644 --- a/lib/models/User.class.php +++ b/lib/models/User.class.php @@ -52,6 +52,9 @@ * @property SimpleORMapCollection|Kategorie[] $profile_categories has_many Kategorie * @property SimpleORMapCollection|MvvContact[] $mvv_assignments has_many MvvContact * @property SimpleORMapCollection|CourseMemberNotification[] $course_notifications has_many CourseMemberNotification + * @property SimpleORMapCollection|BlubberThread[] $blubber_threads has_many BlubberThread + * @property SimpleORMapCollection|BlubberComment[] $blubber_comments has_many BlubberComment + * @property SimpleORMapCollection|BlubberMention[] $blubber_mentions has_many BlubberMention * @property UserInfo $info has_one UserInfo * @property UserOnline $online has_one UserOnline * @property Courseware\Unit $courseware_units has_one Courseware\Unit @@ -206,6 +209,20 @@ class User extends AuthUserMd5 implements Range, PrivacyObject, Studip\Calendar\ 'assoc_foreign_key' => 'author_id' ]; + // Blubber relations + $config['has_many']['blubber_threads'] = [ + 'class_name' => BlubberThread::class, + 'on_delete' => 'delete', + ]; + $config['has_many']['blubber_comments'] = [ + 'class_name' => BlubberComment::class, + 'on_delete' => 'delete', + ]; + $config['has_many']['blubber_mentions'] = [ + 'class_name' => BlubberMention::class, + 'on_delete' => 'delete', + ]; + $config['additional_fields']['config']['get'] = function ($user) { return UserConfig::get($user->id); };