Switch to using a trait to hold the user organisation stuff

This commit is contained in:
2022-03-05 17:26:23 +00:00
parent 299a6709cd
commit ab530e71a1
3 changed files with 140 additions and 117 deletions

View File

@@ -1476,7 +1476,7 @@ class OrganisationMembersController extends SimpleController
* *
* @return User|null * @return User|null
*/ */
protected function getUserFromParams(array $params): ?User protected function getUserFromParams(array $params)
{ {
// Load the request schema // Load the request schema
$schema = new RequestSchema('schema://requests/user/get-by-username.yaml'); $schema = new RequestSchema('schema://requests/user/get-by-username.yaml');

View File

@@ -0,0 +1,135 @@
<?php
/*
* AVSDev UF Organisations (https://avsdev.uk)
*
* @link https://git.avsdev.uk/avsdev/sprinkle-organisations
* @license https://git.avsdev.uk/avsdev/sprinkle-organisations/blob/master/LICENSE.md (LGPL-3.0 License)
*/
namespace UserFrosting\Sprinkle\Organisations\Database\ModelTraits;
trait UserOrganisations {
/**
* 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;
}
/**
* 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;
}
});
}
}

View File

@@ -9,14 +9,10 @@
namespace UserFrosting\Sprinkle\Organisations\Database\Models; 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\Database\Models\User as UFUser;
use UserFrosting\Sprinkle\Account\Facades\Password;
use UserFrosting\Sprinkle\Core\Database\Models\Model; use UserFrosting\Sprinkle\Organisations\Database\ModelTraits\UserOrganisations;
use UserFrosting\Sprinkle\Core\Facades\Debug;
/** /**
* User Class. * User Class.
@@ -27,113 +23,5 @@ use UserFrosting\Sprinkle\Core\Facades\Debug;
*/ */
class User extends UFUser class User extends UFUser
{ {
/** use UserOrganisations;
* 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;
}
} }