diff options
| author | Murtaza Sultani <sultani@data-quest.de> | 2025-09-05 15:47:50 +0200 |
|---|---|---|
| committer | Murtaza Sultani <sultani@data-quest.de> | 2025-09-05 15:47:50 +0200 |
| commit | 9bb68bf5d075ff0e127b9fe5309889f366ccf127 (patch) | |
| tree | 992cce643bf95fc3e6985920aea86cf54335cbec /lib | |
| parent | 8a6831f7d910f3ff7791d27fdf3988028982caa5 (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.php | 2 | ||||
| -rw-r--r-- | lib/classes/JsonApi/Routes/Forum/DiscussionTypeDelete.php | 29 | ||||
| -rw-r--r-- | lib/classes/JsonApi/Routes/Forum/DiscussionTypeIndex.php | 6 | ||||
| -rw-r--r-- | lib/classes/JsonApi/Routes/Forum/DiscussionTypeShow.php | 4 | ||||
| -rw-r--r-- | lib/classes/JsonApi/Routes/Forum/DiscussionTypeStore.php | 46 | ||||
| -rw-r--r-- | lib/classes/JsonApi/Schemas/Forum/DiscussionType.php | 32 | ||||
| -rw-r--r-- | lib/models/Forum/DiscussionType.php | 16 |
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[] */ |
