From cc4a9f0d2f238c258850951f4641e34cf4413b7b Mon Sep 17 00:00:00 2001 From: Jan-Hendrik Willms <tleilax+studip@gmail.com> Date: Fri, 2 Jun 2023 09:17:04 +0000 Subject: [PATCH] remove all consultation responsibilities upon range deletion and clean up db table, fixes #2673 Closes #2673 Merge request studip/studip!1813 --- ..._cleanup_consultation_responsibilities.php | 33 ++++++++++++++ lib/models/ConsultationResponsibility.php | 43 +++++++++++++++++++ lib/models/Institute.class.php | 8 ++++ lib/models/Statusgruppen.php | 14 ++++++ lib/models/User.class.php | 8 ++++ 5 files changed, 106 insertions(+) create mode 100644 db/migrations/5.1.48_cleanup_consultation_responsibilities.php diff --git a/db/migrations/5.1.48_cleanup_consultation_responsibilities.php b/db/migrations/5.1.48_cleanup_consultation_responsibilities.php new file mode 100644 index 00000000000..0dc3bfc988c --- /dev/null +++ b/db/migrations/5.1.48_cleanup_consultation_responsibilities.php @@ -0,0 +1,33 @@ +<?php +final class CleanupConsultationResponsibilities extends Migration +{ + public function description() + { + return 'Remove all orphaned entries in table "consultation_responsibilities"'; + } + + protected function up() + { + $query = "DELETE FROM `consultation_responsibilities` + WHERE ( + `range_type` = 'user' + AND `range_id` NOT IN ( + SELECT `user_id` + FROM `auth_user_md5` + ) + ) OR ( + `range_type` = 'institute' + AND `range_id` NOT IN ( + SELECT `Institut_id` + FROM `Institute` + ) + ) OR ( + `range_type` = 'statusgroup' + AND `range_id` NOT IN ( + SELECT `statusgruppe_id` + FROM `statusgruppen` + ) + )"; + DBManager::get()->exec($query); + } +} diff --git a/lib/models/ConsultationResponsibility.php b/lib/models/ConsultationResponsibility.php index 9634d415394..72cd12eb16b 100644 --- a/lib/models/ConsultationResponsibility.php +++ b/lib/models/ConsultationResponsibility.php @@ -24,6 +24,49 @@ class ConsultationResponsibility extends SimpleORMap parent::configure($config); } + /** + * Finds all responsibilities for a given user id. + * + * @param string $user_id + * @return array + */ + public static function findByUserId(string $user_id): array + { + return self::findBySQL( + "range_id = ? AND range_type = 'user'", + [$user_id] + ); + } + + /** + * Finds all responsibilities for a given institute id. + * + * @param string $institute_id + * @return array + */ + public static function findByInstituteId(string $institute_id): array + { + return self::findBySQL( + "range_id = ? AND range_type = 'institute'", + [$institute_id] + ); + } + + /** + * Finds all responsibilities for a given statusgroup id. + * + * @param string $statusgroup_id + * + * @return array + */ + public static function findByStatusgroupId(string $statusgroup_id): array + { + return self::findBySQL( + "range_id = ? AND range_type = 'statusgroup'", + [$statusgroup_id] + ); + } + /** * Returns the name of the associated responsibility. * diff --git a/lib/models/Institute.class.php b/lib/models/Institute.class.php index 9e662cc32e2..b6ec72bcdb1 100644 --- a/lib/models/Institute.class.php +++ b/lib/models/Institute.class.php @@ -37,6 +37,9 @@ * @property SimpleORMapCollection datafields has_many DatafieldEntryModel * @property Institute faculty belongs_to Institute * @property SimpleORMapCollection courses has_and_belongs_to_many Course + * + * @property ConsultationBlock[]|SimpleORMapCollection $consultation_blocks + * @property ConsultationResponsibility[]|SimpleORMapCollection $consultation_responsibilities */ class Institute extends SimpleORMap implements Range @@ -112,6 +115,11 @@ class Institute extends SimpleORMap implements Range 'assoc_foreign_key' => 'range_id', 'on_delete' => 'delete', ]; + $config['has_many']['consultation_responsibilities'] = [ + 'class_name' => ConsultationResponsibility::class, + 'assoc_func' => 'findByInstituteId', + 'on_delete' => 'delete', + ]; $config['has_many']['tools'] = [ 'class_name' => ToolActivation::class, 'assoc_foreign_key' => 'range_id', diff --git a/lib/models/Statusgruppen.php b/lib/models/Statusgruppen.php index 64623b2a237..ebf8e133f00 100644 --- a/lib/models/Statusgruppen.php +++ b/lib/models/Statusgruppen.php @@ -36,6 +36,9 @@ * @property Course course belongs_to course * @property Institute institute belongs_to institute * @property User user belongs_to user + * + * @property ConsultationBlock[]|SimpleORMapCollection $consultation_blocks + * @property ConsultationResponsibility[]|SimpleORMapCollection $consultation_responsibilities */ class Statusgruppen extends SimpleORMap implements PrivacyObject { @@ -77,6 +80,17 @@ class Statusgruppen extends SimpleORMap implements PrivacyObject 'on_store' => 'store', 'on_delete' => 'delete' ]; + $config['has_many']['consultation_blocks'] = [ + 'class_name' => ConsultationBlock::class, + 'assoc_foreign_key' => 'range_id', + 'on_delete' => 'delete', + ]; + $config['has_many']['consultation_responsibilities'] = [ + 'class_name' => ConsultationResponsibility::class, + 'assoc_func' => 'findByStatusgroupId', + 'on_delete' => 'delete', + ]; + $config['additional_fields']['children'] = true; $config['default_values']['position'] = null; diff --git a/lib/models/User.class.php b/lib/models/User.class.php index 4510e013017..9fa05226859 100644 --- a/lib/models/User.class.php +++ b/lib/models/User.class.php @@ -68,6 +68,9 @@ * @property UserOnline online has_one UserOnline * @property Kategorie[]|SimpleORMapCollection $profile_categories has_many Kategorie * @property UserDomain[]|SimpleORMapCollection $domains + * @property ConsultationBlock[]|SimpleORMapCollection $consultation_blocks + * @property ConsultationBooking[]|SimpleORMapCollection $consultation_bookings + * @property ConsultationResponsibility[]|SimpleORMapCollection $consultation_responsibilities * * @property UserConfig config */ @@ -161,6 +164,11 @@ class User extends AuthUserMd5 implements Range, PrivacyObject 'class_name' => ConsultationBooking::class, 'on_delete' => 'delete', ]; + $config['has_many']['consultation_responsibilities'] = [ + 'class_name' => ConsultationResponsibility::class, + 'assoc_func' => 'findByUserId', + 'on_delete' => 'delete', + ]; $config['has_many']['profile_categories'] = [ 'class_name' => Kategorie::class, 'assoc_foreign_key' => 'range_id', -- GitLab