]> BookStack Code Mirror - bookstack/blob - app/Entities/Tools/PermissionsUpdater.php
Added OIDC group sync functionality
[bookstack] / app / Entities / Tools / PermissionsUpdater.php
1 <?php
2
3 namespace BookStack\Entities\Tools;
4
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;
11
12 class PermissionsUpdater
13 {
14     /**
15      * Update an entities permissions from a permission form submit request.
16      */
17     public function updateFromPermissionsForm(Entity $entity, Request $request)
18     {
19         $restricted = $request->get('restricted') === 'true';
20         $permissions = $request->get('restrictions', null);
21         $ownerId = $request->get('owned_by', null);
22
23         $entity->restricted = $restricted;
24         $entity->permissions()->delete();
25
26         if (!is_null($permissions)) {
27             $entityPermissionData = $this->formatPermissionsFromRequestToEntityPermissions($permissions);
28             $entity->permissions()->createMany($entityPermissionData);
29         }
30
31         if (!is_null($ownerId)) {
32             $this->updateOwnerFromId($entity, intval($ownerId));
33         }
34
35         $entity->save();
36         $entity->rebuildPermissions();
37
38         Activity::add(ActivityType::PERMISSIONS_UPDATE, $entity);
39     }
40
41     /**
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.
45      */
46     protected function updateOwnerFromId(Entity $entity, int $newOwnerId)
47     {
48         $newOwner = User::query()->find($newOwnerId);
49         if (!is_null($newOwner)) {
50             $entity->owned_by = $newOwner->id;
51         }
52     }
53
54     /**
55      * Format permissions provided from a permission form to be
56      * EntityPermission data.
57      */
58     protected function formatPermissionsFromRequestToEntityPermissions(array $permissions): Collection
59     {
60         return collect($permissions)->flatMap(function ($restrictions, $roleId) {
61             return collect($restrictions)->keys()->map(function ($action) use ($roleId) {
62                 return [
63                     'role_id' => $roleId,
64                     'action'  => strtolower($action),
65                 ];
66             });
67         });
68     }
69 }