]> BookStack Code Mirror - bookstack/blob - app/Entities/Tools/PermissionsUpdater.php
a547cd0a8f40473429273aa62b9c0fb95ddd44fc
[bookstack] / app / Entities / Tools / PermissionsUpdater.php
1 <?php
2
3 namespace BookStack\Entities\Tools;
4
5 use BookStack\Actions\ActivityType;
6 use BookStack\Auth\Permissions\EntityPermission;
7 use BookStack\Auth\User;
8 use BookStack\Entities\Models\Entity;
9 use BookStack\Facades\Activity;
10 use Illuminate\Http\Request;
11 use Illuminate\Support\Collection;
12
13 class PermissionsUpdater
14 {
15     /**
16      * Update an entities permissions from a permission form submit request.
17      */
18     public function updateFromPermissionsForm(Entity $entity, Request $request)
19     {
20         $permissions = $request->get('permissions', null);
21         $ownerId = $request->get('owned_by', null);
22
23         $entity->permissions()->delete();
24
25         if (!is_null($permissions)) {
26             $entityPermissionData = $this->formatPermissionsFromRequestToEntityPermissions($permissions);
27             $entity->permissions()->createMany($entityPermissionData);
28         }
29
30         if (!is_null($ownerId)) {
31             $this->updateOwnerFromId($entity, intval($ownerId));
32         }
33
34         $entity->save();
35         $entity->rebuildPermissions();
36
37         Activity::add(ActivityType::PERMISSIONS_UPDATE, $entity);
38     }
39
40     /**
41      * Update the owner of the given entity.
42      * Checks the user exists in the system first.
43      * Does not save the model, just updates it.
44      */
45     protected function updateOwnerFromId(Entity $entity, int $newOwnerId)
46     {
47         $newOwner = User::query()->find($newOwnerId);
48         if (!is_null($newOwner)) {
49             $entity->owned_by = $newOwner->id;
50         }
51     }
52
53     /**
54      * Format permissions provided from a permission form to be EntityPermission data.
55      */
56     protected function formatPermissionsFromRequestToEntityPermissions(array $permissions): array
57     {
58         $formatted = [];
59
60         foreach ($permissions as $roleId => $info) {
61             $entityPermissionData = ['role_id' => $roleId];
62             foreach (EntityPermission::PERMISSIONS as $permission) {
63                 $entityPermissionData[$permission] = (($info[$permission] ?? false) === "true");
64             }
65             $formatted[] = $entityPermissionData;
66         }
67
68         return $formatted;
69     }
70 }