From be8404c9a54c0c970c42acb530f884a9c5f4bb4a Mon Sep 17 00:00:00 2001 From: Craig Williams Date: Tue, 22 Feb 2022 13:47:44 +0000 Subject: [PATCH] Split pending organisations into a separate list and default to only returning organisations a user is an accepted member of (Fixes #1) --- .../OrganisationMembersController.php | 4 +-- .../OrganisationRegistrationController.php | 4 +-- src/Controller/UserController.php | 2 +- src/Database/Models/User.php | 30 +++++++++++++++++-- src/Sprunje/UserSprunje.php | 2 +- templates/navigation/sidebar-menu.html.twig | 2 +- templates/pages/organisations.html.twig | 2 +- templates/tables/organisations.html.twig | 2 +- templates/tables/users.html.twig | 13 ++++---- 9 files changed, 44 insertions(+), 17 deletions(-) diff --git a/src/Controller/OrganisationMembersController.php b/src/Controller/OrganisationMembersController.php index 6be5c0a..7a4736f 100644 --- a/src/Controller/OrganisationMembersController.php +++ b/src/Controller/OrganisationMembersController.php @@ -80,7 +80,7 @@ class OrganisationMembersController extends SimpleController throw new NotFoundException(); } - if ($config['organisation']['membership']['single_membership'] && $currentUser->organisations()->count() > 0) { + if ($config['organisation']['membership']['single_membership'] && $currentUser->organisations(true)->count() > 0) { $ms->addMessageTranslated('danger', 'ORGANISATION.JOIN_REQUEST.ALREADY_IN_ONE'); return $response->withJson([], 400); } @@ -294,7 +294,7 @@ class OrganisationMembersController extends SimpleController // Begin transaction - DB will be rolled back if an exception occurs Capsule::transaction(function () use ($organisation, $currentUser) { - $currentUser->organisations()->detach($organisation->id); + $currentUser->organisations(true)->detach($organisation->id); // Create activity record $this->ci->userActivityLogger->info("User {$currentUser->user_name} left organisation {$organisation->name}.", [ diff --git a/src/Controller/OrganisationRegistrationController.php b/src/Controller/OrganisationRegistrationController.php index bf68815..0688d19 100644 --- a/src/Controller/OrganisationRegistrationController.php +++ b/src/Controller/OrganisationRegistrationController.php @@ -75,7 +75,7 @@ class OrganisationRegistrationController extends SimpleController throw new ForbiddenException(); } - if ($config['organisation']['membership']['single_membership'] && $currentUser->organisations()->count() > 0) { + if ($config['organisation']['membership']['single_membership'] && $currentUser->organisations(true)->count() > 0) { $ms->addMessageTranslated('danger', 'ORGANISATION.REGISTRATION.ALREADY_IN_ONE', $data); return $response->withJson([], 400); } @@ -600,7 +600,7 @@ class OrganisationRegistrationController extends SimpleController throw new ForbiddenException(); } - if ($config['organisation']['membership']['single_membership'] && $currentUser->organisations()->count() > 0) { + if ($config['organisation']['membership']['single_membership'] && $currentUser->organisations(true)->count() > 0) { throw new BadRequestException(); } diff --git a/src/Controller/UserController.php b/src/Controller/UserController.php index b05ee9c..c3c234a 100644 --- a/src/Controller/UserController.php +++ b/src/Controller/UserController.php @@ -255,7 +255,7 @@ class UserController extends UFUserController foreach ($fieldValue as $field) { $newOrganisations[$field['organisation_id']] = ['flag_admin' => $field['flag_admin'] == 1]; } - $user->organisations()->sync($newOrganisations); + $user->organisations(true)->sync($newOrganisations); } else { $user->$fieldName = $fieldValue; $user->save(); diff --git a/src/Database/Models/User.php b/src/Database/Models/User.php index d6f657c..b0403fa 100644 --- a/src/Database/Models/User.php +++ b/src/Database/Models/User.php @@ -32,7 +32,30 @@ class User extends UFUser * * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany */ - public function organisations() + public function organisations($withPending = false) + { + /** @var \UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ + $classMapper = static::$ci->classMapper; + + $query = $this->belongsToMany( + $classMapper->getClassMapping('organisation'), 'organisation_members', 'user_id', 'organisation_id' + ) + ->orderBy('organisations.name', 'asc') + ->withPivot(['flag_admin', 'flag_approved']); + + if ($withPending !== true) { + $query = $query->wherePivot('flag_approved', true); + } + + return $query; + } + + /** + * Get all organisations this user is attempting to join. + * + * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany + */ + public function pendingOrganisations() { /** @var \UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ $classMapper = static::$ci->classMapper; @@ -41,7 +64,8 @@ class User extends UFUser $classMapper->getClassMapping('organisation'), 'organisation_members', 'user_id', 'organisation_id' ) ->orderBy('organisations.name', 'asc') - ->withPivot(['flag_admin', 'flag_approved']); + ->withPivot(['flag_admin', 'flag_approved']) + ->wherePivot('flag_approved', false); } /** @@ -65,7 +89,7 @@ class User extends UFUser ->where('approver_id', $this->id) ->update(['approver_id' => null]); - $this->organisations()->detach(); + $this->organisations(true)->detach(); $this->refresh(); } diff --git a/src/Sprunje/UserSprunje.php b/src/Sprunje/UserSprunje.php index 17573cf..f038551 100644 --- a/src/Sprunje/UserSprunje.php +++ b/src/Sprunje/UserSprunje.php @@ -44,7 +44,7 @@ class UserSprunje extends UFUserSprunje $query = parent::baseQuery(); // Join user's organisations - return $query->joinOrganisations()->with('organisations'); + return $query->joinOrganisations(true)->with('organisations')->with('pendingOrganisations'); } /** diff --git a/templates/navigation/sidebar-menu.html.twig b/templates/navigation/sidebar-menu.html.twig index 737b56c..6b0572c 100644 --- a/templates/navigation/sidebar-menu.html.twig +++ b/templates/navigation/sidebar-menu.html.twig @@ -45,7 +45,7 @@