3 namespace BookStack\Http\Controllers\Api;
5 use BookStack\Entities\EntityProvider;
6 use BookStack\Entities\Models\Entity;
7 use BookStack\Entities\Tools\PermissionsUpdater;
8 use Illuminate\Http\Request;
10 class ContentPermissionsController extends ApiController
12 public function __construct(
13 protected PermissionsUpdater $permissionsUpdater,
14 protected EntityProvider $entities
20 'owner_id' => ['int'],
22 'override_role_permissions' => ['array'],
23 'override_role_permissions.*.role_id' => ['required', 'int'],
24 'override_role_permissions.*.view' => ['required', 'boolean'],
25 'override_role_permissions.*.create' => ['required', 'boolean'],
26 'override_role_permissions.*.update' => ['required', 'boolean'],
27 'override_role_permissions.*.delete' => ['required', 'boolean'],
29 'override_fallback_permissions' => ['nullable'],
30 'override_fallback_permissions.view' => ['required', 'boolean'],
31 'override_fallback_permissions.create' => ['required', 'boolean'],
32 'override_fallback_permissions.update' => ['required', 'boolean'],
33 'override_fallback_permissions.delete' => ['required', 'boolean'],
38 * Read the configured content-level permissions for the item of the given type and ID.
39 * 'contentType' should be one of: page, book, chapter, bookshelf.
40 * 'contentId' should be the relevant ID of that item type you'd like to handle permissions for.
42 public function read(string $contentType, string $contentId)
44 $entity = $this->entities->get($contentType)
45 ->newQuery()->scopes(['visible'])->findOrFail($contentId);
47 $this->checkOwnablePermission('restrictions-manage', $entity);
49 return response()->json($this->formattedPermissionDataForEntity($entity));
53 * Update the configured content-level permissions for the item of the given type and ID.
54 * 'contentType' should be one of: page, book, chapter, bookshelf.
55 * 'contentId' should be the relevant ID of that item type you'd like to handle permissions for.
57 public function update(Request $request, string $contentType, string $contentId)
59 $entity = $this->entities->get($contentType)
60 ->newQuery()->scopes(['visible'])->findOrFail($contentId);
62 $this->checkOwnablePermission('restrictions-manage', $entity);
64 $data = $this->validate($request, $this->rules()['update']);
65 $this->permissionsUpdater->updateFromApiRequestData($entity, $data);
67 return response()->json($this->formattedPermissionDataForEntity($entity));
70 protected function formattedPermissionDataForEntity(Entity $entity): array
72 $rolePermissions = $entity->permissions()
73 ->where('role_id', '!=', 0)
74 ->with(['role:id,display_name'])
77 $fallback = $entity->permissions()->where('role_id', '=', 0)->first();
78 $fallback?->makeHidden('role_id');
81 'owner' => $entity->ownedBy()->first(),
82 'override_role_permissions' => $rolePermissions,
83 'override_fallback_permissions' => $fallback,
84 'inheriting' => is_null($fallback),