diff options
Diffstat (limited to 'lib/classes')
9 files changed, 323 insertions, 0 deletions
diff --git a/lib/classes/JsonApi/RouteMap.php b/lib/classes/JsonApi/RouteMap.php index baccc26..03dce11 100644 --- a/lib/classes/JsonApi/RouteMap.php +++ b/lib/classes/JsonApi/RouteMap.php @@ -339,6 +339,18 @@ class RouteMap // not a JSON route $group->post('/courseware-blocks/{id}/copy', Routes\Courseware\BlocksCopy::class); + // routes for custom files + + // get all referenced custom files + $group->get('/courseware-blocks/{id}/custom-files', Routes\Courseware\CustomFilesList::class); + + // CRUD routes for single custom files + $group->get('/courseware-blocks/{id}/custom-files/{file_id}', Routes\Courseware\CustomFilesShow::class); + $group->post('/courseware-blocks/{id}/custom-files', Routes\Courseware\CustomFilesCreate::class); + $group->patch('/courseware-blocks/{id}/custom-files/{file_id}', Routes\Courseware\CustomFilesUpdateAttributes::class); + $group->post('/courseware-blocks/{id}/custom-files/{file_id}', Routes\Courseware\CustomFilesUpdate::class); + $group->delete('/courseware-blocks/{id}/custom-files/{file_id}', Routes\Courseware\CustomFilesDelete::class); + $group->get('/courseware-containers/{id}', Routes\Courseware\ContainersShow::class); $group->post('/courseware-containers', Routes\Courseware\ContainersCreate::class); $group->patch('/courseware-containers/{id}', Routes\Courseware\ContainersUpdate::class); diff --git a/lib/classes/JsonApi/Routes/Courseware/CustomFilesCreate.php b/lib/classes/JsonApi/Routes/Courseware/CustomFilesCreate.php new file mode 100644 index 0000000..56615b3 --- /dev/null +++ b/lib/classes/JsonApi/Routes/Courseware/CustomFilesCreate.php @@ -0,0 +1,46 @@ +<?php + +namespace JsonApi\Routes\Courseware; + +use Courseware\Block; +use Courseware\Filesystem\CustomFile; +use JsonApi\Routes\Files\RoutesHelperTrait; +use JsonApi\Errors\AuthorizationFailedException; +use JsonApi\Errors\RecordNotFoundException; +use JsonApi\JsonApiController; +use Psr\Http\Message\ResponseInterface as Response; +use Psr\Http\Message\ServerRequestInterface as Request; + +/** + * Create a block in a container. + */ +class CustomFilesCreate extends JsonApiController +{ + use RoutesHelperTrait; + + /** + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function __invoke(Request $request, Response $response, $args) + { + if (!($resource = Block::find($args['id']))) { + throw new RecordNotFoundException(); + } + + if (!Authority::canUpdateBlock($this->getUser($request), $resource)) { + throw new AuthorizationFailedException(); + } + + $body = $request->getParsedBody(); + + $custom_file = new CustomFile( + null, + $args['id'], + $body['data']['attributes'] + ); + + return $this->getContentResponse( + $resource->type->createCustomFile($custom_file) + ); + } +} diff --git a/lib/classes/JsonApi/Routes/Courseware/CustomFilesDelete.php b/lib/classes/JsonApi/Routes/Courseware/CustomFilesDelete.php new file mode 100644 index 0000000..f7e005d --- /dev/null +++ b/lib/classes/JsonApi/Routes/Courseware/CustomFilesDelete.php @@ -0,0 +1,36 @@ +<?php + +namespace JsonApi\Routes\Courseware; + +use Courseware\Block; +use JsonApi\Routes\Files\RoutesHelperTrait; +use JsonApi\Errors\AuthorizationFailedException; +use JsonApi\Errors\RecordNotFoundException; +use JsonApi\JsonApiController; +use Psr\Http\Message\ResponseInterface as Response; +use Psr\Http\Message\ServerRequestInterface as Request; + +/** + * Create a block in a container. + */ +class CustomFilesDelete extends JsonApiController +{ + use RoutesHelperTrait; + + /** + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function __invoke(Request $request, Response $response, $args) + { + if (!($resource = Block::find($args['id']))) { + throw new RecordNotFoundException(); + } + + if (!Authority::canUpdateBlock($user = $this->getUser($request), $resource)) { + throw new AuthorizationFailedException(); + } + + $resource->type->deleteCustomFile($args['id']); + return $response; + } +} diff --git a/lib/classes/JsonApi/Routes/Courseware/CustomFilesList.php b/lib/classes/JsonApi/Routes/Courseware/CustomFilesList.php new file mode 100644 index 0000000..1d776c0 --- /dev/null +++ b/lib/classes/JsonApi/Routes/Courseware/CustomFilesList.php @@ -0,0 +1,40 @@ +<?php + +namespace JsonApi\Routes\Courseware; + +use Courseware\Block; +use Courseware\CustomFiles; +use JsonApi\Routes\Files\RoutesHelperTrait; +use JsonApi\Errors\AuthorizationFailedException; +use JsonApi\Errors\RecordNotFoundException; +use JsonApi\JsonApiController; +use Psr\Http\Message\ResponseInterface as Response; +use Psr\Http\Message\ServerRequestInterface as Request; + +/** + * Create a block in a container. + */ +class CustomFilesList extends JsonApiController +{ + use RoutesHelperTrait; + + /** + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function __invoke(Request $request, Response $response, $args) + { + if (!($resource = Block::find($args['id']))) { + throw new RecordNotFoundException(); + } + + if (!Authority::canShowBlock($user = $this->getUser($request), $resource)) { + throw new AuthorizationFailedException(); + } + + if (!$resource->type instanceof CustomFiles) { + return $response; + } + + return $this->getContentResponse($resource->type->getCustomFiles()); + } +} diff --git a/lib/classes/JsonApi/Routes/Courseware/CustomFilesShow.php b/lib/classes/JsonApi/Routes/Courseware/CustomFilesShow.php new file mode 100644 index 0000000..0828bb7 --- /dev/null +++ b/lib/classes/JsonApi/Routes/Courseware/CustomFilesShow.php @@ -0,0 +1,38 @@ +<?php + +namespace JsonApi\Routes\Courseware; + +use Courseware\Block; +use GuzzleHttp\Psr7; +use JsonApi\Routes\Files\RoutesHelperTrait; +use JsonApi\Errors\AuthorizationFailedException; +use JsonApi\Errors\RecordNotFoundException; +use JsonApi\NonJsonApiController; +use Psr\Http\Message\ResponseInterface as Response; +use Psr\Http\Message\ServerRequestInterface as Request; + +/** + * Create a block in a container. + */ +class CustomFilesShow extends NonJsonApiController +{ + use RoutesHelperTrait; + + /** + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function __invoke(Request $request, Response $response, $args) + { + if (!($resource = Block::find($args['id']))) { + throw new RecordNotFoundException(); + } + + if (!Authority::canShowBlock($user = $this->getUser($request), $resource)) { + throw new AuthorizationFailedException(); + } + + return $response->withBody( + $stream = Psr7\stream_for($resource->type->readCustomFile($args['id'])) + ); + } +} diff --git a/lib/classes/JsonApi/Routes/Courseware/CustomFilesUpdate.php b/lib/classes/JsonApi/Routes/Courseware/CustomFilesUpdate.php new file mode 100644 index 0000000..72f3d4e --- /dev/null +++ b/lib/classes/JsonApi/Routes/Courseware/CustomFilesUpdate.php @@ -0,0 +1,42 @@ +<?php + +namespace JsonApi\Routes\Courseware; + +use Courseware\Block; +use JsonApi\Routes\Files\RoutesHelperTrait; +use JsonApi\Errors\AuthorizationFailedException; +use JsonApi\Errors\RecordNotFoundException; +use JsonApi\NonJsonApiController; +use Psr\Http\Message\ResponseInterface as Response; +use Psr\Http\Message\ServerRequestInterface as Request; + +/** + * Create a block in a container. + */ +class CustomFilesUpdate extends NonJsonApiController +{ + use RoutesHelperTrait; + + /** + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function __invoke(Request $request, Response $response, $args) + { + if (!($resource = Block::find($args['id']))) { + throw new RecordNotFoundException(); + } + + if (!Authority::canUpdateBlock($user = $this->getUser($request), $resource)) { + throw new AuthorizationFailedException(); + } + + $uploadedFile = $this->getUploadedFile($request); + + $resource->type->updateCustomFileContent( + $args['file_id'], + $content = file_get_contents($uploadedFile->getFilepath()) + ); + + return $response; + } +} diff --git a/lib/classes/JsonApi/Routes/Courseware/CustomFilesUpdateAttributes.php b/lib/classes/JsonApi/Routes/Courseware/CustomFilesUpdateAttributes.php new file mode 100644 index 0000000..cd1100b --- /dev/null +++ b/lib/classes/JsonApi/Routes/Courseware/CustomFilesUpdateAttributes.php @@ -0,0 +1,47 @@ +<?php + +namespace JsonApi\Routes\Courseware; + +use Courseware\Block; +use Courseware\Filesystem\CustomFile; +use JsonApi\Routes\Files\RoutesHelperTrait; +use JsonApi\Errors\AuthorizationFailedException; +use JsonApi\Errors\RecordNotFoundException; +use JsonApi\JsonApiController; +use Psr\Http\Message\ResponseInterface as Response; +use Psr\Http\Message\ServerRequestInterface as Request; + +/** + * Create a block in a container. + */ +class CustomFilesUpdateAttributes extends JsonApiController +{ + use RoutesHelperTrait; + + /** + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + public function __invoke(Request $request, Response $response, $args) + { + if (!($resource = Block::find($args['id']))) { + throw new RecordNotFoundException(); + } + + if (!Authority::canUpdateBlock($user = $this->getUser($request), $resource)) { + throw new AuthorizationFailedException(); + } + + $body = $request->getParsedBody(); + + $custom_file = new CustomFile( + $body['data']['id'], + $args['id'], + $body['data']['attributes'] + ); + + return $this->getContentResponse( + $resource->type->updateCustomFileMetadata( + $args['file_id'], $custom_file) + ); + } +} diff --git a/lib/classes/JsonApi/SchemaMap.php b/lib/classes/JsonApi/SchemaMap.php index e7168cd..839962d 100644 --- a/lib/classes/JsonApi/SchemaMap.php +++ b/lib/classes/JsonApi/SchemaMap.php @@ -55,6 +55,7 @@ class SchemaMap \Courseware\BlockComment::class => Schemas\Courseware\BlockComment::class, \Courseware\BlockFeedback::class => Schemas\Courseware\BlockFeedback::class, \Courseware\Container::class => Schemas\Courseware\Container::class, + \Courseware\Filesystem\CustomFile::class => Schemas\Courseware\CustomFile::class, \Courseware\Instance::class => Schemas\Courseware\Instance::class, \Courseware\StructuralElement::class => Schemas\Courseware\StructuralElement::class, \Courseware\StructuralElementComment::class => Schemas\Courseware\StructuralElementComment::class, diff --git a/lib/classes/JsonApi/Schemas/Courseware/CustomFile.php b/lib/classes/JsonApi/Schemas/Courseware/CustomFile.php new file mode 100755 index 0000000..21105bc --- /dev/null +++ b/lib/classes/JsonApi/Schemas/Courseware/CustomFile.php @@ -0,0 +1,61 @@ +<?php + +namespace JsonApi\Schemas\Courseware; + +use JsonApi\Schemas\SchemaProvider; +use Neomerx\JsonApi\Contracts\Schema\ContextInterface; +use Neomerx\JsonApi\Schema\Link; +use Neomerx\JsonApi\Contracts\Schema\LinkInterface; + +class CustomFile extends SchemaProvider +{ + const TYPE = 'courseware-custom-file'; + //const REL_CUSTOM_FILE = 'courseware-custom-file'; + + /** + * {@inheritdoc} + */ + public function getId($resource): ?string + { + return $resource->getPayload()['id']; + } + + /** + * {@inheritdoc} + */ + public function getAttributes($resource, ContextInterface $context): iterable + { + return $resource->getPayload(); + } + + /** + * {@inheritdoc} + */ + public function getRelationships($resource, ContextInterface $context): iterable + { + + return []; + } + + public function getSelfLink($resource): LinkInterface + { + $link = new Link(true, '/courseware-blocks/' . $resource->getBlockId() + .'/custom-files', false); + return $link; + } + + /** + * @inheritdoc + */ + public function hasResourceMeta($resource): bool + { + return true; + } + + public function getResourceMeta($resource) + { + return [ + 'download-url' => $resource->getDownloadUrl() + ]; + } +} |
