From 5e8d267f10b5ae3b2a2d9bd82eb6ed44885950bd Mon Sep 17 00:00:00 2001
From: Jan-Hendrik Willms <tleilax+studip@gmail.com>
Date: Mon, 4 Jul 2022 07:53:03 +0000
Subject: [PATCH] fix errors in jsonapi code, fixes #1228

Closes #1228

Merge request studip/studip!740
---
 .../JsonApi/Routes/Blubber/FilterTrait.php    |  2 +-
 .../CourseMembershipsUpdate.php               |  1 +
 .../Courses/CoursesMembershipsIndex.php       |  1 +
 .../Routes/Courses/Rel/Memberships.php        |  1 +
 .../JsonApi/Routes/Courseware/Authority.php   | 22 +++++++++---
 .../Routes/Courseware/ContainersUpdate.php    |  1 +
 .../Rel/UsersBookmarkedStructuralElements.php |  3 --
 .../StructuralElementsImageUpload.php         |  1 +
 .../Routes/Courseware/TemplatesIndex.php      |  4 +--
 .../JsonApi/Routes/Events/UserEventsIcal.php  |  5 +--
 .../JsonApi/Routes/Files/FileRefsUpdate.php   |  4 +--
 .../JsonApi/Routes/Files/FoldersDelete.php    |  1 +
 .../Routes/Files/RoutesHelperTrait.php        | 36 +++++++++++--------
 .../Routes/Forum/ForumCategoriesDelete.php    |  1 +
 .../Routes/Forum/ForumEntriesDelete.php       |  1 +
 .../JsonApi/Routes/News/ByCurrentUser.php     |  1 +
 .../JsonApi/Routes/News/ByUserIndex.php       |  1 +
 .../JsonApi/Routes/News/CommentsIndex.php     |  1 +
 .../JsonApi/Routes/News/NewsUpdate.php        |  1 +
 .../JsonApi/Routes/News/Rel/Ranges.php        |  2 +-
 .../Routes/News/StudipNewsDatesHelper.php     |  1 +
 .../JsonApi/Routes/News/UserNewsCreate.php    |  1 +
 .../JsonApi/Routes/Wiki/WikiCreate.php        |  6 ++--
 .../JsonApi/Routes/Wiki/WikiDelete.php        |  1 +
 lib/classes/JsonApi/Schemas/StudipNews.php    |  2 +-
 25 files changed, 67 insertions(+), 34 deletions(-)

diff --git a/lib/classes/JsonApi/Routes/Blubber/FilterTrait.php b/lib/classes/JsonApi/Routes/Blubber/FilterTrait.php
index 1f043388f68..40bf4b0a098 100644
--- a/lib/classes/JsonApi/Routes/Blubber/FilterTrait.php
+++ b/lib/classes/JsonApi/Routes/Blubber/FilterTrait.php
@@ -2,7 +2,7 @@
 
 namespace JsonApi\Routes\Blubber;
 
-use Psr\Http\Message\ServerRequestInterface as Request;
+use JsonApi\Errors\BadRequestException;
 
 trait FilterTrait
 {
diff --git a/lib/classes/JsonApi/Routes/CourseMemberships/CourseMembershipsUpdate.php b/lib/classes/JsonApi/Routes/CourseMemberships/CourseMembershipsUpdate.php
index 1ec91e7d72f..6bf71eadd06 100644
--- a/lib/classes/JsonApi/Routes/CourseMemberships/CourseMembershipsUpdate.php
+++ b/lib/classes/JsonApi/Routes/CourseMemberships/CourseMembershipsUpdate.php
@@ -4,6 +4,7 @@ namespace JsonApi\Routes\CourseMemberships;
 
 use JsonApi\Errors\AuthorizationFailedException;
 use JsonApi\Errors\BadRequestException;
+use JsonApi\Errors\InternalServerError;
 use JsonApi\Errors\RecordNotFoundException;
 use JsonApi\JsonApiController;
 use JsonApi\Routes\ValidationTrait;
diff --git a/lib/classes/JsonApi/Routes/Courses/CoursesMembershipsIndex.php b/lib/classes/JsonApi/Routes/Courses/CoursesMembershipsIndex.php
index 0d09a34ce1d..d4877bbe969 100644
--- a/lib/classes/JsonApi/Routes/Courses/CoursesMembershipsIndex.php
+++ b/lib/classes/JsonApi/Routes/Courses/CoursesMembershipsIndex.php
@@ -5,6 +5,7 @@ namespace JsonApi\Routes\Courses;
 use Psr\Http\Message\ServerRequestInterface as Request;
 use Psr\Http\Message\ResponseInterface as Response;
 use JsonApi\Errors\AuthorizationFailedException;
+use JsonApi\Errors\BadRequestException;
 use JsonApi\Errors\RecordNotFoundException;
 use JsonApi\JsonApiController;
 use JsonApi\Schemas\CourseMember;
diff --git a/lib/classes/JsonApi/Routes/Courses/Rel/Memberships.php b/lib/classes/JsonApi/Routes/Courses/Rel/Memberships.php
index 2932aaafe29..77591bffd66 100644
--- a/lib/classes/JsonApi/Routes/Courses/Rel/Memberships.php
+++ b/lib/classes/JsonApi/Routes/Courses/Rel/Memberships.php
@@ -3,6 +3,7 @@
 namespace JsonApi\Routes\Courses\Rel;
 
 use Psr\Http\Message\ServerRequestInterface as Request;
+use JsonApi\Errors\RecordNotFoundException;
 use JsonApi\Routes\Courses\Authority;
 use JsonApi\Routes\RelationshipsController;
 
diff --git a/lib/classes/JsonApi/Routes/Courseware/Authority.php b/lib/classes/JsonApi/Routes/Courseware/Authority.php
index 9c5a37b4fbc..6f192d7d451 100755
--- a/lib/classes/JsonApi/Routes/Courseware/Authority.php
+++ b/lib/classes/JsonApi/Routes/Courseware/Authority.php
@@ -8,6 +8,8 @@ use Courseware\BlockFeedback;
 use Courseware\Container;
 use Courseware\Instance;
 use Courseware\StructuralElement;
+use Courseware\StructuralElementComment;
+use Courseware\StructuralElementFeedback;
 use Courseware\Task;
 use Courseware\TaskFeedback;
 use Courseware\TaskGroup;
@@ -81,7 +83,7 @@ class Authority
     }
 
     public static function canUpdateEditBlocker(User $user, $resource)
