2023-01-21 19:08:34 +08:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace Tests\Helpers;
|
|
|
|
|
2023-05-18 00:56:55 +08:00
|
|
|
use BookStack\Permissions\PermissionsRepo;
|
|
|
|
use BookStack\Users\Models\Role;
|
|
|
|
use BookStack\Users\Models\User;
|
2023-01-21 19:08:34 +08:00
|
|
|
|
|
|
|
class UserRoleProvider
|
|
|
|
{
|
|
|
|
protected ?User $admin = null;
|
|
|
|
protected ?User $editor = null;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get a typical "Admin" user.
|
|
|
|
*/
|
|
|
|
public function admin(): User
|
|
|
|
{
|
|
|
|
if (is_null($this->admin)) {
|
|
|
|
$adminRole = Role::getSystemRole('admin');
|
2023-02-26 18:50:14 +08:00
|
|
|
$this->admin = $adminRole->users()->first();
|
2023-01-21 19:08:34 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
return $this->admin;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get a typical "Editor" user.
|
|
|
|
*/
|
|
|
|
public function editor(): User
|
|
|
|
{
|
|
|
|
if ($this->editor === null) {
|
|
|
|
$editorRole = Role::getRole('editor');
|
|
|
|
$this->editor = $editorRole->users->first();
|
|
|
|
}
|
|
|
|
|
|
|
|
return $this->editor;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Get a typical "Viewer" user.
|
|
|
|
*/
|
|
|
|
public function viewer(array $attributes = []): User
|
|
|
|
{
|
|
|
|
$user = Role::getRole('viewer')->users()->first();
|
|
|
|
if (!empty($attributes)) {
|
|
|
|
$user->forceFill($attributes)->save();
|
|
|
|
}
|
|
|
|
|
|
|
|
return $user;
|
|
|
|
}
|
|
|
|
|
2023-08-16 23:02:00 +08:00
|
|
|
/**
|
|
|
|
* Get the system "guest" user.
|
|
|
|
*/
|
|
|
|
public function guest(): User
|
|
|
|
{
|
2023-09-16 20:18:35 +08:00
|
|
|
return User::getGuest();
|
2023-08-16 23:02:00 +08:00
|
|
|
}
|
|
|
|
|
2023-01-21 19:08:34 +08:00
|
|
|
/**
|
|
|
|
* Create a new fresh user without any relations.
|
|
|
|
*/
|
|
|
|
public function newUser(array $attrs = []): User
|
|
|
|
{
|
|
|
|
return User::factory()->create($attrs);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create a new fresh user, with the given attrs, that has assigned a fresh role
|
|
|
|
* that has the given role permissions.
|
|
|
|
* Intended as a helper to create a blank slate baseline user and role.
|
|
|
|
* @return array{0: User, 1: Role}
|
|
|
|
*/
|
|
|
|
public function newUserWithRole(array $userAttrs = [], array $rolePermissions = []): array
|
|
|
|
{
|
|
|
|
$user = $this->newUser($userAttrs);
|
|
|
|
$role = $this->attachNewRole($user, $rolePermissions);
|
|
|
|
|
|
|
|
return [$user, $role];
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Attach a new role, with the given role permissions, to the given user
|
|
|
|
* and return that role.
|
|
|
|
*/
|
|
|
|
public function attachNewRole(User $user, array $rolePermissions = []): Role
|
|
|
|
{
|
|
|
|
$role = $this->createRole($rolePermissions);
|
|
|
|
$user->attachRole($role);
|
|
|
|
return $role;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Create a new basic role with the given role permissions.
|
|
|
|
*/
|
|
|
|
public function createRole(array $rolePermissions = []): Role
|
|
|
|
{
|
|
|
|
$permissionRepo = app(PermissionsRepo::class);
|
|
|
|
$roleData = Role::factory()->make()->toArray();
|
2023-02-19 02:36:34 +08:00
|
|
|
$roleData['permissions'] = $rolePermissions;
|
2023-01-21 19:08:34 +08:00
|
|
|
|
|
|
|
return $permissionRepo->saveNewRole($roleData);
|
|
|
|
}
|
|
|
|
}
|