Skip to content
Snippets Groups Projects
Commit 5e8d267f authored by Jan-Hendrik Willms's avatar Jan-Hendrik Willms
Browse files

fix errors in jsonapi code, fixes #1228

Closes #1228

Merge request studip/studip!740
parent 9a21789a
No related branches found
No related tags found
No related merge requests found
Showing
with 59 additions and 31 deletions
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
namespace JsonApi\Routes\Blubber; namespace JsonApi\Routes\Blubber;
use Psr\Http\Message\ServerRequestInterface as Request; use JsonApi\Errors\BadRequestException;
trait FilterTrait trait FilterTrait
{ {
......
...@@ -4,6 +4,7 @@ namespace JsonApi\Routes\CourseMemberships; ...@@ -4,6 +4,7 @@ namespace JsonApi\Routes\CourseMemberships;
use JsonApi\Errors\AuthorizationFailedException; use JsonApi\Errors\AuthorizationFailedException;
use JsonApi\Errors\BadRequestException; use JsonApi\Errors\BadRequestException;
use JsonApi\Errors\InternalServerError;
use JsonApi\Errors\RecordNotFoundException; use JsonApi\Errors\RecordNotFoundException;
use JsonApi\JsonApiController; use JsonApi\JsonApiController;
use JsonApi\Routes\ValidationTrait; use JsonApi\Routes\ValidationTrait;
......
...@@ -5,6 +5,7 @@ namespace JsonApi\Routes\Courses; ...@@ -5,6 +5,7 @@ namespace JsonApi\Routes\Courses;
use Psr\Http\Message\ServerRequestInterface as Request; use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ResponseInterface as Response;
use JsonApi\Errors\AuthorizationFailedException; use JsonApi\Errors\AuthorizationFailedException;
use JsonApi\Errors\BadRequestException;
use JsonApi\Errors\RecordNotFoundException; use JsonApi\Errors\RecordNotFoundException;
use JsonApi\JsonApiController; use JsonApi\JsonApiController;
use JsonApi\Schemas\CourseMember; use JsonApi\Schemas\CourseMember;
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
namespace JsonApi\Routes\Courses\Rel; namespace JsonApi\Routes\Courses\Rel;
use Psr\Http\Message\ServerRequestInterface as Request; use Psr\Http\Message\ServerRequestInterface as Request;
use JsonApi\Errors\RecordNotFoundException;
use JsonApi\Routes\Courses\Authority; use JsonApi\Routes\Courses\Authority;
use JsonApi\Routes\RelationshipsController; use JsonApi\Routes\RelationshipsController;
......
...@@ -8,6 +8,8 @@ use Courseware\BlockFeedback; ...@@ -8,6 +8,8 @@ use Courseware\BlockFeedback;
use Courseware\Container; use Courseware\Container;
use Courseware\Instance; use Courseware\Instance;
use Courseware\StructuralElement; use Courseware\StructuralElement;
use Courseware\StructuralElementComment;
use Courseware\StructuralElementFeedback;
use Courseware\Task; use Courseware\Task;
use Courseware\TaskFeedback; use Courseware\TaskFeedback;
use Courseware\TaskGroup; use Courseware\TaskGroup;
...@@ -81,7 +83,7 @@ class Authority ...@@ -81,7 +83,7 @@ class Authority
} }
public static function canUpdateEditBlocker(User $user, $resource) public static function canUpdateEditBlocker(User $user, $resource)
{ {
$structural_element = null; $structural_element = null;
if ($resource instanceof Block) { if ($resource instanceof Block) {
$structural_element = $resource->container->structural_element; $structural_element = $resource->container->structural_element;
...@@ -268,6 +270,16 @@ class Authority ...@@ -268,6 +270,16 @@ class Authority
return $resource->user_id === $user->id || self::canUpdateBlock($user, $resource->block); return $resource->user_id === $user->id || self::canUpdateBlock($user, $resource->block);
} }
public static function canUpdateBlockFeedback(User $user, BlockFeedback $resource)
{
return self::canShowBlockFeedback($user, $resource);
}
public static function canDeleteBlockFeedback(User $user, BlockFeedback $resource)
{
return self::canUpdateBlockFeedback($user, $resource);
}
public static function canUploadStructuralElementsImage(User $user, StructuralElement $resource) public static function canUploadStructuralElementsImage(User $user, StructuralElement $resource)
{ {
return self::canUpdateStructuralElement($user, $resource); return self::canUpdateStructuralElement($user, $resource);
...@@ -306,12 +318,12 @@ class Authority ...@@ -306,12 +318,12 @@ class Authority
public static function canDeleteTask(User $user, Task $resource): bool public static function canDeleteTask(User $user, Task $resource): bool
{ {
return self::canCreateTasks($user, $resource['structural_element']); return self::canCreateTasks($user, $resource->structural_element);
} }
public static function canCreateTaskFeedback(User $user, Task $resource): bool public static function canCreateTaskFeedback(User $user, Task $resource): bool
{ {
return self::canCreateTasks($user, $resource['structural_element']); return self::canCreateTasks($user, $resource->structural_element);
} }
public static function canShowTaskFeedback(User $user, Task $resource): bool public static function canShowTaskFeedback(User $user, Task $resource): bool
...@@ -337,7 +349,7 @@ class Authority ...@@ -337,7 +349,7 @@ class Authority
public static function canShowStructuralElementComment(User $user, StructuralElementComment $resource) public static function canShowStructuralElementComment(User $user, StructuralElementComment $resource)
{ {
return self::canShowStructuralElement($user, $resource); return self::canShowStructuralElement($user, $resource->structural_element);
} }
public static function canCreateStructuralElementComment(User $user, StructuralElement $resource) public static function canCreateStructuralElementComment(User $user, StructuralElement $resource)
...@@ -392,7 +404,7 @@ class Authority ...@@ -392,7 +404,7 @@ class Authority
public static function canShowStructuralElementFeedback(User $user, StructuralElementFeedback $resource) public static function canShowStructuralElementFeedback(User $user, StructuralElementFeedback $resource)
{ {
return $resource->user_id === $user->id || self::canUpdateStructuralElement($resource->structural_element); return $resource->user_id === $user->id || self::canUpdateStructuralElement($user, $resource->structural_element);
} }
public static function canDeleteStructuralElementFeedback(User $user, StructuralElementComment $resource) public static function canDeleteStructuralElementFeedback(User $user, StructuralElementComment $resource)
......
...@@ -5,6 +5,7 @@ namespace JsonApi\Routes\Courseware; ...@@ -5,6 +5,7 @@ namespace JsonApi\Routes\Courseware;
use Courseware\Container; use Courseware\Container;
use JsonApi\Errors\AuthorizationFailedException; use JsonApi\Errors\AuthorizationFailedException;
use JsonApi\Errors\RecordNotFoundException; use JsonApi\Errors\RecordNotFoundException;
use JsonApi\Errors\UnprocessableEntityException;
use JsonApi\JsonApiController; use JsonApi\JsonApiController;
use JsonApi\Routes\ValidationTrait; use JsonApi\Routes\ValidationTrait;
use JsonApi\Schemas\Courseware\Container as ContainerSchema; use JsonApi\Schemas\Courseware\Container as ContainerSchema;
......
...@@ -3,11 +3,8 @@ ...@@ -3,11 +3,8 @@
namespace JsonApi\Routes\Courseware\Rel; namespace JsonApi\Routes\Courseware\Rel;
use Courseware\Bookmark; use Courseware\Bookmark;
use Courseware\Instance;
use Courseware\StructuralElement; use Courseware\StructuralElement;
use JsonApi\Errors\AuthorizationFailedException; use JsonApi\Errors\AuthorizationFailedException;
use JsonApi\Errors\BadRequestException;
use JsonApi\Errors\ConflictException;
use JsonApi\Errors\RecordNotFoundException; use JsonApi\Errors\RecordNotFoundException;
use JsonApi\Routes\Courseware\Authority; use JsonApi\Routes\Courseware\Authority;
use JsonApi\Routes\Courseware\CoursewareInstancesHelper; use JsonApi\Routes\Courseware\CoursewareInstancesHelper;
......
...@@ -6,6 +6,7 @@ use Courseware\Filesystem\PublicFolder; ...@@ -6,6 +6,7 @@ use Courseware\Filesystem\PublicFolder;
use Courseware\StructuralElement; use Courseware\StructuralElement;
use JsonApi\Errors\AuthorizationFailedException; use JsonApi\Errors\AuthorizationFailedException;
use JsonApi\Errors\BadRequestException; use JsonApi\Errors\BadRequestException;
use JsonApi\Errors\InternalServerError;
use JsonApi\Errors\RecordNotFoundException; use JsonApi\Errors\RecordNotFoundException;
use JsonApi\NonJsonApiController; use JsonApi\NonJsonApiController;
use JsonApi\Routes\Files\RoutesHelperTrait as FilesRoutesHelper; use JsonApi\Routes\Files\RoutesHelperTrait as FilesRoutesHelper;
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
namespace JsonApi\Routes\Courseware; namespace JsonApi\Routes\Courseware;
use Courseware\Template; use Courseware\Template;
use JsonApi\Errors\RecordNotFoundException; use JsonApi\Errors\AuthorizationFailedException;
use JsonApi\JsonApiController; use JsonApi\JsonApiController;
use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request; use Psr\Http\Message\ServerRequestInterface as Request;
...@@ -29,4 +29,4 @@ class TemplatesIndex extends JsonApiController ...@@ -29,4 +29,4 @@ class TemplatesIndex extends JsonApiController
return $this->getContentResponse($resources); return $this->getContentResponse($resources);
} }
} }
\ No newline at end of file
...@@ -23,8 +23,9 @@ class UserEventsIcal extends NonJsonApiController ...@@ -23,8 +23,9 @@ class UserEventsIcal extends NonJsonApiController
// damit unsichtbare Nutzer nicht ermittelt werden können // damit unsichtbare Nutzer nicht ermittelt werden können
throw new RecordNotFoundException(); throw new RecordNotFoundException();
} }
$calender_writer = new \CalendarWriterICalendar();
$export = new \CalendarExport($calender_writer); $writer = new \CalendarWriterICalendar();
$export = new \CalendarExport($writer);
$export->exportFromDatabase($observedUser->id, 0, 2114377200, ['CalendarEvent', 'CourseEvent', 'CourseCancelledEvent']); $export->exportFromDatabase($observedUser->id, 0, 2114377200, ['CalendarEvent', 'CourseEvent', 'CourseCancelledEvent']);
if ($GLOBALS['_calendar_error']->getMaxStatus(\ErrorHandler::ERROR_CRITICAL)) { if ($GLOBALS['_calendar_error']->getMaxStatus(\ErrorHandler::ERROR_CRITICAL)) {
throw new InternalServerError(); throw new InternalServerError();
......
...@@ -6,8 +6,8 @@ use JsonApi\Errors\AuthorizationFailedException; ...@@ -6,8 +6,8 @@ use JsonApi\Errors\AuthorizationFailedException;
use JsonApi\Errors\RecordNotFoundException; use JsonApi\Errors\RecordNotFoundException;
use JsonApi\JsonApiController; use JsonApi\JsonApiController;
use JsonApi\Routes\ValidationTrait; use JsonApi\Routes\ValidationTrait;
use Neomerx\JsonApi\Document\Error;
use Neomerx\JsonApi\Exceptions\JsonApiException; use Neomerx\JsonApi\Exceptions\JsonApiException;
use Neomerx\JsonApi\Schema\Error;
use Psr\Http\Message\ServerRequestInterface as Request; use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ResponseInterface as Response;
...@@ -61,7 +61,7 @@ class FileRefsUpdate extends JsonApiController ...@@ -61,7 +61,7 @@ class FileRefsUpdate extends JsonApiController
if (!$result instanceof \FileRef) { if (!$result instanceof \FileRef) {
throw new JsonApiException(array_map(function ($error) { throw new JsonApiException(array_map(function ($error) {
return new Error('Bad Request Error', null, 400, null, null, $error); return new Error('Bad Request Error', null, null, null, 400, $error);
}, $result), 400); }, $result), 400);
} }
} }
......
...@@ -5,6 +5,7 @@ namespace JsonApi\Routes\Files; ...@@ -5,6 +5,7 @@ namespace JsonApi\Routes\Files;
use Psr\Http\Message\ServerRequestInterface as Request; use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ResponseInterface as Response;
use JsonApi\Errors\AuthorizationFailedException; use JsonApi\Errors\AuthorizationFailedException;
use JsonApi\Errors\InternalServerError;
use JsonApi\Errors\RecordNotFoundException; use JsonApi\Errors\RecordNotFoundException;
use JsonApi\JsonApiController; use JsonApi\JsonApiController;
......
...@@ -4,6 +4,7 @@ namespace JsonApi\Routes\Files; ...@@ -4,6 +4,7 @@ namespace JsonApi\Routes\Files;
use JsonApi\Errors\BadRequestException; use JsonApi\Errors\BadRequestException;
use JsonApi\Errors\InternalServerError; use JsonApi\Errors\InternalServerError;
use JsonApi\Routes\ArrayHelperTrait;
use JsonApi\Schemas\FileRef as FileRefSchema; use JsonApi\Schemas\FileRef as FileRefSchema;
use JsonApi\Schemas\Folder as FolderSchema; use JsonApi\Schemas\Folder as FolderSchema;
use JsonApi\Schemas\ContentTermsOfUse as ContentTermsOfUseSchema; use JsonApi\Schemas\ContentTermsOfUse as ContentTermsOfUseSchema;
...@@ -13,28 +14,33 @@ use Slim\Psr7\UploadedFile; ...@@ -13,28 +14,33 @@ use Slim\Psr7\UploadedFile;
trait RoutesHelperTrait trait RoutesHelperTrait
{ {
use ArrayHelperTrait {
arrayHas as array_has;
arrayGet as array_get;
}
protected function validateResourceIdentifier($json, $type, $newResource = true) protected function validateResourceIdentifier($json, $type, $newResource = true)
{ {
if (!self::arrayHas($json, 'data')) { if (!self::array_has($json, 'data')) {
return 'Missing `data` member at document´s top level.'; return 'Missing `data` member at document´s top level.';
} }
// type // type
if (self::arrayGet($json, 'data.type') if (self::array_get($json, 'data.type')
!== $type !== $type
) { ) {
return 'Missing `type` member of document´s `data`.'; return 'Missing `type` member of document´s `data`.';
} }
// id // id
if ($newResource && self::arrayHas($json, 'data.id')) { if ($newResource && self::array_has($json, 'data.id')) {
return 'New document must not have an `id`.'; return 'New document must not have an `id`.';
} }
} }
protected function validateFileRefResourceObject($json, \FileRef $fileRef = null) protected function validateFileRefResourceObject($json, \FileRef $fileRef = null)
{ {
if (!self::arrayHas($json, 'data')) { if (!self::array_has($json, 'data')) {
return 'Missing `data` member at document´s top level.'; return 'Missing `data` member at document´s top level.';
} }
...@@ -49,12 +55,12 @@ trait RoutesHelperTrait ...@@ -49,12 +55,12 @@ trait RoutesHelperTrait
} }
// Relationship: terms-of-use // Relationship: terms-of-use
if (self::arrayHas($json, 'data.relationships.terms-of-use')) { if (self::array_has($json, 'data.relationships.terms-of-use')) {
$license = self::arrayGet($json, 'data.relationships.terms-of-use'); $license = self::array_get($json, 'data.relationships.terms-of-use');
if ($err = $this->validateResourceIdentifier($license, ContentTermsOfUseSchema::TYPE, false)) { if ($err = $this->validateResourceIdentifier($license, ContentTermsOfUseSchema::TYPE, false)) {
return $err; return $err;
} }
$termsId = self::arrayGet($license, 'data.id'); $termsId = self::array_get($license, 'data.id');
if (!\ContentTermsOfUse::find($termsId)) { if (!\ContentTermsOfUse::find($termsId)) {
return 'Invalid `terms-of-use` specified.'; return 'Invalid `terms-of-use` specified.';
} }
...@@ -66,12 +72,12 @@ trait RoutesHelperTrait ...@@ -66,12 +72,12 @@ trait RoutesHelperTrait
private function validateFileRefAttributes($json) private function validateFileRefAttributes($json)
{ {
// Attributes // Attributes
if (!self::arrayHas($json, 'data.attributes')) { if (!self::array_has($json, 'data.attributes')) {
return 'Missing `attributes` member of document´s `data`.'; return 'Missing `attributes` member of document´s `data`.';
} }
// Attribute: name // Attribute: name
$name = self::arrayGet($json, 'data.attributes.name'); $name = self::array_get($json, 'data.attributes.name');
if (!$name || 0 === mb_strlen(trim($name))) { if (!$name || 0 === mb_strlen(trim($name))) {
return '`name` must not be empty.'; return '`name` must not be empty.';
} }
...@@ -81,24 +87,24 @@ trait RoutesHelperTrait ...@@ -81,24 +87,24 @@ trait RoutesHelperTrait
{ {
// Attributes needed to create a new folder // Attributes needed to create a new folder
if (!$folder) { if (!$folder) {
if (!self::arrayHas($json, 'data.attributes')) { if (!self::array_has($json, 'data.attributes')) {
return 'Missing `attributes` member of document´s `data`.'; return 'Missing `attributes` member of document´s `data`.';
} }
if (!self::arrayHas($json, 'data.attributes.name')) { if (!self::array_has($json, 'data.attributes.name')) {
return 'Missing `data.name`.'; return 'Missing `data.name`.';
} }
} }
// Attribute: name must not be empty if present // Attribute: name must not be empty if present
if (self::arrayHas($json, 'data.attributes.name') if (self::array_has($json, 'data.attributes.name')
&& !mb_strlen(trim(self::arrayGet($json, 'data.attributes.name', '')))) { && !mb_strlen(trim(self::array_get($json, 'data.attributes.name', '')))) {
return '`name` must not be empty.'; return '`name` must not be empty.';
} }
// Relationship: parent // Relationship: parent
if (self::arrayHas($json, 'data.relationships.parent')) { if (self::array_has($json, 'data.relationships.parent')) {
$parent = self::arrayGet($json, 'data.relationships.parent'); $parent = self::array_get($json, 'data.relationships.parent');
if ($err = $this->validateResourceIdentifier($parent, FolderSchema::TYPE, false)) { if ($err = $this->validateResourceIdentifier($parent, FolderSchema::TYPE, false)) {
return $err; return $err;
} }
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
namespace JsonApi\Routes\Forum; namespace JsonApi\Routes\Forum;
use JsonApi\Errors\AuthorizationFailedException;
use JsonApi\Errors\RecordNotFoundException; use JsonApi\Errors\RecordNotFoundException;
use JsonApi\JsonApiController; use JsonApi\JsonApiController;
use JsonApi\Models\ForumCat; use JsonApi\Models\ForumCat;
......
...@@ -4,6 +4,7 @@ namespace JsonApi\Routes\Forum; ...@@ -4,6 +4,7 @@ namespace JsonApi\Routes\Forum;
use Psr\Http\Message\ServerRequestInterface as Request; use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ResponseInterface as Response;
use JsonApi\Errors\AuthorizationFailedException;
use JsonApi\Errors\RecordNotFoundException; use JsonApi\Errors\RecordNotFoundException;
use JsonApi\JsonApiController; use JsonApi\JsonApiController;
use JsonApi\Models\ForumEntry; use JsonApi\Models\ForumEntry;
......
...@@ -4,6 +4,7 @@ namespace JsonApi\Routes\News; ...@@ -4,6 +4,7 @@ namespace JsonApi\Routes\News;
use Psr\Http\Message\ServerRequestInterface as Request; use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ResponseInterface as Response;
use JsonApi\Errors\AuthorizationFailedException;
use JsonApi\Errors\RecordNotFoundException; use JsonApi\Errors\RecordNotFoundException;
use JsonApi\JsonApiController; use JsonApi\JsonApiController;
......
...@@ -4,6 +4,7 @@ namespace JsonApi\Routes\News; ...@@ -4,6 +4,7 @@ namespace JsonApi\Routes\News;
use Psr\Http\Message\ServerRequestInterface as Request; use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ResponseInterface as Response;
use JsonApi\Errors\AuthorizationFailedException;
use JsonApi\Errors\RecordNotFoundException; use JsonApi\Errors\RecordNotFoundException;
use JsonApi\JsonApiController; use JsonApi\JsonApiController;
......
...@@ -4,6 +4,7 @@ namespace JsonApi\Routes\News; ...@@ -4,6 +4,7 @@ namespace JsonApi\Routes\News;
use Psr\Http\Message\ServerRequestInterface as Request; use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ResponseInterface as Response;
use JsonApi\Errors\AuthorizationFailedException;
use JsonApi\Errors\RecordNotFoundException; use JsonApi\Errors\RecordNotFoundException;
use JsonApi\JsonApiController; use JsonApi\JsonApiController;
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
namespace JsonApi\Routes\News; namespace JsonApi\Routes\News;
use JsonApi\Errors\AuthorizationFailedException; use JsonApi\Errors\AuthorizationFailedException;
use JsonApi\Errors\InternalServerError;
use JsonApi\Errors\RecordNotFoundException; use JsonApi\Errors\RecordNotFoundException;
use JsonApi\JsonApiController; use JsonApi\JsonApiController;
use JsonApi\Routes\ValidationTrait; use JsonApi\Routes\ValidationTrait;
......
...@@ -189,7 +189,7 @@ class Ranges extends RelationshipsController ...@@ -189,7 +189,7 @@ class Ranges extends RelationshipsController
private function getGlobalRange() private function getGlobalRange()
{ {
return new \JsonApi\Model\Studip(); return new \JsonApi\Models\Studip();
} }
private function addRanges(\StudipNews $news, array $ranges) private function addRanges(\StudipNews $news, array $ranges)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment