From daa242a4c5f25f47b5f104ba4cbe2eeb2909d6d3 Mon Sep 17 00:00:00 2001 From: Marcus Eibrink-Lunzenauer Date: Wed, 15 Jan 2025 09:18:17 +0000 Subject: Only load a course's blubber threads in a course context. Closes #4546 Merge request studip/studip!3836 --- lib/classes/JsonApi/Routes/Blubber/FilterTrait.php | 2 + .../JsonApi/Routes/Blubber/ThreadsIndex.php | 45 ++++++++++------------ resources/vue/components/blubber/CommunityPage.vue | 8 +++- resources/vue/composables/context.js | 9 +++++ resources/vue/store/blubber.js | 6 ++- 5 files changed, 44 insertions(+), 26 deletions(-) create mode 100644 resources/vue/composables/context.js diff --git a/lib/classes/JsonApi/Routes/Blubber/FilterTrait.php b/lib/classes/JsonApi/Routes/Blubber/FilterTrait.php index 2d74f9c..c336016 100644 --- a/lib/classes/JsonApi/Routes/Blubber/FilterTrait.php +++ b/lib/classes/JsonApi/Routes/Blubber/FilterTrait.php @@ -30,6 +30,8 @@ trait FilterTrait $filters['since'] = isset($filtering['since']) ? self::fromISO8601($filtering['since'])->getTimestamp() : null; $filters['before'] = isset($filtering['before']) ? self::fromISO8601($filtering['before'])->getTimestamp() : null; $filters['search'] = $filtering['search'] ?? null; + $filters['context-type'] = $filtering['context-type'] ?? null; + $filters['context-id'] = $filtering['context-id'] ?? null; return $filters; } diff --git a/lib/classes/JsonApi/Routes/Blubber/ThreadsIndex.php b/lib/classes/JsonApi/Routes/Blubber/ThreadsIndex.php index 91cfa89..5d4cf33 100644 --- a/lib/classes/JsonApi/Routes/Blubber/ThreadsIndex.php +++ b/lib/classes/JsonApi/Routes/Blubber/ThreadsIndex.php @@ -16,7 +16,7 @@ class ThreadsIndex extends JsonApiController { use TimestampTrait, FilterTrait; - protected $allowedFilteringParameters = ['since', 'before', 'search']; + protected $allowedFilteringParameters = ['since', 'before', 'search', 'context-type', 'context-id']; protected $allowedIncludePaths = ['author', 'comments', 'context', 'mentions']; protected $allowedPagingParameters = ['offset', 'limit']; @@ -25,34 +25,31 @@ class ThreadsIndex extends JsonApiController */ public function __invoke(Request $request, Response $response, $args) { + $this->validateFilters(); + $filters = $this->getFilters(); $contextType = $args['type']; + $contextId = isset($args['id']) ? $args['id'] : null; + + if ($contextType === 'all') { + if (isset($filters['context-type'])) { + $contextType = $filters['context-type']; + } + if (isset($filters['context-id'])) { + $contextId = $filters['context-id']; + } + } + if (!in_array($contextType, ['all', 'public', 'private', 'course', 'institute'])) { throw new BadRequestException('Wrong context type.'); } - switch ($contextType) { - case 'all': - $this->validateFilters(); - $filters = $this->getFilters(); - list($threads, $total) = $this->getAllThreads($filters, $this->getUser($request)); - break; - - case 'public': - list($threads, $total) = $this->getPublicThreads($this->getUser($request)); - break; - - case 'private': - list($threads, $total) = $this->getPrivateThreads($this->getUser($request), $args['id']); - break; - - case 'course': - list($threads, $total) = $this->getCourseThreads($this->getUser($request), $args['id']); - break; - - case 'institute': - list($threads, $total) = $this->getInstituteThreads($this->getUser($request), $args['id']); - break; - } + [$threads, $total] = match ($contextType) { + 'all' => $this->getAllThreads($filters, $this->getUser($request)), + 'public' => $this->getPublicThreads($this->getUser($request)), + 'private' => $this->getPrivateThreads($this->getUser($request), $contextId), + 'course' => $this->getCourseThreads($this->getUser($request), $contextId), + 'institute' => $this->getInstituteThreads($this->getUser($request), $contextId), + }; return $this->getPaginatedContentResponse($threads, $total); } diff --git a/resources/vue/components/blubber/CommunityPage.vue b/resources/vue/components/blubber/CommunityPage.vue index bd937e0..4dee22a 100644 --- a/resources/vue/components/blubber/CommunityPage.vue +++ b/resources/vue/components/blubber/CommunityPage.vue @@ -18,11 +18,17 @@