Skip to content

Commit 8b30ffc

Browse files
committed
Implemented user roles
1 parent c2ca8f9 commit 8b30ffc

File tree

19 files changed

+225
-220
lines changed

19 files changed

+225
-220
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,3 +41,5 @@ gitleaks
4141

4242
# Gitleaks licence
4343
LICENSE
44+
45+
user_stories.md

app/Enums/RolesEnum.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,18 @@
55
namespace App\Enums;
66

77
enum RolesEnum: string {
8-
case ADMINISTRATOR = 'admin';
8+
case ADMIN = 'admin';
99

10-
case USER_MANAGER = 'user-manager';
10+
case ANNOTATION_MANAGER = 'annotation-manager';
1111

12-
case REGISTERED_USER = 'registered-user';
12+
case ANNOTATOR = 'annotator';
1313

1414
// extra helper to allow for greater customization of displayed values, without disclosing the name/value data directly
1515
public function label(): string {
1616
return match ($this) {
17-
self::ADMINISTRATOR => 'Administrator',
18-
self::USER_MANAGER => 'User Manager',
19-
self::REGISTERED_USER => 'Registered User',
17+
self::ADMIN => 'Admin',
18+
self::ANNOTATION_MANAGER => 'Annotation Manager',
19+
self::ANNOTATOR => 'Annotator',
2020
};
2121
}
2222
}

