Switch to using a trait to hold the user organisation stuff
This commit is contained in:
@@ -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');
|
||||||
|
|||||||
135
src/Database/ModelTraits/UserOrganisations.php
Normal file
135
src/Database/ModelTraits/UserOrganisations.php
Normal 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;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user