tag->getId(); } /** * Returns the system tag represented by this node * * @return ISystemTag system tag */ public function getSystemTag() { return $this->tag; } /** * Renames the node * * @param string $name The new name * * @throws MethodNotAllowed not allowed to rename node * * @return never */ public function setName($name) { throw new MethodNotAllowed(); } /** * Update tag * * @param string $name new tag name * @param bool $userVisible user visible * @param bool $userAssignable user assignable * @param string $color color * * @throws NotFound whenever the given tag id does not exist * @throws Forbidden whenever there is no permission to update said tag * @throws Conflict whenever a tag already exists with the given attributes */ public function update($name, $userVisible, $userAssignable, $color): void { try { if (!$this->tagManager->canUserSeeTag($this->tag, $this->user)) { throw new NotFound('Tag with id ' . $this->tag->getId() . ' does not exist'); } if (!$this->tagManager->canUserAssignTag($this->tag, $this->user)) { throw new Forbidden('No permission to update tag ' . $this->tag->getId()); } // only admin is able to change permissions, regular users can only rename if (!$this->isAdmin) { // only renaming is allowed for regular users if ($userVisible !== $this->tag->isUserVisible() || $userAssignable !== $this->tag->isUserAssignable() ) { throw new Forbidden('No permission to update permissions for tag ' . $this->tag->getId()); } } // Make sure color is a proper hex if ($color !== null && (strlen($color) !== 6 || !ctype_xdigit($color))) { throw new BadRequest('Color must be a 6-digit hexadecimal value'); } $this->tagManager->updateTag($this->tag->getId(), $name, $userVisible, $userAssignable, $color); } catch (TagNotFoundException $e) { throw new NotFound('Tag with id ' . $this->tag->getId() . ' does not exist'); } catch (TagAlreadyExistsException $e) { throw new Conflict( 'Tag with the properties "' . $name . '", ' . $userVisible . ', ' . $userAssignable . ' already exists' ); } } /** * Returns null, not supported * * @return null */ public function getLastModified() { return null; } /** * @return void */ public function delete() { try { if (!$this->isAdmin) { throw new Forbidden('No permission to delete tag ' . $this->tag->getId()); } if (!$this->tagManager->canUserSeeTag($this->tag, $this->user)) { throw new NotFound('Tag with id ' . $this->tag->getId() . ' not found'); } $this->tagManager->deleteTags($this->tag->getId()); } catch (TagNotFoundException $e) { // can happen if concurrent deletion occurred throw new NotFound('Tag with id ' . $this->tag->getId() . ' not found', 0, $e); } } public function getNumberOfFiles(): int { return $this->numberOfFiles; } public function setNumberOfFiles(int $numberOfFiles): void { $this->numberOfFiles = $numberOfFiles; } public function getReferenceFileId(): int { return $this->referenceFileId; } public function setReferenceFileId(int $referenceFileId): void { $this->referenceFileId = $referenceFileId; } public function createFile($name, $data = null) { throw new MethodNotAllowed(); } public function createDirectory($name) { throw new MethodNotAllowed(); } public function getChild($name) { return new SystemTagObjectType($this->tag, $name, $this->tagManager, $this->tagMapper); } public function childExists($name) { $objectTypes = $this->tagMapper->getAvailableObjectTypes(); return in_array($name, $objectTypes); } public function getChildren() { $objectTypes = $this->tagMapper->getAvailableObjectTypes(); return array_map( function ($objectType) { return new SystemTagObjectType($this->tag, $objectType, $this->tagManager, $this->tagMapper); }, $objectTypes ); } }