fractal->collection($server->subusers) ->transformWith($this->getTransformer(SubuserTransformer::class)) ->toArray(); } /** * Returns a single subuser associated with this server instance. */ public function view(GetSubuserRequest $request, Server $server, User $user): array { $subuser = $request->attributes->get('subuser'); return $this->fractal->item($subuser) ->transformWith($this->getTransformer(SubuserTransformer::class)) ->toArray(); } /** * Create a new subuser for the given server. * * @throws \App\Exceptions\Model\DataValidationException * @throws \App\Exceptions\Service\Subuser\ServerSubuserExistsException * @throws \App\Exceptions\Service\Subuser\UserIsServerOwnerException * @throws \Throwable */ public function store(StoreSubuserRequest $request, Server $server): array { $response = $this->creationService->handle( $server, $request->input('email'), $this->getDefaultPermissions($request) ); Activity::event('server:subuser.create') ->subject($response->user) ->property(['email' => $request->input('email'), 'permissions' => $this->getDefaultPermissions($request)]) ->log(); return $this->fractal->item($response) ->transformWith($this->getTransformer(SubuserTransformer::class)) ->toArray(); } /** * Update a given subuser in the system for the server. * * @throws \App\Exceptions\Model\DataValidationException */ public function update(UpdateSubuserRequest $request, Server $server, User $user): array { /** @var \App\Models\Subuser $subuser */ $subuser = $request->attributes->get('subuser'); $this->updateService->handle($subuser, $server, $this->getDefaultPermissions($request)); return $this->fractal->item($subuser->refresh()) ->transformWith($this->getTransformer(SubuserTransformer::class)) ->toArray(); } /** * Removes a subusers from a server's assignment. */ public function delete(DeleteSubuserRequest $request, Server $server, User $user): JsonResponse { /** @var \App\Models\Subuser $subuser */ $subuser = $request->attributes->get('subuser'); $this->deletionService->handle($subuser, $server); return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT); } /** * Returns the default permissions for subusers and parses out any permissions * that were passed that do not also exist in the internally tracked list of * permissions. */ protected function getDefaultPermissions(Request $request): array { $allowed = Permission::permissions() ->map(function ($value, $prefix) { return array_map(function ($value) use ($prefix) { return "$prefix.$value"; }, array_keys($value['keys'])); }) ->flatten() ->all(); $cleaned = array_intersect($request->input('permissions') ?? [], $allowed); return array_unique(array_merge($cleaned, [Permission::ACTION_WEBSOCKET_CONNECT])); } }