3 namespace BookStack\Entities\Tools;
5 use BookStack\Actions\ActivityType;
6 use BookStack\Auth\User;
7 use BookStack\Entities\Models\Entity;
8 use BookStack\Facades\Activity;
9 use Illuminate\Http\Request;
10 use Illuminate\Support\Collection;
12 class PermissionsUpdater
15 * Update an entities permissions from a permission form submit request.
17 public function updateFromPermissionsForm(Entity $entity, Request $request)
19 $restricted = $request->get('restricted') === 'true';
20 $permissions = $request->get('restrictions', null);
21 $ownerId = $request->get('owned_by', null);
23 $entity->restricted = $restricted;
24 $entity->permissions()->delete();
26 if (!is_null($permissions)) {
27 $entityPermissionData = $this->formatPermissionsFromRequestToEntityPermissions($permissions);
28 $entity->permissions()->createMany($entityPermissionData);
31 if (!is_null($ownerId)) {
32 $this->updateOwnerFromId($entity, intval($ownerId));
36 $entity->rebuildPermissions();
38 Activity::add(ActivityType::PERMISSIONS_UPDATE, $entity);
42 * Update the owner of the given entity.
43 * Checks the user exists in the system first.
44 * Does not save the model, just updates it.
46 protected function updateOwnerFromId(Entity $entity, int $newOwnerId)
48 $newOwner = User::query()->find($newOwnerId);
49 if (!is_null($newOwner)) {
50 $entity->owned_by = $newOwner->id;
55 * Format permissions provided from a permission form to be
56 * EntityPermission data.
58 protected function formatPermissionsFromRequestToEntityPermissions(array $permissions): Collection
60 return collect($permissions)->flatMap(function ($restrictions, $roleId) {
61 return collect($restrictions)->keys()->map(function ($action) use ($roleId) {
64 'action' => strtolower($action),