-    { 
+    {
         $structural_element = null;
         if ($resource instanceof Block) {
             $structural_element = $resource->container->structural_element;
@@ -268,6 +270,16 @@ class Authority
         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)
     {
         return self::canUpdateStructuralElement($user, $resource);
@@ -306,12 +318,12 @@ class Authority
 
     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
     {
-        return self::canCreateTasks($user, $resource['structural_element']);
+        return self::canCreateTasks($user, $resource->structural_element);
     }
 
     public static function canShowTaskFeedback(User $user, Task $resource): bool
@@ -337,7 +349,7 @@ class Authority
 
     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)
@@ -392,7 +404,7 @@ class Authority
 
     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)
diff --git a/lib/classes/JsonApi/Routes/Courseware/ContainersUpdate.php b/lib/classes/JsonApi/Routes/Courseware/ContainersUpdate.php
index 77d3d2c75b2..219395d2209 100755
--- a/lib/classes/JsonApi/Routes/Courseware/ContainersUpdate.php
+++ b/lib/classes/JsonApi/Routes/Courseware/ContainersUpdate.php
@@ -5,6 +5,7 @@ namespace JsonApi\Routes\Courseware;
 use Courseware\Container;
 use JsonApi\Errors\AuthorizationFailedException;
 use JsonApi\Errors\RecordNotFoundException;
+use JsonApi\Errors\UnprocessableEntityException;
 use JsonApi\JsonApiController;
 use JsonApi\Routes\ValidationTrait;
 use JsonApi\Schemas\Courseware\Container as ContainerSchema;
diff --git a/lib/classes/JsonApi/Routes/Courseware/Rel/UsersBookmarkedStructuralElements.php b/lib/classes/JsonApi/Routes/Courseware/Rel/UsersBookmarkedStructuralElements.php
index 7f05c66a648..cfe487d6652 100755
--- a/lib/classes/JsonApi/Routes/Courseware/Rel/UsersBookmarkedStructuralElements.php
+++ b/lib/classes/JsonApi/Routes/Courseware/Rel/UsersBookmarkedStructuralElements.php
@@ -3,11 +3,8 @@
 namespace JsonApi\Routes\Courseware\Rel;
 
 use Courseware\Bookmark;
-use Courseware\Instance;
 use Courseware\StructuralElement;
 use JsonApi\Errors\AuthorizationFailedException;
-use JsonApi\Errors\BadRequestException;
-use JsonApi\Errors\ConflictException;
 use JsonApi\Errors\RecordNotFoundException;
 use JsonApi\Routes\Courseware\Authority;
 use JsonApi\Routes\Courseware\CoursewareInstancesHelper;
diff --git a/lib/classes/JsonApi/Routes/Courseware/StructuralElementsImageUpload.php b/lib/classes/JsonApi/Routes/Courseware/StructuralElementsImageUpload.php
index 070ca6c842c..3f85d9bb3cf 100755
--- a/lib/classes/JsonApi/Routes/Courseware/StructuralElementsImageUpload.php
+++ b/lib/classes/JsonApi/Routes/Courseware/StructuralElementsImageUpload.php
@@ -6,6 +6,7 @@ use Courseware\Filesystem\PublicFolder;
 use Courseware\StructuralElement;
 use JsonApi\Errors\AuthorizationFailedException;
 use JsonApi\Errors\BadRequestException;
+use JsonApi\Errors\InternalServerError;
 use JsonApi\Errors\RecordNotFoundException;
 use JsonApi\NonJsonApiController;
 use JsonApi\Routes\Files\RoutesHelperTrait as FilesRoutesHelper;
diff --git a/lib/classes/JsonApi/Routes/Courseware/TemplatesIndex.php b/lib/classes/JsonApi/Routes/Courseware/TemplatesIndex.php
index 1831bb7ef29..9345a59fcc1 100755
--- a/lib/classes/JsonApi/Routes/Courseware/TemplatesIndex.php
+++ b/lib/classes/JsonApi/Routes/Courseware/TemplatesIndex.php
@@ -3,7 +3,7 @@
 namespace JsonApi\Routes\Courseware;
 
 use Courseware\Template;
-use JsonApi\Errors\RecordNotFoundException;
+use JsonApi\Errors\AuthorizationFailedException;
 use JsonApi\JsonApiController;
 use Psr\Http\Message\ResponseInterface as Response;
 use Psr\Http\Message\ServerRequestInterface as Request;
@@ -29,4 +29,4 @@ class TemplatesIndex extends JsonApiController
 
         return $this->getContentResponse($resources);
     }
