3 namespace BookStack\Entities\Tools;
5 use BookStack\Actions\ActivityType;
6 use BookStack\Auth\Permissions\EntityPermission;
7 use BookStack\Auth\User;
8 use BookStack\Entities\Models\Book;
9 use BookStack\Entities\Models\Bookshelf;
10 use BookStack\Entities\Models\Entity;
11 use BookStack\Facades\Activity;
12 use Illuminate\Http\Request;
14 class PermissionsUpdater
17 * Update an entities permissions from a permission form submit request.
19 public function updateFromPermissionsForm(Entity $entity, Request $request)
21 $permissions = $request->get('permissions', null);
22 $ownerId = $request->get('owned_by', null);
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 EntityPermission data.
57 protected function formatPermissionsFromRequestToEntityPermissions(array $permissions): array
66 foreach ($permissions as $type => $byId) {
67 $column = $columnsByType[$type] ?? null;
68 if (is_null($column)) {
72 foreach ($byId as $id => $info) {
73 $entityPermissionData = [];
75 if (!empty($column)) {
76 $entityPermissionData[$column] = $id;
79 foreach (EntityPermission::PERMISSIONS as $permission) {
80 $entityPermissionData[$permission] = (($info[$permission] ?? false) === "true");
82 $formatted[] = $entityPermissionData;
90 * Copy down the permissions of the given shelf to all child books.
92 public function updateBookPermissionsFromShelf(Bookshelf $shelf, $checkUserPermissions = true): int
94 $shelfPermissions = $shelf->permissions()->get(['role_id', 'view', 'create', 'update', 'delete'])->toArray();
95 $shelfBooks = $shelf->books()->get(['id', 'owned_by']);
96 $updatedBookCount = 0;
98 /** @var Book $book */
99 foreach ($shelfBooks as $book) {
100 if ($checkUserPermissions && !userCan('restrictions-manage', $book)) {
103 $book->permissions()->delete();
104 $book->permissions()->createMany($shelfPermissions);
105 $book->rebuildPermissions();
109 return $updatedBookCount;