diff --git a/src/Models/Permissions/Role.php b/src/Models/Permissions/Role.php index 23a0991..752f525 100644 --- a/src/Models/Permissions/Role.php +++ b/src/Models/Permissions/Role.php @@ -27,14 +27,19 @@ namespace Seatplus\Auth\Models\Permissions; use Illuminate\Database\Eloquent\Relations\HasMany; +use Seatplus\Auth\Enums\RoleType; use Seatplus\Auth\Models\AccessControl\RoleMembership; use Spatie\Permission\Models\Role as SpatieRole; /** - * @property string $type + * @property RoleType $type */ class Role extends SpatieRole { + protected $casts = [ + 'type' => RoleType::class, + ]; + public function affiliations(): HasMany { return $this->hasMany(Affiliation::class, 'role_id'); diff --git a/src/Services/Roles/AbstractRoleService.php b/src/Services/Roles/AbstractRoleService.php index a058c36..8557644 100644 --- a/src/Services/Roles/AbstractRoleService.php +++ b/src/Services/Roles/AbstractRoleService.php @@ -142,12 +142,12 @@ public function setRoleType(RoleType $roleType): void $originalRoleType = $this->role->type; // if the role type has not changed, we return early - if ($originalRoleType === $roleType->value) { + if ($originalRoleType === $roleType) { return; } $this->role->update([ - 'type' => $roleType->value, + 'type' => $roleType, ]); $this->resetRoleMemberships(); diff --git a/src/Services/Roles/BaseRoleService.php b/src/Services/Roles/BaseRoleService.php index 474cefc..3e68990 100644 --- a/src/Services/Roles/BaseRoleService.php +++ b/src/Services/Roles/BaseRoleService.php @@ -57,15 +57,19 @@ public function optIn(): OptInRoleService */ public function getTypeService(): RoleServiceInterface { - return match ($this->role->type) { - RoleType::AUTOMATIC->value => $this->automatic(), - RoleType::ON_REQUEST->value => $this->onRequest(), - RoleType::MANUAL->value => $this->manual(), - RoleType::OPT_IN->value => $this->optIn(), - default => throw new \Exception('Role type supported'), + return match ($this->getType()) { + RoleType::AUTOMATIC => $this->automatic(), + RoleType::ON_REQUEST => $this->onRequest(), + RoleType::MANUAL => $this->manual(), + RoleType::OPT_IN => $this->optIn(), }; } + public function getType(): RoleType + { + return $this->role->type; + } + public function handleMembers(): void { $this->getTypeService()->handleMembers(); diff --git a/src/Services/Roles/OptInRoleService.php b/src/Services/Roles/OptInRoleService.php index 74430c2..9e8ec11 100644 --- a/src/Services/Roles/OptInRoleService.php +++ b/src/Services/Roles/OptInRoleService.php @@ -59,6 +59,6 @@ public function canJoin(User $user): bool public function canModerate(User $user): bool { - return false; + return $this->isModerator($user); } } diff --git a/tests/Unit/Actions/ManageManualRoleActionTest.php b/tests/Unit/Actions/ManageManualRoleActionTest.php index fe10e4c..09bfd47 100644 --- a/tests/Unit/Actions/ManageManualRoleActionTest.php +++ b/tests/Unit/Actions/ManageManualRoleActionTest.php @@ -28,7 +28,7 @@ $action->execute($role_request); - expect($role->refresh()->type)->toBe('manual'); + expect($role->refresh()->type)->toBe(\Seatplus\Auth\Enums\RoleType::MANUAL); }); it('updates the role name', function () { diff --git a/tests/Unit/Models/RoleModelTest.php b/tests/Unit/Models/RoleModelTest.php index 255d7a5..bd764cb 100644 --- a/tests/Unit/Models/RoleModelTest.php +++ b/tests/Unit/Models/RoleModelTest.php @@ -84,7 +84,7 @@ }); it('has default type attribute', function () { - expect(test()->role->fresh()->type)->toEqual('manual'); + expect(test()->role->fresh()->type)->toEqual(\Seatplus\Auth\Enums\RoleType::MANUAL); }); it('has role memberships', function () { diff --git a/tests/Unit/Services/Roles/AbstractRoleServiceTest.php b/tests/Unit/Services/Roles/AbstractRoleServiceTest.php index fb456db..c261d5c 100644 --- a/tests/Unit/Services/Roles/AbstractRoleServiceTest.php +++ b/tests/Unit/Services/Roles/AbstractRoleServiceTest.php @@ -54,7 +54,7 @@ public function canModerate(\Seatplus\Auth\Models\User $user): bool it('returns early when setting same role type', function () { // Arrange - $this->role->type = RoleType::AUTOMATIC->value; + $this->role->type = RoleType::AUTOMATIC; $this->role->save(); // Act @@ -64,7 +64,7 @@ public function canModerate(\Seatplus\Auth\Models\User $user): bool ]); // Assert - expect($this->role->refresh()->type)->toEqual(RoleType::AUTOMATIC->value); + expect($this->role->refresh()->type)->toEqual(RoleType::AUTOMATIC); }); it('sets role type to', function (RoleType $role_type) { @@ -73,7 +73,7 @@ public function canModerate(\Seatplus\Auth\Models\User $user): bool $this->service->setRoleType($role_type); // Assert - expect($this->role->refresh()->type)->toEqual($role_type->value); + expect($this->role->refresh()->type)->toEqual($role_type); })->with([ RoleType::AUTOMATIC, RoleType::ON_REQUEST, diff --git a/tests/Unit/Services/Roles/AutomaticRoleServiceTest.php b/tests/Unit/Services/Roles/AutomaticRoleServiceTest.php index 01121c9..9808686 100644 --- a/tests/Unit/Services/Roles/AutomaticRoleServiceTest.php +++ b/tests/Unit/Services/Roles/AutomaticRoleServiceTest.php @@ -1,5 +1,6 @@ role->type)->toBe('manual'); + expect($this->role->type)->toBe(RoleType::MANUAL); - $this->service->setRoleType(\Seatplus\Auth\Enums\RoleType::AUTOMATIC); + $this->service->setRoleType(RoleType::AUTOMATIC); - expect($this->role->type)->toBe('automatic'); + expect($this->role->type)->toBe(RoleType::AUTOMATIC); }); it('cannot view', function () {