aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMurtaza Sultani <sultani@data-quest.de>2025-09-05 15:47:50 +0200
committerMurtaza Sultani <sultani@data-quest.de>2025-09-05 15:47:50 +0200
commit9bb68bf5d075ff0e127b9fe5309889f366ccf127 (patch)
tree992cce643bf95fc3e6985920aea86cf54335cbec /lib
parent8a6831f7d910f3ff7791d27fdf3988028982caa5 (diff)
Resolve "Forum: Discussion-Type Index auf Vue umsetzen"
Closes #5782 Merge request studip/studip!4406
Diffstat (limited to 'lib')
-rw-r--r--lib/classes/JsonApi/RouteMap.php2
-rw-r--r--lib/classes/JsonApi/Routes/Forum/DiscussionTypeDelete.php29
-rw-r--r--lib/classes/JsonApi/Routes/Forum/DiscussionTypeIndex.php6
-rw-r--r--lib/classes/JsonApi/Routes/Forum/DiscussionTypeShow.php4
-rw-r--r--lib/classes/JsonApi/Routes/Forum/DiscussionTypeStore.php46
-rw-r--r--lib/classes/JsonApi/Schemas/Forum/DiscussionType.php32
-rw-r--r--lib/models/Forum/DiscussionType.php16
7 files changed, 112 insertions, 23 deletions
diff --git a/lib/classes/JsonApi/RouteMap.php b/lib/classes/JsonApi/RouteMap.php
index 47bd666..ca53a4a 100644
--- a/lib/classes/JsonApi/RouteMap.php
+++ b/lib/classes/JsonApi/RouteMap.php
@@ -695,7 +695,9 @@ class RouteMap
$group->group('/forum-discussion-types', function ($forum) {
$forum->get('', Routes\Forum\DiscussionTypeIndex::class);
+ $forum->post('', Routes\Forum\DiscussionTypeStore::class);
$forum->get('/{type_id}', Routes\Forum\DiscussionTypeShow::class);
+ $forum->delete('/{type_id}', Routes\Forum\DiscussionTypeDelete::class);
});
$group->group('/forum-postings', function ($forum) {
diff --git a/lib/classes/JsonApi/Routes/Forum/DiscussionTypeDelete.php b/lib/classes/JsonApi/Routes/Forum/DiscussionTypeDelete.php
new file mode 100644
index 0000000..2ff19c4
--- /dev/null
+++ b/lib/classes/JsonApi/Routes/Forum/DiscussionTypeDelete.php
@@ -0,0 +1,29 @@
+<?php
+namespace JsonApi\Routes\Forum;
+
+use Forum\DiscussionType;
+use JsonApi\Errors\AuthorizationFailedException;
+use JsonApi\Errors\RecordNotFoundException;
+use Psr\Http\Message\ServerRequestInterface as Request;
+use Psr\Http\Message\ResponseInterface as Response;
+use JsonApi\JsonApiController;
+
+class DiscussionTypeDelete extends JsonApiController
+{
+ public function __invoke(Request $request, Response $response, $args)
+ {
+ $user = $this->getUser($request);
+ if (!$GLOBALS['perm']->have_perm('root', $user->id)) {
+ throw new AuthorizationFailedException();
+ }
+
+ $discussion_type = DiscussionType::find($args['type_id']);
+ if (!$discussion_type) {
+ throw new RecordNotFoundException();
+ }
+
+ $discussion_type->delete();
+
+ return $this->getCodeResponse(204);
+ }
+}
diff --git a/lib/classes/JsonApi/Routes/Forum/DiscussionTypeIndex.php b/lib/classes/JsonApi/Routes/Forum/DiscussionTypeIndex.php
index cd32b90..2955c97 100644
--- a/lib/classes/JsonApi/Routes/Forum/DiscussionTypeIndex.php
+++ b/lib/classes/JsonApi/Routes/Forum/DiscussionTypeIndex.php
@@ -2,7 +2,6 @@
namespace JsonApi\Routes\Forum;
use Forum\DiscussionType;
-use JsonApi\Errors\BadRequestException;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Message\ResponseInterface as Response;
use JsonApi\JsonApiController;
@@ -10,13 +9,10 @@ use JsonApi\JsonApiController;
class DiscussionTypeIndex extends JsonApiController
{
protected $allowedPagingParameters = ['offset', 'limit'];
- protected $allowedIncludePaths = [
- \JsonApi\Schemas\Forum\DiscussionType::REL_DISCUSSIONS
- ];
public function __invoke(Request $request, Response $response, $args)
{
- $discussion_types = DiscussionType::findBySQL('1');
+ $discussion_types = DiscussionType::getAll();
return $this->getPaginatedContentResponse(
array_slice($discussion_types, ...$this->getOffsetAndLimit()),
diff --git a/lib/classes/JsonApi/Routes/Forum/DiscussionTypeShow.php b/lib/classes/JsonApi/Routes/Forum/DiscussionTypeShow.php
index 939835a..6bfdc0f 100644
--- a/lib/classes/JsonApi/Routes/Forum/DiscussionTypeShow.php
+++ b/lib/classes/JsonApi/Routes/Forum/DiscussionTypeShow.php
@@ -9,10 +9,6 @@ use JsonApi\JsonApiController;
class DiscussionTypeShow extends JsonApiController
{
- protected $allowedIncludePaths = [
- \JsonApi\Schemas\Forum\DiscussionType::REL_DISCUSSIONS
- ];
-
public function __invoke(Request $request, Response $response, $args)
{
$discussion_type = DiscussionType::find($args['type_id']);
diff --git a/lib/classes/JsonApi/Routes/Forum/DiscussionTypeStore.php b/lib/classes/JsonApi/Routes/Forum/DiscussionTypeStore.php
new file mode 100644
index 0000000..20db2cc
--- /dev/null
+++ b/lib/classes/JsonApi/Routes/Forum/DiscussionTypeStore.php
@@ -0,0 +1,46 @@
+<?php
+namespace JsonApi\Routes\Forum;
+
+use Psr\Http\Message\ServerRequestInterface as Request;
+use Psr\Http\Message\ResponseInterface as Response;
+use JsonApi\Errors\AuthorizationFailedException;
+use JsonApi\JsonApiController;
+use JsonApi\Routes\ValidationTrait;
+use Forum\DiscussionType;
+
+class DiscussionTypeStore extends JsonApiController
+{
+ use ValidationTrait;
+
+ public function __invoke(Request $request, Response $response, $args)
+ {
+ $user = $this->getUser($request);
+ if (!$GLOBALS['perm']->have_perm('root', $user->id)) {
+ throw new AuthorizationFailedException();
+ }
+
+ $json = $this->validate($request);
+ $discussion_type = DiscussionType::create([
+ 'name' => self::arrayGet($json, 'data.attributes.name'),
+ 'icon' => self::arrayGet($json, 'data.attributes.icon')
+ ]);
+
+ return $this->getCreatedResponse($discussion_type);
+ }
+
+ protected function validateResourceDocument($json, $data)
+ {
+ $required_keys = [
+ 'data.attributes.name' => 'Missing `data.attributes.name`',
+ 'data.attributes.icon' => 'Missing `data.attributes.icon`',
+ ];
+
+ foreach ($required_keys as $key => $error_message) {
+ if (!self::arrayHas($json, $key)) {
+ return $error_message;
+ }
+ }
+
+ return null;
+ }
+}
diff --git a/lib/classes/JsonApi/Schemas/Forum/DiscussionType.php b/lib/classes/JsonApi/Schemas/Forum/DiscussionType.php
index 07ea34d..bac3686 100644
--- a/lib/classes/JsonApi/Schemas/Forum/DiscussionType.php
+++ b/lib/classes/JsonApi/Schemas/Forum/DiscussionType.php
@@ -11,34 +11,40 @@ class DiscussionType extends SchemaProvider
const REL_DISCUSSIONS = 'discussions';
- public function getId($discussionType): ?string
+ /**
+ * @inheritDoc
+ * @param \Forum\DiscussionType $resource
+ */
+ public function getId($resource): ?string
{
- return $discussionType->type_id;
+ return $resource->type_id;
}
- public function getAttributes($discussionType, ContextInterface $context): iterable
+ /**
+ * @inheritDoc
+ * @param \Forum\DiscussionType $resource
+ */
+ public function getAttributes($resource, ContextInterface $context): iterable
{
- return [
- 'name' => $discussionType->name,
- 'icon' => $discussionType->icon,
- 'mkdate' => date('c', $discussionType->mkdate),
- 'chdate' => date('c', $discussionType->chdate),
- ];
+ $attributes = $resource->transformData();
+ unset($attributes['id']);
+ return $attributes;
}
/**
- * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+ * @inheritDoc
+ * @param \Forum\DiscussionType $resource
*/
- public function getRelationships($discussionType, ContextInterface $context): iterable
+ public function getRelationships($resource, ContextInterface $context): iterable
{
$relationships = [];
- $relationships = $this->addDiscussionsRelationship($relationships, $discussionType, $this->shouldInclude($context, self::REL_DISCUSSIONS));
+ $relationships = $this->addDiscussionsRelationship($relationships, $resource, $this->shouldInclude($context, self::REL_DISCUSSIONS));
return $relationships;
}
- private function addDiscussionsRelationship($relationships, $discussionType, $withDiscussions = false)
+ private function addDiscussionsRelationship(array $relationships, \Forum\DiscussionType $discussionType, $withDiscussions = false): array
{
if ($withDiscussions) {
$relationships[self::REL_DISCUSSIONS] = [
diff --git a/lib/models/Forum/DiscussionType.php b/lib/models/Forum/DiscussionType.php
index 0462388..127abd3 100644
--- a/lib/models/Forum/DiscussionType.php
+++ b/lib/models/Forum/DiscussionType.php
@@ -30,11 +30,25 @@ class DiscussionType extends SimpleORMap
parent::configure($config);
}
- public static function getForumDiscussionType(): array
+ /**
+ * @return self[]
+ */
+ public static function getAll(): array
{
return self::findBySQL("TRUE ORDER BY `mkdate` DESC");
}
+ public function transformData(): array
+ {
+ return [
+ 'id' => $this->type_id,
+ 'icon' => $this->icon,
+ 'name' => $this->name,
+ 'chdate' => date('c', $this->chdate),
+ 'mkdate' => date('c', $this->mkdate)
+ ];
+ }
+
/**
* @return Discussion[]
*/