Skip to content

Commit

Permalink
More optimisation
Browse files Browse the repository at this point in the history
  • Loading branch information
tobytwigger committed Mar 30, 2020
1 parent df61b8a commit d9ddd1b
Show file tree
Hide file tree
Showing 10 changed files with 274 additions and 34 deletions.
21 changes: 1 addition & 20 deletions app/Http/Controllers/ParticipantApi/RoleController.php
Expand Up @@ -11,36 +11,17 @@
use BristolSU\Module\AssignRoles\Http\Requests\ParticipantApi\RoleController\UpdateRequest;
use BristolSU\Support\Activity\Activity;
use BristolSU\Support\Authentication\Contracts\Authentication;
use BristolSU\Support\Logic\Contracts\LogicRepository;
use BristolSU\Support\Logic\Contracts\LogicTester;
use BristolSU\Support\ModuleInstance\ModuleInstance;

class RoleController extends Controller
{

/**
* @var LogicTester
*/
private $logicTester;

public function __construct(LogicTester $logicTester)
{
$this->logicTester = $logicTester;
}

public function index(Activity $activity, ModuleInstance $moduleInstance, Role $role, Authentication $authentication, LogicRepository $logicRepository)
public function index(Activity $activity, ModuleInstance $moduleInstance, Role $role, Authentication $authentication)
{
$this->authorize('role.index');
$roles = $role->allThroughGroup(
$authentication->getGroup()
);
if(settings('logic_group', null) !== null) {
$logic = $logicRepository->getById(settings('logic_group'));

$roles = $roles->filter(function(\BristolSU\ControlDB\Contracts\Models\Role $role) use ($logic) {
return $this->logicTester->evaluate($logic, null, $role->group(), $role);
})->values();
}

return $roles->map(function(\BristolSU\ControlDB\Contracts\Models\Role $role) {
$roleArray = $role->toArray();
Expand Down
39 changes: 39 additions & 0 deletions app/Http/Middleware/BindRoleRepository.php
@@ -0,0 +1,39 @@
<?php

namespace BristolSU\Module\AssignRoles\Http\Middleware;

use BristolSU\ControlDB\Contracts\Repositories\Pivots\UserGroup;
use BristolSU\ControlDB\Contracts\Repositories\Pivots\UserRole;
use BristolSU\ControlDB\Contracts\Repositories\Role;
use BristolSU\Module\AssignRoles\Support\LogicRoleRepository;
use BristolSU\Module\AssignRoles\Support\LogicUserGroupRepository;
use BristolSU\Support\Logic\Contracts\LogicTester;
use Illuminate\Http\Request;

class BindRoleRepository
{

/**
* @var LogicTester
*/
private $logicTester;

public function __construct(LogicTester $logicTester)
{
$this->logicTester = $logicTester;
}

public function handle(Request $request, \Closure $next)
{
app()->extend(Role::class, function($roleRepository, $app) {
return new LogicRoleRepository($roleRepository, $this->logicTester);
});

app()->extend(UserRole::class, function($userRole, $app) {
return new LogicUserGroupRepository($userRole, $this->logicTester);
});

return $next($request);
}

}
3 changes: 3 additions & 0 deletions app/Rules/PositionCanBeUsed.php
Expand Up @@ -5,6 +5,8 @@
use BristolSU\ControlDB\Contracts\Repositories\Role;
use BristolSU\Module\AssignRoles\Support\PositionSettingRetrieval;
use BristolSU\Support\Authentication\Contracts\Authentication;
use BristolSU\Support\Logic\Contracts\LogicRepository;
use BristolSU\Support\Logic\Facade\LogicTester;
use Illuminate\Contracts\Validation\Rule;

class PositionCanBeUsed implements Rule
Expand Down Expand Up @@ -42,6 +44,7 @@ public function passes($attribute, $value)
}
if(in_array($value, $settings['only_one_role'])) {
$roles = $this->roleRepository->allThroughGroup($this->group());

return $roles->filter(function(\BristolSU\ControlDB\Contracts\Models\Role $role) use ($value) {
return $role->positionId() === (int) $value;
})->count() === 0;
Expand Down
6 changes: 3 additions & 3 deletions app/Rules/UserIsAvailableToBeAssigned.php
Expand Up @@ -49,9 +49,9 @@ public function passes($attribute, $value)
return false;
}
$user = $this->userRepository->getById($value);
$logic = app(LogicRepository::class)->getById($settings['logic_id']);
return $user->roles()->filter(function(Role $role) use ($settings, $logic, $user) {
return LogicTester::evaluate($logic, $user, $role->group(), $role) && in_array($role->id(), $settings['user_only_has_one_role']);

return $user->roles()->filter(function(Role $role) use ($settings, $user) {
return in_array($role->id(), $settings['user_only_has_one_role']);
})->count() === 0;
}

Expand Down
121 changes: 121 additions & 0 deletions app/Support/LogicRoleRepository.php
@@ -0,0 +1,121 @@
<?php

namespace BristolSU\Module\AssignRoles\Support;

use BristolSU\ControlDB\Contracts\Models\Role as RoleModel;
use BristolSU\ControlDB\Contracts\Repositories\Role;
use BristolSU\Support\Logic\Contracts\LogicRepository;
use BristolSU\Support\Logic\Facade\LogicTester;
use Illuminate\Support\Collection;

class LogicRoleRepository implements Role
{

/**
* @var Role
*/
private $roleRepository;
/**
* @var \BristolSU\Support\Logic\Contracts\LogicTester
*/
private $logicTester;

public function __construct(Role $roleRepository, \BristolSU\Support\Logic\Contracts\LogicTester $logicTester)
{
$this->roleRepository = $roleRepository;
$this->logicTester = $logicTester;
}

/**
* @inheritDoc
*/
public function getById(int $id): RoleModel
{
return $this->roleRepository->getById($id);
}

/**
* @inheritDoc
*/
public function all(): Collection
{
return $this->filter($this->roleRepository->all());
}

/**
* @inheritDoc
*/
public function getByDataProviderId(int $dataProviderId): RoleModel
{
return $this->roleRepository->getByDataProviderId($dataProviderId);
}

/**
* @inheritDoc
*/
public function create(int $positionId, int $groupId, int $dataProviderId): RoleModel
{
return $this->roleRepository->create($positionId, $groupId, $dataProviderId);
}

/**
* @inheritDoc
*/
public function delete(int $id): void
{
$this->roleRepository->delete($id);
}

/**
* @inheritDoc
*/
public function allThroughGroup(\BristolSU\ControlDB\Contracts\Models\Group $group): Collection
{
return $this->filter($this->roleRepository->allThroughGroup($group));

}

/**
* @inheritDoc
*/
public function allThroughPosition(\BristolSU\ControlDB\Contracts\Models\Position $position): Collection
{
return $this->filter($this->roleRepository->allThroughPosition($position));
}

private function hasLogicGroup()
{
return $this->logicGroupId() !== null;
}

private function logicGroupId()
{
$id = settings('logic_group', null);
if($id === null) {
return null;
}
return (int) $id;
}

private function logicGroup()
{
return app(LogicRepository::class)->getById(
$this->logicGroupId()
);
}

private function isInLogicGroup(\BristolSU\ControlDB\Contracts\Models\Role $role)
{
return $this->logicTester->evaluate($this->logicGroup(), null, $role->group(), $role);
}

private function filter(Collection $roles)
{
if($this->hasLogicGroup()) {
return $roles->filter(function(\BristolSU\ControlDB\Contracts\Models\Role $role) {
return $this->isInLogicGroup($role);
})->values();
}
return $roles;
}
}
96 changes: 96 additions & 0 deletions app/Support/LogicUserGroupRepository.php
@@ -0,0 +1,96 @@
<?php

namespace BristolSU\Module\AssignRoles\Support;

use BristolSU\ControlDB\Contracts\Models\Role;
use BristolSU\ControlDB\Contracts\Models\User;
use BristolSU\ControlDB\Contracts\Repositories\Pivots\UserRole;
use BristolSU\Support\Logic\Contracts\LogicRepository;
use Illuminate\Support\Collection;

class LogicUserGroupRepository implements UserRole
{

/**
* @var UserRole
*/
private $userRoleRepository;
/**
* @var \BristolSU\Support\Logic\Contracts\LogicTester
*/
private $logicTester;

public function __construct(UserRole $userRoleRepository, \BristolSU\Support\Logic\Contracts\LogicTester $logicTester)
{
$this->userRoleRepository = $userRoleRepository;
$this->logicTester = $logicTester;
}

/**
* @inheritDoc
*/
public function getUsersThroughRole(Role $role): Collection
{
return $this->userRoleRepository->getUsersThroughRole($role);
}

/**
* @inheritDoc
*/
public function getRolesThroughUser(User $user): Collection
{
return $this->filter($this->userRoleRepository->getRolesThroughUser($user));
}

/**
* @inheritDoc
*/
public function addUserToRole(User $user, Role $role): void
{
$this->userRoleRepository->addUserToRole($user, $role);
}

/**
* @inheritDoc
*/
public function removeUserFromRole(User $user, Role $role): void
{
$this->userRoleRepository->removeUserFromRole($user, $role);
}

private function hasLogicGroup()
{
return $this->logicGroupId() !== null;
}

private function logicGroupId()
{
$id = settings('logic_group', null);
if($id === null) {
return null;
}
return (int) $id;
}

private function logicGroup()
{
return app(LogicRepository::class)->getById(
$this->logicGroupId()
);
}

private function isInLogicGroup(\BristolSU\ControlDB\Contracts\Models\Role $role)
{
return $this->logicTester->evaluate($this->logicGroup(), null, $role->group(), $role);
}

private function filter(Collection $roles)
{
if($this->hasLogicGroup()) {
return $roles->filter(function(\BristolSU\ControlDB\Contracts\Models\Role $role) {
return $this->isInLogicGroup($role);
})->values();
}
return $roles;
}
}
4 changes: 3 additions & 1 deletion routes/admin/web.php
Expand Up @@ -13,4 +13,6 @@

use Illuminate\Support\Facades\Route;

Route::get('/', 'AdminPageController@index');
Route::middleware([\BristolSU\Module\AssignRoles\Http\Middleware\BindRoleRepository::class])->group(function() {
Route::get('/', 'AdminPageController@index');
});
2 changes: 1 addition & 1 deletion routes/participant/api.php
Expand Up @@ -2,7 +2,7 @@

use Illuminate\Support\Facades\Route;

Route::namespace('ParticipantApi')->group(function() {
Route::namespace('ParticipantApi')->middleware(\BristolSU\Module\AssignRoles\Http\Middleware\BindRoleRepository::class)->group(function() {
Route::resource('role', 'RoleController')->only('index', 'store', 'destroy', 'update');

Route::prefix('role/{role}')->group(function() {
Expand Down
4 changes: 3 additions & 1 deletion routes/participant/web.php
Expand Up @@ -13,4 +13,6 @@

use Illuminate\Support\Facades\Route;

Route::get('/', 'ParticipantPageController@index');
Route::middleware([\BristolSU\Module\AssignRoles\Http\Middleware\BindRoleRepository::class])->group(function() {
Route::get('/', 'ParticipantPageController@index');
});
12 changes: 4 additions & 8 deletions tests/Http/Controllers/ParticipantApi/RoleControllerTest.php
Expand Up @@ -8,6 +8,8 @@
use BristolSU\ControlDB\Models\Position;
use BristolSU\ControlDB\Models\Role;
use BristolSU\Module\AssignRoles\Http\Controllers\ParticipantApi\RoleController;
use BristolSU\Module\AssignRoles\Http\Middleware\BindRoleRepository;
use BristolSU\Module\AssignRoles\Support\LogicRoleRepository;
use BristolSU\Module\AssignRoles\Support\PositionSettingRetrieval;
use BristolSU\Module\Tests\AssignRoles\TestCase;
use BristolSU\Support\Logic\Contracts\Audience\LogicAudience;
Expand Down Expand Up @@ -127,19 +129,13 @@ public function index_returns_all_roles_through_a_group_that_are_also_in_the_log
->fail(null, $rolesNotInGroup[4]->group(), $rolesNotInGroup[4])
->otherwise(true);

$this->app->when(RoleController::class)

$this->app->when(BindRoleRepository::class)
->needs(\BristolSU\Support\Logic\Contracts\LogicTester::class)
->give(function() {
return $this->logicTester();
});

// $logicAudience = $this->prophesize(LogicAudience::class);
// $logicAudience->roleAudience(Argument::that(function($arg) use ($logicGroup) {
// return $arg instanceof Logic && $arg->is($logicGroup);
// }))->shouldBeCalled()->willReturn(collect($rolesInLogicGroup));
// $this->instance(LogicAudience::class, $logicAudience->reveal());
//


$response = $this->getJson($this->userApiUrl('/role'));
$response->assertStatus(200);
Expand Down

0 comments on commit d9ddd1b

Please sign in to comment.