diff options
Diffstat (limited to 'lib/classes')
18 files changed, 150 insertions, 27 deletions
diff --git a/lib/classes/JsonApi/Authorities/Courseware/StructuralElementAuthority.php b/lib/classes/JsonApi/Authorities/Courseware/StructuralElementAuthority.php new file mode 100644 index 0000000..943ced2 --- /dev/null +++ b/lib/classes/JsonApi/Authorities/Courseware/StructuralElementAuthority.php @@ -0,0 +1,55 @@ +<?php + +namespace JsonApi\Authorities\Courseware; + +use Courseware\StructuralElement; +use JsonApi\Authorities\SORMAuthority; +use JsonApi\SORM; +use User; + +final class StructuralElementAuthority implements SORMAuthority +{ + /** + * @param User|null $user + * @param StructuralElement $sorm + * + * @return bool + */ + public function mayCreate(?User $user, SORM $sorm): bool + { + return $sorm->canEdit($user); + } + + /** + * @param User|null $user + * @param StructuralElement $sorm + * + * @return bool + */ + public function mayAccess(?User $user, SORM $sorm): bool + { + return $sorm->canRead($user); + } + + /** + * @param User|null $user + * @param StructuralElement $sorm + * + * @return bool + */ + public function mayEdit(?User $user, SORM $sorm): bool + { + return $sorm->canEdit($user); + } + + /** + * @param User|null $user + * @param StructuralElement $sorm + * + * @return bool + */ + public function mayDelete(?User $user, SORM $sorm): bool + { + return $sorm->canEdit($user); + } +} diff --git a/lib/classes/JsonApi/Routes/Courseware/CoursewareContainers.php b/lib/classes/JsonApi/Routes/Courseware/CoursewareContainers.php index 1e12f70..9dc57a2 100644 --- a/lib/classes/JsonApi/Routes/Courseware/CoursewareContainers.php +++ b/lib/classes/JsonApi/Routes/Courseware/CoursewareContainers.php @@ -8,7 +8,7 @@ use Courseware\ContainerTypes\ContainerType; use Courseware\StructuralElement; use JsonApi\Errors\UnprocessableEntityException; use JsonApi\Schemas\Courseware\ContainerSchema; -use JsonApi\Schemas\Courseware\StructuralElement as StructuralElementSchema; +use JsonApi\Schemas\Courseware\StructuralElementSchema as StructuralElementSchema; use JsonApi\SORM; use JsonApi\SormCRUDController; use Psr\Http\Message\ResponseInterface as Response; diff --git a/lib/classes/JsonApi/Routes/Courseware/CoursewareStructuralElements.php b/lib/classes/JsonApi/Routes/Courseware/CoursewareStructuralElements.php new file mode 100644 index 0000000..ef55d1c --- /dev/null +++ b/lib/classes/JsonApi/Routes/Courseware/CoursewareStructuralElements.php @@ -0,0 +1,75 @@ +<?php + +namespace JsonApi\Routes\Courseware; + +use Courseware\StructuralElement; +use JsonApi\Schemas\Courseware\ContainerSchema; +use JsonApi\Schemas\Courseware\StructuralElementSchema; +use JsonApi\SORM; +use JsonApi\SormCRUDController; +use Psr\Http\Message\ServerRequestInterface as Request; + +/** + * Class StructuralElementsIndex. + */ +class CoursewareStructuralElements extends SormCRUDController +{ + protected $allowedPagingParameters = ['offset', 'limit']; + + protected $allowedIncludePaths = [ + StructuralElementSchema::REL_ANCESTORS, + StructuralElementSchema::REL_CHILDREN, + StructuralElementSchema::REL_CONTAINERS, + StructuralElementSchema::REL_CONTAINERS . ContainerSchema::REL_BLOCKS, + StructuralElementSchema::REL_CONTAINERS . ContainerSchema::REL_BLOCKS . 'edit-blocker', + StructuralElementSchema::REL_CONTAINERS . ContainerSchema::REL_BLOCKS . 'editor', + StructuralElementSchema::REL_CONTAINERS . ContainerSchema::REL_BLOCKS . 'owner', + StructuralElementSchema::REL_CONTAINERS . ContainerSchema::REL_BLOCKS . 'user-data-field', + StructuralElementSchema::REL_CONTAINERS . ContainerSchema::REL_BLOCKS . 'user-progress', + StructuralElementSchema::REL_COURSE, + StructuralElementSchema::REL_EDITOR, + StructuralElementSchema::REL_OWNER, + StructuralElementSchema::REL_PARENT, + ]; + + protected function getSORMClassName(): string + { + return StructuralElement::class; + } + + /** + * @param StructuralElement|null $current + */ + protected function getData(Request $request, array $args, ?SORM $current = null): array + { + $user = $this->getUser($request); + $data = [ + 'position' => (int) $this->getAttribute('position', $current ? $current->position : 0), + 'title' => $this->getAttribute('title', $current ? $current->title :''), + 'purpose' => $this->getAttribute('purpose', $current ? $current->purpose : ''), + 'payload' => $this->getAttribute('payload', $current ? $current->payload->getIterator() : []), + 'public' => (int) $this->getAttribute('public', $current ? $current->public : 0), + 'permission-type' => $this->getAttribute('permission-type', $current ? $current->permission_type : ''), + 'visible' => $this->getAttribute('visible', $current ? $current->visible : ''), + 'visible_all' => (bool) $this->getAttribute('visible-all', $current ? $current->visible_all : ''), + 'visible-start-date' => $this->getDateAttribute('visible-start-date'), + 'visible-end-date' => $this->getDateAttribute('visible-end-date'), + 'writable' => (string) $this->getAttribute('writable', $current ? $current->writable : ''), + 'writable_all' => (bool) $this->getAttribute('writable-all', $current ? $current->writable_all : ''), + 'writable_start_date' => $this->getDateAttribute('writable-start-date'), + 'writable_end_date' => $this->getDateAttribute('writable-end-date'), + 'visible_approval' => json_encode($this->getAttribute('visible-approval', $current ? $current->visible_approval : '')), + 'writable_approval' => json_encode($this->getAttribute('writable-approval', $current ? $current->writable_end_date : '')), + 'content_approval' => $this->getAttribute('content-approval', $current ? $current->content_approval->getIterator() : []), + 'copy_approval' => $this->getAttribute('copy-approval', $current ? $current->copy_approval->getIterator() : []), + 'can_edit' => $current ? $current->canEdit($user) : false, + 'can_visit' => $current ? $current->canVisit($user) : false, + 'is_link' => (int) $this->getAttribute('is-link', $current ? $current->is_link : 0), + 'commentable' => (bool) $this->getAttribute('commentable', $current ? $current->commentable : false), + 'target_id' => (int) $this->getAttribute('target-id', $current ? $current->target_id : ''), + 'external_relations' => $this->getAttribute('external-relations', $current ? $current->external_relations->getIterator() : []), + 'mkdate' => $this->getDateAttribute('mkdate'), + 'chdate' => $this->getDateAttribute('chdate'), + ]; + } +} diff --git a/lib/classes/JsonApi/Routes/Courseware/Rel/BookmarkedStructuralElements.php b/lib/classes/JsonApi/Routes/Courseware/Rel/BookmarkedStructuralElements.php index 1e68624..ef28079 100644 --- a/lib/classes/JsonApi/Routes/Courseware/Rel/BookmarkedStructuralElements.php +++ b/lib/classes/JsonApi/Routes/Courseware/Rel/BookmarkedStructuralElements.php @@ -112,7 +112,7 @@ class BookmarkedStructuralElements extends RelationshipsController } foreach ($data as $item) { - if (\JsonApi\Schemas\Courseware\StructuralElement::TYPE !== self::arrayGet($item, 'type')) { + if (\JsonApi\Schemas\Courseware\StructuralElementSchema::TYPE !== self::arrayGet($item, 'type')) { return 'Wrong `type` in document´s `data`.'; } diff --git a/lib/classes/JsonApi/Routes/Courseware/Rel/StructuralElementsChildren.php b/lib/classes/JsonApi/Routes/Courseware/Rel/StructuralElementsChildren.php index 3ff573a..bf5b227 100644 --- a/lib/classes/JsonApi/Routes/Courseware/Rel/StructuralElementsChildren.php +++ b/lib/classes/JsonApi/Routes/Courseware/Rel/StructuralElementsChildren.php @@ -62,7 +62,7 @@ class StructuralElementsChildren extends RelationshipsController */ protected function getRelationshipSelfLink($resource, $schema, $userData) { - return $schema->getRelationshipSelfLink($resource, \JsonApi\Schemas\Courseware\StructuralElement::REL_CHILDREN); + return $schema->getRelationshipSelfLink($resource, \JsonApi\Schemas\Courseware\StructuralElementSchema::REL_CHILDREN); } /** @@ -70,7 +70,7 @@ class StructuralElementsChildren extends RelationshipsController */ protected function getRelationshipRelatedLink($resource, $schema, $userData) { - return $schema->getRelationshipRelatedLink($resource, \JsonApi\Schemas\Courseware\StructuralElement::REL_CHILDREN); + return $schema->getRelationshipRelatedLink($resource, \JsonApi\Schemas\Courseware\StructuralElementSchema::REL_CHILDREN); } protected function validateResourceDocument($json, $data) @@ -86,7 +86,7 @@ class StructuralElementsChildren extends RelationshipsController } foreach ($data as $item) { - if (self::arrayGet($item, 'type') !== \JsonApi\Schemas\Courseware\StructuralElement::TYPE) { + if (self::arrayGet($item, 'type') !== \JsonApi\Schemas\Courseware\StructuralElementSchema::TYPE) { return 'Wrong `type` in document´s `data`.'; } diff --git a/lib/classes/JsonApi/Routes/Courseware/Rel/StructuralElementsContainers.php b/lib/classes/JsonApi/Routes/Courseware/Rel/StructuralElementsContainers.php index 3ede3e5..44ee3fe 100644 --- a/lib/classes/JsonApi/Routes/Courseware/Rel/StructuralElementsContainers.php +++ b/lib/classes/JsonApi/Routes/Courseware/Rel/StructuralElementsContainers.php @@ -63,7 +63,7 @@ class StructuralElementsContainers extends RelationshipsController */ protected function getRelationshipSelfLink($resource, $schema, $userData) { - return $schema->getRelationshipSelfLink($resource, \JsonApi\Schemas\Courseware\StructuralElement::REL_CONTAINERS); + return $schema->getRelationshipSelfLink($resource, \JsonApi\Schemas\Courseware\StructuralElementSchema::REL_CONTAINERS); } /** @@ -71,7 +71,7 @@ class StructuralElementsContainers extends RelationshipsController */ protected function getRelationshipRelatedLink($resource, $schema, $userData) { - return $schema->getRelationshipRelatedLink($resource, \JsonApi\Schemas\Courseware\StructuralElement::REL_CONTAINERS); + return $schema->getRelationshipRelatedLink($resource, \JsonApi\Schemas\Courseware\StructuralElementSchema::REL_CONTAINERS); } protected function validateResourceDocument($json, $data) diff --git a/lib/classes/JsonApi/Routes/Courseware/Rel/StructuralElementsEditBlocker.php b/lib/classes/JsonApi/Routes/Courseware/Rel/StructuralElementsEditBlocker.php index 3c2780f..b376707 100644 --- a/lib/classes/JsonApi/Routes/Courseware/Rel/StructuralElementsEditBlocker.php +++ b/lib/classes/JsonApi/Routes/Courseware/Rel/StructuralElementsEditBlocker.php @@ -73,7 +73,7 @@ class StructuralElementsEditBlocker extends RelationshipsController */ protected function getRelationshipSelfLink($resource, $schema, $userData) { - return $schema->getRelationshipSelfLink($resource, \JsonApi\Schemas\Courseware\StructuralElement::REL_EDITBLOCKER); + return $schema->getRelationshipSelfLink($resource, \JsonApi\Schemas\Courseware\StructuralElementSchema::REL_EDITBLOCKER); } /** diff --git a/lib/classes/JsonApi/Routes/Courseware/Rel/UsersBookmarkedStructuralElements.php b/lib/classes/JsonApi/Routes/Courseware/Rel/UsersBookmarkedStructuralElements.php index cfe487d..1f9f990 100644 --- a/lib/classes/JsonApi/Routes/Courseware/Rel/UsersBookmarkedStructuralElements.php +++ b/lib/classes/JsonApi/Routes/Courseware/Rel/UsersBookmarkedStructuralElements.php @@ -113,7 +113,7 @@ class UsersBookmarkedStructuralElements extends RelationshipsController } foreach ($data as $item) { - if (\JsonApi\Schemas\Courseware\StructuralElement::TYPE !== self::arrayGet($item, 'type')) { + if (\JsonApi\Schemas\Courseware\StructuralElementSchema::TYPE !== self::arrayGet($item, 'type')) { return 'Wrong `type` in document´s `data`.'; } diff --git a/lib/classes/JsonApi/Routes/Courseware/StructuralElementCommentsCreate.php b/lib/classes/JsonApi/Routes/Courseware/StructuralElementCommentsCreate.php index 9dfa77b..9ab427e 100644 --- a/lib/classes/JsonApi/Routes/Courseware/StructuralElementCommentsCreate.php +++ b/lib/classes/JsonApi/Routes/Courseware/StructuralElementCommentsCreate.php @@ -5,7 +5,7 @@ namespace JsonApi\Routes\Courseware; use JsonApi\Errors\AuthorizationFailedException; use JsonApi\JsonApiController; use JsonApi\Routes\ValidationTrait; -use JsonApi\Schemas\Courseware\StructuralElement as StructuralElementSchema; +use JsonApi\Schemas\Courseware\StructuralElementSchema as StructuralElementSchema; use JsonApi\Schemas\Courseware\StructuralElementComment as StructuralElementCommentSchema; use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; diff --git a/lib/classes/JsonApi/Routes/Courseware/StructuralElementCommentsUpdate.php b/lib/classes/JsonApi/Routes/Courseware/StructuralElementCommentsUpdate.php index 5728847..c2e7c6a 100644 --- a/lib/classes/JsonApi/Routes/Courseware/StructuralElementCommentsUpdate.php +++ b/lib/classes/JsonApi/Routes/Courseware/StructuralElementCommentsUpdate.php @@ -7,7 +7,7 @@ use JsonApi\Errors\AuthorizationFailedException; use JsonApi\Errors\RecordNotFoundException; use JsonApi\JsonApiController; use JsonApi\Routes\ValidationTrait; -use JsonApi\Schemas\Courseware\StructuralElement as StructuralElementSchema; +use JsonApi\Schemas\Courseware\StructuralElementSchema as StructuralElementSchema; use JsonApi\Schemas\Courseware\StructuralElementComment as StructuralElementCommentSchema; use JsonApi\Schemas\User as UserSchema; use Psr\Http\Message\ResponseInterface as Response; diff --git a/lib/classes/JsonApi/Routes/Courseware/StructuralElementFeedbackCreate.php b/lib/classes/JsonApi/Routes/Courseware/StructuralElementFeedbackCreate.php index bcf5425..a3b8d71 100644 --- a/lib/classes/JsonApi/Routes/Courseware/StructuralElementFeedbackCreate.php +++ b/lib/classes/JsonApi/Routes/Courseware/StructuralElementFeedbackCreate.php @@ -6,7 +6,7 @@ use Courseware\Container; use JsonApi\Errors\AuthorizationFailedException; use JsonApi\JsonApiController; use JsonApi\Routes\ValidationTrait; -use JsonApi\Schemas\Courseware\StructuralElement as StructuralElementSchema; +use JsonApi\Schemas\Courseware\StructuralElementSchema as StructuralElementSchema; use JsonApi\Schemas\Courseware\StructuralElementFeedback as StructuralElementFeedbackSchema; use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; diff --git a/lib/classes/JsonApi/Routes/Courseware/StructuralElementFeedbackUpdate.php b/lib/classes/JsonApi/Routes/Courseware/StructuralElementFeedbackUpdate.php index 5d4b0af..6e3eedc 100644 --- a/lib/classes/JsonApi/Routes/Courseware/StructuralElementFeedbackUpdate.php +++ b/lib/classes/JsonApi/Routes/Courseware/StructuralElementFeedbackUpdate.php @@ -7,7 +7,7 @@ use JsonApi\Errors\AuthorizationFailedException; use JsonApi\Errors\RecordNotFoundException; use JsonApi\JsonApiController; use JsonApi\Routes\ValidationTrait; -use JsonApi\Schemas\Courseware\StructuralElement as StructuralElementSchema; +use JsonApi\Schemas\Courseware\StructuralElementSchema as StructuralElementSchema; use JsonApi\Schemas\Courseware\StructuralElementFeedback as StructuralElementFeedbackSchema; use JsonApi\Schemas\User as UserSchema; use Psr\Http\Message\ResponseInterface as Response; diff --git a/lib/classes/JsonApi/Routes/Courseware/StructuralElementsCreate.php b/lib/classes/JsonApi/Routes/Courseware/StructuralElementsCreate.php index 082821b..30002c4 100644 --- a/lib/classes/JsonApi/Routes/Courseware/StructuralElementsCreate.php +++ b/lib/classes/JsonApi/Routes/Courseware/StructuralElementsCreate.php @@ -5,7 +5,7 @@ namespace JsonApi\Routes\Courseware; use JsonApi\Errors\AuthorizationFailedException; use JsonApi\JsonApiController; use JsonApi\Routes\ValidationTrait; -use JsonApi\Schemas\Courseware\StructuralElement as StructuralElementSchema; +use JsonApi\Schemas\Courseware\StructuralElementSchema as StructuralElementSchema; use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; use Studip\Activity\Activity; diff --git a/lib/classes/JsonApi/Routes/Courseware/StructuralElementsUpdate.php b/lib/classes/JsonApi/Routes/Courseware/StructuralElementsUpdate.php index ae58bca..820fda7 100644 --- a/lib/classes/JsonApi/Routes/Courseware/StructuralElementsUpdate.php +++ b/lib/classes/JsonApi/Routes/Courseware/StructuralElementsUpdate.php @@ -8,7 +8,7 @@ use JsonApi\Errors\RecordNotFoundException; use JsonApi\JsonApiController; use JsonApi\Routes\TimestampTrait; use JsonApi\Routes\ValidationTrait; -use JsonApi\Schemas\Courseware\StructuralElement as StructuralElementSchema; +use JsonApi\Schemas\Courseware\StructuralElementSchema as StructuralElementSchema; use JsonApi\Schemas\FileRef as FileRefSchema; use JsonApi\Schemas\StockImage as StockImageSchema; use Psr\Http\Message\ResponseInterface as Response; diff --git a/lib/classes/JsonApi/Routes/Courseware/TaskGroupsCreate.php b/lib/classes/JsonApi/Routes/Courseware/TaskGroupsCreate.php index f7357a4..3d0f481 100644 --- a/lib/classes/JsonApi/Routes/Courseware/TaskGroupsCreate.php +++ b/lib/classes/JsonApi/Routes/Courseware/TaskGroupsCreate.php @@ -9,7 +9,7 @@ use JsonApi\Errors\AuthorizationFailedException; use JsonApi\JsonApiController; use JsonApi\Routes\TimestampTrait; use JsonApi\Routes\ValidationTrait; -use JsonApi\Schemas\Courseware\StructuralElement as StructuralElementSchema; +use JsonApi\Schemas\Courseware\StructuralElementSchema as StructuralElementSchema; use JsonApi\Schemas\Courseware\TaskGroup as TaskGroupSchema; use JsonApi\Schemas\StatusGroup as StatusGroupSchema; use JsonApi\Schemas\User as UserSchema; diff --git a/lib/classes/JsonApi/Routes/Courseware/TemplatesCreate.php b/lib/classes/JsonApi/Routes/Courseware/TemplatesCreate.php index f23468c..58a1994 100644 --- a/lib/classes/JsonApi/Routes/Courseware/TemplatesCreate.php +++ b/lib/classes/JsonApi/Routes/Courseware/TemplatesCreate.php @@ -8,7 +8,7 @@ use JsonApi\Errors\UnprocessableEntityException; use JsonApi\JsonApiController; use JsonApi\Routes\ValidationTrait; use JsonApi\Schemas\Courseware\Task as TaskSchema; -use JsonApi\Schemas\Courseware\StructuralElement as StructuralElementSchema; +use JsonApi\Schemas\Courseware\StructuralElementSchema as StructuralElementSchema; use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; diff --git a/lib/classes/JsonApi/SchemaMap.php b/lib/classes/JsonApi/SchemaMap.php index 3d7dae4..1db5759 100644 --- a/lib/classes/JsonApi/SchemaMap.php +++ b/lib/classes/JsonApi/SchemaMap.php @@ -96,7 +96,7 @@ class SchemaMap \Courseware\PeerReview::class => Schemas\Courseware\PeerReview::class, \Courseware\PeerReviewProcess::class => Schemas\Courseware\PeerReviewProcess::class, \Courseware\PublicLink::class => Schemas\Courseware\PublicLink::class, - \Courseware\StructuralElement::class => Schemas\Courseware\StructuralElement::class, + \Courseware\StructuralElement::class => Schemas\Courseware\StructuralElementSchema::class, \Courseware\StructuralElementComment::class => Schemas\Courseware\StructuralElementComment::class, \Courseware\StructuralElementFeedback::class => Schemas\Courseware\StructuralElementFeedback::class, \Courseware\Task::class => Schemas\Courseware\Task::class, diff --git a/lib/classes/JsonApi/Schemas/Courseware/StructuralElement.php b/lib/classes/JsonApi/Schemas/Courseware/StructuralElementSchema.php index c00d863..5d0caa7 100644 --- a/lib/classes/JsonApi/Schemas/Courseware/StructuralElement.php +++ b/lib/classes/JsonApi/Schemas/Courseware/StructuralElementSchema.php @@ -7,7 +7,7 @@ use Neomerx\JsonApi\Contracts\Schema\ContextInterface; use Neomerx\JsonApi\Schema\Identifier; use Neomerx\JsonApi\Schema\Link; -class StructuralElement extends SchemaProvider +class StructuralElementSchema extends SchemaProvider { const TYPE = 'courseware-structural-elements'; @@ -26,13 +26,6 @@ class StructuralElement extends SchemaProvider const REL_UNIT = 'unit'; const REL_FEEDBACKELEMENT = 'feedback-element'; - /** - * {@inheritdoc} - */ - public function getId($resource): ?string - { - return $resource->id; - } /** * {@inheritdoc} @@ -74,7 +67,7 @@ class StructuralElement extends SchemaProvider /** * {@inheritdoc} * - * @param StructuralElement $resource + * @param StructuralElementSchema $resource * @param ContextInterface $context */ public function getRelationships($resource, ContextInterface $context): iterable |