-}
\ No newline at end of file
+}
diff --git a/lib/classes/JsonApi/Routes/Events/UserEventsIcal.php b/lib/classes/JsonApi/Routes/Events/UserEventsIcal.php
index 335f90556a9..c8080c46803 100644
--- a/lib/classes/JsonApi/Routes/Events/UserEventsIcal.php
+++ b/lib/classes/JsonApi/Routes/Events/UserEventsIcal.php
@@ -23,8 +23,9 @@ class UserEventsIcal extends NonJsonApiController
             // damit unsichtbare Nutzer nicht ermittelt werden können
             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']);
         if ($GLOBALS['_calendar_error']->getMaxStatus(\ErrorHandler::ERROR_CRITICAL)) {
             throw new InternalServerError();
diff --git a/lib/classes/JsonApi/Routes/Files/FileRefsUpdate.php b/lib/classes/JsonApi/Routes/Files/FileRefsUpdate.php
index 08126f43589..27ddabab7b1 100644
--- a/lib/classes/JsonApi/Routes/Files/FileRefsUpdate.php
+++ b/lib/classes/JsonApi/Routes/Files/FileRefsUpdate.php
@@ -6,8 +6,8 @@ use JsonApi\Errors\AuthorizationFailedException;
 use JsonApi\Errors\RecordNotFoundException;
 use JsonApi\JsonApiController;
 use JsonApi\Routes\ValidationTrait;
-use Neomerx\JsonApi\Document\Error;
 use Neomerx\JsonApi\Exceptions\JsonApiException;
+use Neomerx\JsonApi\Schema\Error;
 use Psr\Http\Message\ServerRequestInterface as Request;
 use Psr\Http\Message\ResponseInterface as Response;
 
@@ -61,7 +61,7 @@ class FileRefsUpdate extends JsonApiController
 
         if (!$result instanceof \FileRef) {
             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);
         }
     }
diff --git a/lib/classes/JsonApi/Routes/Files/FoldersDelete.php b/lib/classes/JsonApi/Routes/Files/FoldersDelete.php
index c383e02cb65..2ed7e45b77a 100644
--- a/lib/classes/JsonApi/Routes/Files/FoldersDelete.php
+++ b/lib/classes/JsonApi/Routes/Files/FoldersDelete.php
@@ -5,6 +5,7 @@ namespace JsonApi\Routes\Files;
 use Psr\Http\Message\ServerRequestInterface as Request;
 use Psr\Http\Message\ResponseInterface as Response;
 use JsonApi\Errors\AuthorizationFailedException;
+use JsonApi\Errors\InternalServerError;
 use JsonApi\Errors\RecordNotFoundException;
 use JsonApi\JsonApiController;
 
diff --git a/lib/classes/JsonApi/Routes/Files/RoutesHelperTrait.php b/lib/classes/JsonApi/Routes/Files/RoutesHelperTrait.php
index 8122ec59893..cc8785ee729 100644
--- a/lib/classes/JsonApi/Routes/Files/RoutesHelperTrait.php
+++ b/lib/classes/JsonApi/Routes/Files/RoutesHelperTrait.php
@@ -4,6 +4,7 @@ namespace JsonApi\Routes\Files;
 
 use JsonApi\Errors\BadRequestException;
 use JsonApi\Errors\InternalServerError;
+use JsonApi\Routes\ArrayHelperTrait;
 use JsonApi\Schemas\FileRef as FileRefSchema;
 use JsonApi\Schemas\Folder as FolderSchema;
 use JsonApi\Schemas\ContentTermsOfUse as ContentTermsOfUseSchema;
@@ -13,28 +14,33 @@ use Slim\Psr7\UploadedFile;
 
 trait RoutesHelperTrait
 {
+    use ArrayHelperTrait {
+        arrayHas as array_has;
+        arrayGet as array_get;
+    }
+
     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.';
         }
 
         // type
-        if (self::arrayGet($json, 'data.type')
+        if (self::array_get($json, 'data.type')
             !== $type
         ) {
             return 'Missing `type` member of document´s `data`.';
         }
 
         // id
-        if ($newResource && self::arrayHas($json, 'data.id')) {
+        if ($newResource && self::array_has($json, 'data.id')) {
             return 'New document must not have an `id`.';
         }
     }
 
     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.';
         }
 
@@ -49,12 +55,12 @@ trait RoutesHelperTrait
         }
 
         // Relationship: terms-of-use