app/Http/Controllers/DashboardController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public function index(): Response|RedirectResponse {
2121
/** @var User $user */
2222
$user = Auth::user();
2323

24-
if ($user->hasRole(RolesEnum::REGISTERED_USER->value)) {
24+
if ($user->hasRole(RolesEnum::ANNOTATOR->value)) {
2525
return Inertia::render('dashboard-simple');
2626
}
2727

app/Http/Resources/UserInfoResource.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ private function resolvePermissions(): array {
2929

3030
$permissions = [];
3131

32-
if ($user->hasRole([RolesEnum::ADMINISTRATOR->value, RolesEnum::USER_MANAGER->value])) {
32+
if ($user->hasRole([RolesEnum::ADMIN->value, RolesEnum::ANNOTATION_MANAGER->value])) {
3333
$permissions['dashboard'] = true;
3434
}
3535

app/Policies/UserPolicy.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,12 @@ public function create(User $user): bool {
2323

2424
public function update(User $user, User $model): bool {
2525
// Admin can update anyone
26-
if ($user->hasRole(RolesEnum::ADMINISTRATOR->value)) {
26+
if ($user->hasRole(RolesEnum::ADMIN->value)) {
2727
return true;
2828
}
2929

30-
// User managers can't update admins
31-
if ($model->hasRole(RolesEnum::ADMINISTRATOR->value)) {
30+
// Annotation managers can't update admins
31+
if ($model->hasRole(RolesEnum::ADMIN->value)) {
3232
return false;
3333
}
3434

@@ -37,12 +37,12 @@ public function update(User $user, User $model): bool {
3737

3838
public function delete(User $user, User $model): bool {
3939
// Admin can delete anyone
40-
if ($user->hasRole(RolesEnum::ADMINISTRATOR->value)) {
40+
if ($user->hasRole(RolesEnum::ADMIN->value)) {
4141
return true;
4242
}
4343

44-
// User managers can't delete admins
45-
if ($model->hasRole(RolesEnum::ADMINISTRATOR->value)) {
44+
// Annotation managers can't delete admins
45+
if ($model->hasRole(RolesEnum::ADMIN->value)) {
4646
return false;
4747
}
4848

app/Providers/AppServiceProvider.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public function boot(): void {
4141
// Implicitly grant "Super Admin" role all permissions
4242
// This works in the app by using gate-related functions like auth()->user->can() and @can()
4343
// NOSONAR
44-
Gate::before(fn ($user, $ability): ?true => $user->hasRole(RolesEnum::ADMINISTRATOR) ? true : null);
44+
Gate::before(fn ($user, $ability): ?true => $user->hasRole(RolesEnum::ADMIN) ? true : null);
4545

4646
// Uncomment the following line to enable strict mode for Eloquent models
4747
/**

app/Services/User/UserService.php

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class UserService {
1313
* @param array<string, mixed> $data
1414
*/
1515
public function create(array $data): User {
16-
$role = $data['role'] ?? RolesEnum::REGISTERED_USER->value;
16+
$role = $data['role'] ?? RolesEnum::ANNOTATOR->value;
1717
unset($data['role']);
1818

1919
$user = User::query()->create($data);
@@ -77,18 +77,15 @@ public function getUsers(
7777
* @phpstan-return Collection<int, array{name: string, label: string}>
7878
*/
7979
public function getRolesForForm(): Collection {
80-
$roles = collect(RolesEnum::cases());
8180
/** @var User $user */
8281
$user = auth()->user();
8382

84-
// If user is not admin, further filter available roles
85-
if (! $user->hasRole(RolesEnum::ADMINISTRATOR->value)) {
86-
$roles = $roles->filter(
87-
fn (RolesEnum $rolesEnum): bool => $rolesEnum->value === RolesEnum::USER_MANAGER->value
88-
);
89-
}
83+
// Annotation managers can assign annotators and other annotation managers, but not admins
84+
$cases = $user->hasRole(RolesEnum::ADMIN->value)
85+
? RolesEnum::cases()
86+
: [RolesEnum::ANNOTATION_MANAGER, RolesEnum::ANNOTATOR];
9087

91-
return $roles->map(fn (RolesEnum $rolesEnum): array => [
88+
return collect($cases)->map(fn (RolesEnum $rolesEnum): array => [
9289
'name' => $rolesEnum->value,
9390
'label' => 'roles.' . $rolesEnum->value,
9491
])->values();

database/seeders/RolesAndPermissionsSeeder.php

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -31,26 +31,24 @@ public function run(): void {
3131
$permissions = collect(PermissionsEnum::cases())
3232
->map(fn ($permission) => Permission::query()->firstOrCreate(['name' => $permission->value]));
3333

34-
// Create roles and assign permissions
35-
// Role::query()->upsert(['name' => RolesEnum::ADMINISTRATOR->value, 'guard_name' => 'web'], uniqueBy: 'name', update: ['name']);
36-
3734
// create roles using RolesEnum
38-
$admin_role = Role::query()->firstOrCreate(['name' => RolesEnum::ADMINISTRATOR->value, 'guard_name' => 'web']);
39-
$user_manager_role = Role::query()->firstOrCreate(['name' => RolesEnum::USER_MANAGER->value, 'guard_name' => 'web']);
40-
Role::query()->firstOrCreate(['name' => RolesEnum::REGISTERED_USER->value, 'guard_name' => 'web']);
35+
$adminRole = Role::query()->firstOrCreate(['name' => RolesEnum::ADMIN->value, 'guard_name' => 'web']);
36+
$annotationManagerRole = Role::query()->firstOrCreate(['name' => RolesEnum::ANNOTATION_MANAGER->value, 'guard_name' => 'web']);
37+
Role::query()->firstOrCreate(['name' => RolesEnum::ANNOTATOR->value, 'guard_name' => 'web']);
38+
4139
// flush cache after creating roles and permissions
4240
app()->make(PermissionRegistrar::class)->forgetCachedPermissions();
4341

44-
// assign permissions to roles
45-
$user_manager_role->givePermissionTo([
42+
// Annotation managers can manage users
43+
$annotationManagerRole->givePermissionTo([
4644
PermissionsEnum::VIEW_USERS->value,
4745
PermissionsEnum::CREATE_USERS->value,
4846
PermissionsEnum::UPDATE_USERS->value,
4947
PermissionsEnum::DELETE_USERS->value,
5048
PermissionsEnum::RESTORE_USERS->value,
5149
]);
5250

53-
$admin_role->givePermissionTo(Permission::all());
54-
$admin_role->givePermissionTo($permissions);
51+
// Admin gets all permissions
52+
$adminRole->givePermissionTo($permissions);
5553
}
5654
}

database/seeders/UsersSeeder.php

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,20 +21,20 @@ public function run(): void {
2121
'name' => 'Admin User',
2222
'password' => Hash::make($password),
2323
]);
24-
$admin->assignRole(RolesEnum::ADMINISTRATOR->value);
24+
$admin->syncRoles([RolesEnum::ADMIN->value]);
2525

26-
// Create or update the user manager
27-
$userManager = User::query()->updateOrCreate(['email' => 'user_manager@scify.org'], [
28-
'name' => 'User Manager',
26+
// Create or update the annotation manager
27+
$annotationManager = User::query()->updateOrCreate(['email' => 'annotation_manager@scify.org'], [
28+
'name' => 'Annotation Manager',
2929
'password' => Hash::make($password),
3030
]);
31-
$userManager->assignRole(RolesEnum::USER_MANAGER->value);
31+
$annotationManager->syncRoles([RolesEnum::ANNOTATION_MANAGER->value]);
3232

33-
// Create or update the registered user
34-
$registeredUser = User::query()->updateOrCreate(['email' => 'registered_user@scify.org'], [
35-
'name' => 'Registered User',
33+
// Create or update the annotator
34+
$annotator = User::query()->updateOrCreate(['email' => 'annotator@scify.org'], [
35+
'name' => 'Annotator User',
3636
'password' => Hash::make($password),
3737
]);
38-
$registeredUser->assignRole(RolesEnum::REGISTERED_USER->value);
38+
$annotator->syncRoles([RolesEnum::ANNOTATOR->value]);
3939
}
4040
}

lang/el/roles.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@
44

55
return [
66
'admin' => 'Διαχειριστής',
7-
'user-manager' => 'Διαχειριστής Χρηστών',
8-
'registered-user' => 'Εγγεγραμένος Χρήστης',
7+
'annotation-manager' => 'Υπεύθυνος Επισημείωσης',
8+
'annotator' => 'Επισημειωτής',
99
];

0 commit comments

Comments
 (0)