diff --git a/app/controllers/admin/statusgroups.php b/app/controllers/admin/statusgroups.php index e9e4e45711b213f3e8c0d1a1c18fd688ea2c6115..57ad3185f6949cf34c2d81d99f893fdaf856a6a6 100644 --- a/app/controllers/admin/statusgroups.php +++ b/app/controllers/admin/statusgroups.php @@ -380,7 +380,8 @@ class Admin_StatusgroupsController extends AuthenticatedController 'inst' => [ 'name' => _('Institut'), 'after_user_add' => function ($user_id) { - $newInstUser = new InstituteMember([$user_id, Context::getId()]); + $newInstUser = InstituteMember::findByUserAndInstitute($user_id, Context::getId()) ?: + InstituteMember::build(['user_id' => $user_id, 'institut_id' => Context::getId()]); if ($newInstUser->isNew() || $newInstUser->inst_perms == 'user') { $user = new User($user_id); $newInstUser->inst_perms = $user->perms; diff --git a/app/controllers/institute/members.php b/app/controllers/institute/members.php index 2fec9072c31e66efa346e040f2848f25b74f894b..162c96deb042b37709a5109ccff44f0a0d35f65b 100644 --- a/app/controllers/institute/members.php +++ b/app/controllers/institute/members.php @@ -297,7 +297,8 @@ class Institute_MembersController extends AuthenticatedController $enable_mail_dozent = in_array('dozenten', $additionalCheckboxes); foreach ($mp->getAddedUsers() as $u_id) { - $member = new InstituteMember([$u_id, $this->institute->id]); + $member = InstituteMember::findByUserAndInstitute($u_id, $this->institute->id) ?: + InstituteMember::build(['user_id' => $u_id, 'institut_id' => $this->institute->id]); if (!$member->isNew() && $member->inst_perms !== 'user') { // der Admin hat Tomaten auf den Augen, der Mitarbeiter sitzt schon im Institut @@ -442,7 +443,7 @@ class Institute_MembersController extends AuthenticatedController throw new Exception(_('Sie können sich nicht selbst aus der Einrichtung austragen.')); } - $member = InstituteMember::find([$user->id, $this->institute->id]); + $member = InstituteMember::findByUserAndInstitute($user->id, $this->institute->id); if ($member && $member->delete()) { PageLayout::postInfo(sprintf( _('%s wurde von der Liste des Personals gelöscht.'), diff --git a/app/controllers/settings/statusgruppen.php b/app/controllers/settings/statusgruppen.php index d7de2546cfc7d278f8affba5e55f961cd2123441..88e42df126669c2164a824abbe4c1689bf8a8de5 100644 --- a/app/controllers/settings/statusgruppen.php +++ b/app/controllers/settings/statusgruppen.php @@ -208,7 +208,8 @@ class Settings_StatusgruppenController extends Settings_SettingsController } elseif (!$group->addUser($this->user->id)) { PageLayout::postError(_('Fehler beim Eintragen in die Gruppe!')); } else { - $member = new InstituteMember([$this->user->id, $range_id]); + $member = InstituteMember::findByUserAndInstitute($this->user->id, $range_id) ?: + InstituteMember::build(['user_id' => $this->user->id, 'institut_id' => $range_id]); $member->inst_perms = $this->user->perms; $was_new = $member->isNew(); diff --git a/db/migrations/5.2.1_add_pk_for_user_inst.php b/db/migrations/5.2.1_add_pk_for_user_inst.php new file mode 100644 index 0000000000000000000000000000000000000000..1a4e49bdcc80c2864ebae26d794a9c2a1e3bed84 --- /dev/null +++ b/db/migrations/5.2.1_add_pk_for_user_inst.php @@ -0,0 +1,32 @@ +<?php + +class AddPkForUserInst extends Migration +{ + public function description() + { + return 'add simple pk for user_inst table'; + } + + public function up() + { + $db = DBManager::get(); + + $sql = 'ALTER TABLE user_inst + ADD id int(11) NOT NULL AUTO_INCREMENT FIRST, + DROP PRIMARY KEY, + ADD PRIMARY KEY (id), + ADD UNIQUE KEY user_inst (Institut_id, user_id)'; + $db->exec($sql); + } + + public function down() + { + $db = DBManager::get(); + + $sql = 'ALTER TABLE user_inst + DROP id, + DROP KEY user_inst, + ADD PRIMARY KEY (Institut_id, user_id)'; + $db->exec($sql); + } +} diff --git a/lib/classes/JsonApi/Routes/InstituteMemberships/InstituteMembershipsShow.php b/lib/classes/JsonApi/Routes/InstituteMemberships/InstituteMembershipsShow.php index 1f0067a8b9fdd2704f9aeb30ec47b29a60a79f0d..7662af34693d8a5e657490583f01b3de234da53f 100644 --- a/lib/classes/JsonApi/Routes/InstituteMemberships/InstituteMembershipsShow.php +++ b/lib/classes/JsonApi/Routes/InstituteMemberships/InstituteMembershipsShow.php @@ -17,7 +17,7 @@ class InstituteMembershipsShow extends JsonApiController */ public function __invoke(Request $request, Response $response, $args) { - if (!$membership = \InstituteMember::find(explode('_', $args['id'], 2))) { + if (!$membership = \InstituteMember::find($args['id'])) { throw new RecordNotFoundException(); } diff --git a/lib/models/InstituteMember.class.php b/lib/models/InstituteMember.class.php index fe1b19d8359d9df9bebc4a0bfb551cd5d2840671..4048fdd72f869ef61725b242be627e8f5170373e 100644 --- a/lib/models/InstituteMember.class.php +++ b/lib/models/InstituteMember.class.php @@ -134,6 +134,18 @@ class InstituteMember extends SimpleORMap implements PrivacyObject ); } + /** + * Finds an institute membership by user and institute id. + * + * @param string $user_id + * @param string $institute_id + * @return InstituteMember|null + */ + public static function findByUserAndInstitute($user_id, $institute_id) + { + return self::findOneBySQL('user_id = ? AND institut_id = ?', [$user_id, $institute_id]); + } + public function getUserFullname($format = 'full') { return User::build(array_merge(