-        if (self::arrayHas($json, 'data.relationships.terms-of-use')) {
-            $license = self::arrayGet($json, 'data.relationships.terms-of-use');
+        if (self::array_has($json, 'data.relationships.terms-of-use')) {
+            $license = self::array_get($json, 'data.relationships.terms-of-use');
             if ($err = $this->validateResourceIdentifier($license, ContentTermsOfUseSchema::TYPE, false)) {
                 return $err;
             }
-            $termsId = self::arrayGet($license, 'data.id');
+            $termsId = self::array_get($license, 'data.id');
             if (!\ContentTermsOfUse::find($termsId)) {
                 return 'Invalid `terms-of-use` specified.';
             }
@@ -66,12 +72,12 @@ trait RoutesHelperTrait
     private function validateFileRefAttributes($json)
     {
         // Attributes
-        if (!self::arrayHas($json, 'data.attributes')) {
+        if (!self::array_has($json, 'data.attributes')) {
             return 'Missing `attributes` member of document´s `data`.';
         }
 
         // Attribute: name
-        $name = self::arrayGet($json, 'data.attributes.name');
+        $name = self::array_get($json, 'data.attributes.name');
         if (!$name || 0 === mb_strlen(trim($name))) {
             return '`name` must not be empty.';
         }
@@ -81,24 +87,24 @@ trait RoutesHelperTrait
     {
         // Attributes needed to create a new folder
         if (!$folder) {
-            if (!self::arrayHas($json, 'data.attributes')) {
+            if (!self::array_has($json, 'data.attributes')) {
                 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`.';
             }
         }
 
         // Attribute: name must not be empty if present
-        if (self::arrayHas($json, 'data.attributes.name')
-            && !mb_strlen(trim(self::arrayGet($json, 'data.attributes.name', '')))) {
+        if (self::array_has($json, 'data.attributes.name')
+            && !mb_strlen(trim(self::array_get($json, 'data.attributes.name', '')))) {
             return '`name` must not be empty.';
         }
 
         // Relationship: parent
-        if (self::arrayHas($json, 'data.relationships.parent')) {
-            $parent = self::arrayGet($json, 'data.relationships.parent');
+        if (self::array_has($json, 'data.relationships.parent')) {
+            $parent = self::array_get($json, 'data.relationships.parent');
             if ($err = $this->validateResourceIdentifier($parent, FolderSchema::TYPE, false)) {
                 return $err;
             }
diff --git a/lib/classes/JsonApi/Routes/Forum/ForumCategoriesDelete.php b/lib/classes/JsonApi/Routes/Forum/ForumCategoriesDelete.php
index 8cd431b9bf7..2441a1f88b0 100644
--- a/lib/classes/JsonApi/Routes/Forum/ForumCategoriesDelete.php
+++ b/lib/classes/JsonApi/Routes/Forum/ForumCategoriesDelete.php
@@ -2,6 +2,7 @@
 
 namespace JsonApi\Routes\Forum;
 
+use JsonApi\Errors\AuthorizationFailedException;
 use JsonApi\Errors\RecordNotFoundException;
 use JsonApi\JsonApiController;
 use JsonApi\Models\ForumCat;
diff --git a/lib/classes/JsonApi/Routes/Forum/ForumEntriesDelete.php b/lib/classes/JsonApi/Routes/Forum/ForumEntriesDelete.php
index 319510fd269..41de02d0488 100644
--- a/lib/classes/JsonApi/Routes/Forum/ForumEntriesDelete.php
+++ b/lib/classes/JsonApi/Routes/Forum/ForumEntriesDelete.php
@@ -4,6 +4,7 @@ namespace JsonApi\Routes\Forum;
 
 use Psr\Http\Message\ServerRequestInterface as Request;
 use Psr\Http\Message\ResponseInterface as Response;
+use JsonApi\Errors\AuthorizationFailedException;
 use JsonApi\Errors\RecordNotFoundException;
 use JsonApi\JsonApiController;
 use JsonApi\Models\ForumEntry;
diff --git a/lib/classes/JsonApi/Routes/News/ByCurrentUser.php b/lib/classes/JsonApi/Routes/News/ByCurrentUser.php
index d6fe3d6f258..1c858b39e60 100644
--- a/lib/classes/JsonApi/Routes/News/ByCurrentUser.php
+++ b/lib/classes/JsonApi/Routes/News/ByCurrentUser.php
@@ -4,6 +4,7 @@ namespace JsonApi\Routes\News;
 
 use Psr\Http\Message\ServerRequestInterface as Request;
 use Psr\Http\Message\ResponseInterface as Response;
+use JsonApi\Errors\AuthorizationFailedException;
 use JsonApi\Errors\RecordNotFoundException;
 use JsonApi\JsonApiController;
 
diff --git a/lib/classes/JsonApi/Routes/News/ByUserIndex.php b/lib/classes/JsonApi/Routes/News/ByUserIndex.php
index f460a19fe6b..3d1574d6643 100644
--- a/lib/classes/JsonApi/Routes/News/ByUserIndex.php
+++ b/lib/classes/JsonApi/Routes/News/ByUserIndex.php
@@ -4,6 +4,7 @@ namespace JsonApi\Routes\News;
 
 use Psr\Http\Message\ServerRequestInterface as Request;
 use Psr\Http\Message\ResponseInterface as Response;
+use JsonApi\Errors\AuthorizationFailedException;
 use JsonApi\Errors\RecordNotFoundException;
 use JsonApi\JsonApiController;
 
diff --git a/lib/classes/JsonApi/Routes/News/CommentsIndex.php b/lib/classes/JsonApi/Routes/News/CommentsIndex.php
index d25319f4783..581ba3bf364 100644
--- a/lib/classes/JsonApi/Routes/News/CommentsIndex.php
+++ b/lib/classes/JsonApi/Routes/News/CommentsIndex.php
@@ -4,6 +4,7 @@ namespace JsonApi\Routes\News;
 
 use Psr\Http\Message\ServerRequestInterface as Request;
 use Psr\Http\Message\ResponseInterface as Response;
+use JsonApi\Errors\AuthorizationFailedException;
 use JsonApi\Errors\RecordNotFoundException;
 use JsonApi\JsonApiController;
 
diff --git a/lib/classes/JsonApi/Routes/News/NewsUpdate.php b/lib/classes/JsonApi/Routes/News/NewsUpdate.php
index 425929dbf09..269c4501e01 100644
--- a/lib/classes/JsonApi/Routes/News/NewsUpdate.php
+++ b/lib/classes/JsonApi/Routes/News/NewsUpdate.php
@@ -3,6 +3,7 @@
 namespace JsonApi\Routes\News;
 
 use JsonApi\Errors\AuthorizationFailedException;
+use JsonApi\Errors\InternalServerError;
 use JsonApi\Errors\RecordNotFoundException;
 use JsonApi\JsonApiController;
 use JsonApi\Routes\ValidationTrait;
diff --git a/lib/classes/JsonApi/Routes/News/Rel/Ranges.php b/lib/classes/JsonApi/Routes/News/Rel/Ranges.php
index 3f90dcdcf4d..ceeddcace1b 100644
--- a/lib/classes/JsonApi/Routes/News/Rel/Ranges.php
+++ b/lib/classes/JsonApi/Routes/News/Rel/Ranges.php
@@ -189,7 +189,7 @@ class Ranges extends RelationshipsController
 
     private function getGlobalRange()
     {
-        return new \JsonApi\Model\Studip();
+        return new \JsonApi\Models\Studip();
     }
 
     private function addRanges(\StudipNews $news, array $ranges)
diff --git a/lib/classes/JsonApi/Routes/News/StudipNewsDatesHelper.php b/lib/classes/JsonApi/Routes/News/StudipNewsDatesHelper.php
index 876baf67b64..cfb51585968 100644
--- a/lib/classes/JsonApi/Routes/News/StudipNewsDatesHelper.php
+++ b/lib/classes/JsonApi/Routes/News/StudipNewsDatesHelper.php
@@ -2,6 +2,7 @@
 
 namespace JsonApi\Routes\News;
 
+use DateTime;
 use JsonApi\Routes\TimestampTrait;
 
 trait StudipNewsDatesHelper
diff --git a/lib/classes/JsonApi/Routes/News/UserNewsCreate.php b/lib/classes/JsonApi/Routes/News/UserNewsCreate.php
index 84ea30efb50..7580202504a 100644
--- a/lib/classes/JsonApi/Routes/News/UserNewsCreate.php
+++ b/lib/classes/JsonApi/Routes/News/UserNewsCreate.php
@@ -6,6 +6,7 @@ use Psr\Http\Message\ServerRequestInterface as Request;
 use Psr\Http\Message\ResponseInterface as Response;
 use JsonApi\Errors\AuthorizationFailedException;
 use JsonApi\Errors\InternalServerError;
+use JsonApi\Errors\RecordNotFoundException;
 
 /**
  * Create a news where the range is the user himself.
diff --git a/lib/classes/JsonApi/Routes/Wiki/WikiCreate.php b/lib/classes/JsonApi/Routes/Wiki/WikiCreate.php
index d3eb1671299..79a8a558fd0 100644
--- a/lib/classes/JsonApi/Routes/Wiki/WikiCreate.php
+++ b/lib/classes/JsonApi/Routes/Wiki/WikiCreate.php
@@ -4,8 +4,10 @@ namespace JsonApi\Routes\Wiki;
 
 use Psr\Http\Message\ServerRequestInterface as Request;
 use Psr\Http\Message\ResponseInterface as Response;
-use JsonApi\Errors\ConflictError;
+use JsonApi\Errors\AuthorizationFailedException;
+use JsonApi\Errors\ConflictException;
 use JsonApi\Errors\InternalServerError;
+use JsonApi\Errors\RecordNotFoundException;
 use JsonApi\JsonApiController;
 use JsonApi\Routes\ValidationTrait;
 use JsonApi\Schemas\WikiPage;
@@ -38,7 +40,7 @@ class WikiCreate extends JsonApiController
         $keyword = self::arrayGet($json, 'data.attributes.keyword');
 
         if (\WikiPage::findLatestPage($range->id, $keyword)) {
-            throw new ConflictError('Wiki page already exists.');
+            throw new ConflictException('Wiki page already exists.');
         }
 
         if (!$wiki = $this->createWikiFromJSON($user, $range, $json)) {
diff --git a/lib/classes/JsonApi/Routes/Wiki/WikiDelete.php b/lib/classes/JsonApi/Routes/Wiki/WikiDelete.php
index 6573e7f34ff..709c468692e 100644
--- a/lib/classes/JsonApi/Routes/Wiki/WikiDelete.php
+++ b/lib/classes/JsonApi/Routes/Wiki/WikiDelete.php
@@ -4,6 +4,7 @@ namespace JsonApi\Routes\Wiki;
 
 use Psr\Http\Message\ServerRequestInterface as Request;
 use Psr\Http\Message\ResponseInterface as Response;
+use JsonApi\Errors\AuthorizationFailedException;
 use JsonApi\JsonApiController;
 
 require_once 'lib/wiki.inc.php';
diff --git a/lib/classes/JsonApi/Schemas/StudipNews.php b/lib/classes/JsonApi/Schemas/StudipNews.php
index 1bf766aee4e..d9504ad4f54 100644
--- a/lib/classes/JsonApi/Schemas/StudipNews.php
+++ b/lib/classes/JsonApi/Schemas/StudipNews.php
@@ -113,7 +113,7 @@ class StudipNews extends SchemaProvider
         return $news->news_ranges->map(function ($range) use ($include) {
             switch ($range->type) {
                 case 'global':
-                    return new \Jsonapi\Models\Studip();
+                    return new \JsonApi\Models\Studip();
 
                 case 'sem':
                     return $include
-- 
GitLab