From ab530e71a17ab2fc47b4066c9a901f86ea834145 Mon Sep 17 00:00:00 2001 From: Craig Williams Date: Sat, 5 Mar 2022 17:26:23 +0000 Subject: [PATCH] Switch to using a trait to hold the user organisation stuff --- .../OrganisationMembersController.php | 2 +- .../ModelTraits/UserOrganisations.php | 135 ++++++++++++++++++ src/Database/Models/User.php | 120 +--------------- 3 files changed, 140 insertions(+), 117 deletions(-) create mode 100644 src/Database/ModelTraits/UserOrganisations.php diff --git a/src/Controller/OrganisationMembersController.php b/src/Controller/OrganisationMembersController.php index bd7a134..e23388e 100644 --- a/src/Controller/OrganisationMembersController.php +++ b/src/Controller/OrganisationMembersController.php @@ -1476,7 +1476,7 @@ class OrganisationMembersController extends SimpleController * * @return User|null */ - protected function getUserFromParams(array $params): ?User + protected function getUserFromParams(array $params) { // Load the request schema $schema = new RequestSchema('schema://requests/user/get-by-username.yaml'); diff --git a/src/Database/ModelTraits/UserOrganisations.php b/src/Database/ModelTraits/UserOrganisations.php new file mode 100644 index 0000000..4a02c9f --- /dev/null +++ b/src/Database/ModelTraits/UserOrganisations.php @@ -0,0 +1,135 @@ +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; + + return $this->belongsToMany( + $classMapper->getClassMapping('organisation'), 'organisation_members', 'user_id', 'organisation_id' + ) + ->orderBy('organisations.name', 'asc') + ->withPivot(['flag_admin', 'flag_approved']) + ->wherePivot('flag_approved', false); + } + + /** + * Get all organisations this user is and administrator for (including pending) + * + * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany + */ + public function adminForOrganisations($excludePending = 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']) + ->wherePivot('flag_admin', true); + + if ($excludePending === true) { + $query = $query->wherePivot('flag_approved', true); + } + + return $query; + } + + + /** + * Joins the user's organisations directly, so we can do things like sort, search, paginate, etc. + * + * @param Builder $query + * + * @return Builder + */ + public function scopeJoinOrganisations($query) + { + $query = $query->select('users.*')->distinct(); + + $query = $query->leftJoin('organisation_members', 'organisation_members.user_id', '=', 'users.id'); + $query = $query->leftJoin('organisations', 'organisations.id', '=', 'organisation_members.organisation_id'); + + return $query; + } + + + /** + * Handle user being deleted. + */ + public function deleteUserOrganisations($hardDelete = false) { + /** @var \UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ + $classMapper = static::$ci->classMapper; + + if ($hardDelete) { + $classMapper->getClassMapping('organisation')::query() + ->where('registrant_id', $this->id) + ->update(['registrant_id' => null]); + + $classMapper->getClassMapping('organisation_approval')::query() + ->where('approver_id', $this->id) + ->update(['approver_id' => null]); + + $classMapper->getClassMapping('organisation_membership_approval')::query() + ->where('approver_id', $this->id) + ->update(['approver_id' => null]); + + $this->organisations(true)->detach(); + + $this->refresh(); + } + + return true; + } + + + public function bootUserOrganisations() + { + static::deleting(function ($user) { + if (!$user->deleteUserOrganisations($user->isForceDeleting())) { + return false; + } + }); + } +} \ No newline at end of file diff --git a/src/Database/Models/User.php b/src/Database/Models/User.php index d58b390..a4a8938 100644 --- a/src/Database/Models/User.php +++ b/src/Database/Models/User.php @@ -9,14 +9,10 @@ namespace UserFrosting\Sprinkle\Organisations\Database\Models; -use Carbon\Carbon; -use Illuminate\Database\Eloquent\Builder; -use Illuminate\Database\Eloquent\SoftDeletes; -use UserFrosting\Sprinkle\Account\Database\Models\Interfaces\UserInterface; use UserFrosting\Sprinkle\Account\Database\Models\User as UFUser; -use UserFrosting\Sprinkle\Account\Facades\Password; -use UserFrosting\Sprinkle\Core\Database\Models\Model; -use UserFrosting\Sprinkle\Core\Facades\Debug; + +use UserFrosting\Sprinkle\Organisations\Database\ModelTraits\UserOrganisations; + /** * User Class. @@ -27,113 +23,5 @@ use UserFrosting\Sprinkle\Core\Facades\Debug; */ class User extends UFUser { - /** - * Get all organisations this user is a member of. - * - * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany - */ - 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; - - return $this->belongsToMany( - $classMapper->getClassMapping('organisation'), 'organisation_members', 'user_id', 'organisation_id' - ) - ->orderBy('organisations.name', 'asc') - ->withPivot(['flag_admin', 'flag_approved']) - ->wherePivot('flag_approved', false); - } - - /** - * Get all organisations this user is and administrator for (including pending) - * - * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany - */ - public function adminForOrganisations($excludePending = 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']) - ->wherePivot('flag_admin', true); - - if ($excludePending === true) { - $query = $query->wherePivot('flag_approved', true); - } - - return $query; - } - - /** - * Delete this member from the database, along with any links to organisations. - * - * @param bool $hardDelete Set to true to completely remove the member and all associated objects. - * - * @return bool true if the deletion was successful, false otherwise. - */ - public function delete($hardDelete = false) - { - /** @var \UserFrosting\Sprinkle\Core\Util\ClassMapper $classMapper */ - $classMapper = static::$ci->classMapper; - - if ($hardDelete) { - $classMapper->getClassMapping('organisation')::query() - ->where('registrant_id', $this->id) - ->update(['registrant_id' => null]); - - $classMapper->getClassMapping('organisation_approval')::query() - ->where('approver_id', $this->id) - ->update(['approver_id' => null]); - - $this->organisations(true)->detach(); - $this->refresh(); - } - - return parent::delete(); - } - - /** - * Joins the user's organisations directly, so we can do things like sort, search, paginate, etc. - * - * @param Builder $query - * - * @return Builder - */ - public function scopeJoinOrganisations($query) - { - $query = $query->select('users.*')->distinct(); - - $query = $query->leftJoin('organisation_members', 'organisation_members.user_id', '=', 'users.id'); - $query = $query->leftJoin('organisations', 'organisations.id', '=', 'organisation_members.organisation_id'); - - return $query; - } + use UserOrganisations; }