From 1ae54ec72636b17a38e5d00bd0da89fa9ea651fb Mon Sep 17 00:00:00 2001 From: Remon Pel Date: Mon, 1 Dec 2025 11:40:00 +0100 Subject: [PATCH 1/5] Allow sorting parameters, mainly to get PDC items sorted by name, but universally implemented --- .../RestAPI/Controllers/BaseController.php | 28 ++ .../RestAPI/Controllers/ItemController.php | 356 +++++++++--------- .../Controllers/SubthemaController.php | 186 ++++----- .../RestAPI/Controllers/ThemaController.php | 5 +- 4 files changed, 302 insertions(+), 273 deletions(-) diff --git a/src/Base/RestAPI/Controllers/BaseController.php b/src/Base/RestAPI/Controllers/BaseController.php index f887ac8..b0adc70 100644 --- a/src/Base/RestAPI/Controllers/BaseController.php +++ b/src/Base/RestAPI/Controllers/BaseController.php @@ -118,4 +118,32 @@ protected function defaultTaxonomyParamIsValid(WP_REST_Request $request, string return true; } + + protected function getOrderClause(mixed $orderBy, mixed $order) + { + $orderArray = []; + $orderByParts = explode(',', $orderBy); + $orderParts = explode(',', $order); + + // Empty string results in array with one empty value, we ignore that. + if (!array_filter($orderByParts)) { + return []; + } + + // Single orderby value, return simple array. + if (count($orderByParts) === 1) { + return [ + 'orderby' => trim($orderByParts[0]), + 'order' => strtoupper(trim($orderParts[0] ?? 'ASC')), + ]; + } + + // Multiple orderby values, return associative array. + foreach ($orderByParts as $index => $orderByPart) { + $orderValue = $orderParts[$index] ?? $orderParts[0] ?? 'ASC'; + $orderArray[trim($orderByPart)] = strtoupper(trim($orderValue)); + } + + return ['orderby' => $orderArray]; + } } diff --git a/src/Base/RestAPI/Controllers/ItemController.php b/src/Base/RestAPI/Controllers/ItemController.php index a606b5d..0f4b4a3 100644 --- a/src/Base/RestAPI/Controllers/ItemController.php +++ b/src/Base/RestAPI/Controllers/ItemController.php @@ -17,182 +17,182 @@ */ class ItemController extends BaseController { - use CheckPluginActive; - use QueryHelpers; - - /** - * Get a list of all items. - */ - public function getItems(WP_REST_Request $request): array - { - $parameters = $this->convertParameters($request->get_params()); - $items = (new Item()) - ->query(apply_filters('owc/pdc/rest-api/items/query', $this->getPaginatorParams($request))) - ->query($parameters) - ->query($this->excludeInactiveItemsQuery()) - ->query(['orderby' => [ - 'post_date' => 'DESC', - 'ID' => 'DESC', - ]]); - - if ($this->plugin->settings->useShowOn() && $this->showOnParamIsValid($request)) { - $items->filterSource($request->get_param('source')); - }; - - if ($this->targetAudienceParamIsValid($request)) { - $items->filterTargetAudience($request->get_param('pdc-doelgroep')); - } - - if ($this->aspectParamIsValid($request)) { - $items->filterAspect($request->get_param('pdc-aspect')); - } - - if ($this->usageParamIsValid($request)) { - $items->filterUsage($request->get_param('pdc-usage')); - } - - if (false === $parameters['include-connected']) { - $items->hide(['connected']); - } - - $data = $items->all(); - $query = $items->getQuery(); - - return $this->addPaginator($data, $query); - } - - /** - * Convert the parameters to the allowed ones. - */ - protected function convertParameters(array $parametersFromRequest): array - { - $parameters = []; - - if (isset($parametersFromRequest['name'])) { - $parameters['name'] = esc_attr($parametersFromRequest['name']); - } - - $parameters['include-connected'] = (isset($parametersFromRequest['include-connected'])) ? true : false; - - if (isset($parametersFromRequest['slug'])) { - $parameters['name'] = esc_attr($parametersFromRequest['slug']); - unset($parametersFromRequest['slug']); - } - - if (isset($parametersFromRequest['id'])) { - $parameters['p'] = absint($parametersFromRequest['id']); - unset($parametersFromRequest['slug']); - } - - return $parameters; - } - - /** - * Get an individual post item. - * - * @return array|WP_Error - */ - public function getItem(WP_REST_Request $request) - { - $id = (int) $request->get_param('id'); - $item = $this->buildQueryFromRequest($request); - - $item = $item->find($id); - - if (! $item) { - return new WP_Error('no_item_found', sprintf('Item with ID [%d] not found', $id), [ - 'status' => 404, - ]); - } - - if ($this->needsAuthorization($item)) { - return new WP_Error( - 'unauthorized_request', - sprintf('Unauthorized request for item with ID [%d]', $id), - ['status' => 401] - ); - } - - return $item; - } - - /** - * Get an individual post item by slug. - * - * @return array|WP_Error - */ - public function getItemBySlug(WP_REST_Request $request) - { - $slug = $request->get_param('slug'); - $item = $this->buildQueryFromRequest($request); - - $item = $item->findBySlug($slug); - - if (! $item) { - return new WP_Error( - 'no_item_found', - sprintf('Item with slug [%s] not found', $slug), - ['status' => 404] - ); - } - - if ($this->needsAuthorization($item)) { - return new WP_Error( - 'unauthorized_request', - sprintf('Unauthorized request for item with slug [%s]', $slug), - ['status' => 401] - ); - } - - return $item; - } - - public function buildQueryFromRequest(WP_REST_Request $request): Item - { - $item = (new Item()) - ->query(apply_filters('owc/pdc/rest-api/items/query/single', [])) - ->query(['post_status' => $this->getPostStatus($request)]) - ->query($this->excludeInactiveItemsQuery()); - - $password = esc_attr($request->get_param('password')); - if (! empty($password)) { - $item->setPassword($password); - } - - if ($this->plugin->settings->useShowOn() && $this->showOnParamIsValid($request)) { - $item->filterSource($request->get_param('source')); - }; - - $connectedField = $item->getGlobalField('connected'); - if ($request->get_param('connected_sort') && ! empty($connectedField)) { - $connectedField['creator']->setSorting( - $request->get_param('connected_sort'), - strtoupper($request->get_param('connected_sort_direction')) ?: 'ASC', - $request->get_param('connected_sort_type') ?: 'string' - ); - } - - return $item; - } - - private function needsAuthorization(array $item): bool - { - if (! $this->isPluginPDCInternalProductsActive()) { - return false; - } - - $types = $item['taxonomies']['pdc-type'] ?? []; - - if (empty($types)) { - return false; - } - - foreach ($types as $type) { - if ('external' === $type['slug']) { - return false; - } - } - - return true; - } + use CheckPluginActive; + use QueryHelpers; + + /** + * Get a list of all items. + */ + public function getItems(WP_REST_Request $request): array + { + $orderBy = $request->get_param('orderby') ?? 'post_date,ID'; + $order = $request->get_param('order') ?? 'DESC,DESC'; + + $parameters = $this->convertParameters($request->get_params()); + $items = (new Item()) + ->query(apply_filters('owc/pdc/rest-api/items/query', $this->getPaginatorParams($request))) + ->query($parameters) + ->query($this->excludeInactiveItemsQuery()) + ->query($this->getOrderClause($orderBy, $order)); + + if ($this->plugin->settings->useShowOn() && $this->showOnParamIsValid($request)) { + $items->filterSource($request->get_param('source')); + }; + + if ($this->targetAudienceParamIsValid($request)) { + $items->filterTargetAudience($request->get_param('pdc-doelgroep')); + } + + if ($this->aspectParamIsValid($request)) { + $items->filterAspect($request->get_param('pdc-aspect')); + } + + if ($this->usageParamIsValid($request)) { + $items->filterUsage($request->get_param('pdc-usage')); + } + + if (false === $parameters['include-connected']) { + $items->hide(['connected']); + } + + $data = $items->all(); + $query = $items->getQuery(); + + return $this->addPaginator($data, $query); + } + + /** + * Convert the parameters to the allowed ones. + */ + protected function convertParameters(array $parametersFromRequest): array + { + $parameters = []; + + if (isset($parametersFromRequest['name'])) { + $parameters['name'] = esc_attr($parametersFromRequest['name']); + } + + $parameters['include-connected'] = (isset($parametersFromRequest['include-connected'])) ? true : false; + + if (isset($parametersFromRequest['slug'])) { + $parameters['name'] = esc_attr($parametersFromRequest['slug']); + unset($parametersFromRequest['slug']); + } + + if (isset($parametersFromRequest['id'])) { + $parameters['p'] = absint($parametersFromRequest['id']); + unset($parametersFromRequest['slug']); + } + + return $parameters; + } + + /** + * Get an individual post item. + * + * @return array|WP_Error + */ + public function getItem(WP_REST_Request $request) + { + $id = (int)$request->get_param('id'); + $item = $this->buildQueryFromRequest($request); + + $item = $item->find($id); + + if (!$item) { + return new WP_Error('no_item_found', sprintf('Item with ID [%d] not found', $id), [ + 'status' => 404, + ]); + } + + if ($this->needsAuthorization($item)) { + return new WP_Error( + 'unauthorized_request', + sprintf('Unauthorized request for item with ID [%d]', $id), + ['status' => 401] + ); + } + + return $item; + } + + /** + * Get an individual post item by slug. + * + * @return array|WP_Error + */ + public function getItemBySlug(WP_REST_Request $request) + { + $slug = $request->get_param('slug'); + $item = $this->buildQueryFromRequest($request); + + $item = $item->findBySlug($slug); + + if (!$item) { + return new WP_Error( + 'no_item_found', + sprintf('Item with slug [%s] not found', $slug), + ['status' => 404] + ); + } + + if ($this->needsAuthorization($item)) { + return new WP_Error( + 'unauthorized_request', + sprintf('Unauthorized request for item with slug [%s]', $slug), + ['status' => 401] + ); + } + + return $item; + } + + public function buildQueryFromRequest(WP_REST_Request $request): Item + { + $item = (new Item()) + ->query(apply_filters('owc/pdc/rest-api/items/query/single', [])) + ->query(['post_status' => $this->getPostStatus($request)]) + ->query($this->excludeInactiveItemsQuery()); + + $password = esc_attr($request->get_param('password')); + if (!empty($password)) { + $item->setPassword($password); + } + + if ($this->plugin->settings->useShowOn() && $this->showOnParamIsValid($request)) { + $item->filterSource($request->get_param('source')); + }; + + $connectedField = $item->getGlobalField('connected'); + if ($request->get_param('connected_sort') && !empty($connectedField)) { + $connectedField['creator']->setSorting( + $request->get_param('connected_sort'), + strtoupper($request->get_param('connected_sort_direction')) ?: 'ASC', + $request->get_param('connected_sort_type') ?: 'string' + ); + } + + return $item; + } + + private function needsAuthorization(array $item): bool + { + if (!$this->isPluginPDCInternalProductsActive()) { + return false; + } + + $types = $item['taxonomies']['pdc-type'] ?? []; + + if (empty($types)) { + return false; + } + + foreach ($types as $type) { + if ('external' === $type['slug']) { + return false; + } + } + + return true; + } } diff --git a/src/Base/RestAPI/Controllers/SubthemaController.php b/src/Base/RestAPI/Controllers/SubthemaController.php index cb0cb4c..a1adfa1 100644 --- a/src/Base/RestAPI/Controllers/SubthemaController.php +++ b/src/Base/RestAPI/Controllers/SubthemaController.php @@ -15,96 +15,98 @@ */ class SubthemaController extends BaseController { - /** - * Get a list of all subthemas. - */ - public function getSubthemas(WP_REST_Request $request): array - { - $items = (new Subthema()) - ->query(apply_filters('owc/pdc/rest-api/subthemas/query', $this->getPaginatorParams($request))) - ->query([ - 'order' => 'ASC', - 'orderby' => 'name', - 'post_status' => $this->getPostStatus($request) - ]); - - if ($this->plugin->settings->useShowOn() && $this->showOnParamIsValid($request)) { - $items->filterSource($request->get_param('source')); - } - - if ($language = $request->get_param('language')) { - $items->filterLanguage((string) $language); - } - - $data = $items->all(); - $query = $items->getQuery(); - - return $this->addPaginator($data, $query); - } - - /** - * Get an individual subthema. - * - * @return array|WP_Error - */ - public function getSubthema(WP_REST_Request $request) - { - $id = (int) $request->get_param('id'); - - $thema = (new Subthema()) - ->query(apply_filters('owc/pdc/rest-api/subthemas/query/single', [])) - ->query(['post_status' => $this->getPostStatus($request)]); - - if ($this->plugin->settings->useShowOn() && $this->showOnParamIsValid($request)) { - $thema->filterSource($request->get_param('source')); - } - - if ($language = $request->get_param('language')) { - $thema->filterLanguage((string) $language); - } - - $thema = $thema->find($id); - - if (! $thema) { - return new WP_Error('no_item_found', sprintf('Subthema with ID [%d] not found', $id), [ - 'status' => 404, - ]); - } - - return $thema; - } - - /** - * Get an individual subtheme by slug. - * - * @return array|WP_Error - */ - public function getSubthemeBySlug(WP_REST_Request $request) - { - $slug = $request->get_param('slug'); - - $subtheme = (new Subthema()) - ->query(apply_filters('owc/pdc/rest-api/subthemas/query/single', [])) - ->query(['post_status' => $this->getPostStatus($request)]); - - if ($this->plugin->settings->useShowOn() && $this->showOnParamIsValid($request)) { - $subtheme->filterSource($request->get_param('source')); - } - - if ($language = $request->get_param('language')) { - $subtheme->filterLanguage((string) $language); - } - - $subtheme = $subtheme->findBySlug($slug); - - if (! $subtheme) { - return new WP_Error( - 'no_subtheme_found', - sprintf('Subheme with slug [%s] not found', $slug), - ['status' => 404] - ); - } - - return $subtheme; - } + /** + * Get a list of all subthemas. + */ + public function getSubthemas(WP_REST_Request $request): array + { + $orderBy = $request->get_param('orderby') ?? 'name'; + $order = $request->get_param('order') ?? 'ASC'; + + $items = (new Subthema()) + ->query(apply_filters('owc/pdc/rest-api/subthemas/query', $this->getPaginatorParams($request))) + ->query($this->getOrderClause($orderBy, $order)) + ->query([ + 'post_status' => $this->getPostStatus($request) + ]); + + if ($this->plugin->settings->useShowOn() && $this->showOnParamIsValid($request)) { + $items->filterSource($request->get_param('source')); + } + + if ($language = $request->get_param('language')) { + $items->filterLanguage((string)$language); + } + + $data = $items->all(); + $query = $items->getQuery(); + + return $this->addPaginator($data, $query); + } + + /** + * Get an individual subthema. + * + * @return array|WP_Error + */ + public function getSubthema(WP_REST_Request $request) + { + $id = (int)$request->get_param('id'); + + $thema = (new Subthema()) + ->query(apply_filters('owc/pdc/rest-api/subthemas/query/single', [])) + ->query(['post_status' => $this->getPostStatus($request)]); + + if ($this->plugin->settings->useShowOn() && $this->showOnParamIsValid($request)) { + $thema->filterSource($request->get_param('source')); + } + + if ($language = $request->get_param('language')) { + $thema->filterLanguage((string)$language); + } + + $thema = $thema->find($id); + + if (!$thema) { + return new WP_Error('no_item_found', sprintf('Subthema with ID [%d] not found', $id), [ + 'status' => 404, + ]); + } + + return $thema; + } + + /** + * Get an individual subtheme by slug. + * + * @return array|WP_Error + */ + public function getSubthemeBySlug(WP_REST_Request $request) + { + $slug = $request->get_param('slug'); + + $subtheme = (new Subthema()) + ->query(apply_filters('owc/pdc/rest-api/subthemas/query/single', [])) + ->query(['post_status' => $this->getPostStatus($request)]); + + if ($this->plugin->settings->useShowOn() && $this->showOnParamIsValid($request)) { + $subtheme->filterSource($request->get_param('source')); + } + + if ($language = $request->get_param('language')) { + $subtheme->filterLanguage((string)$language); + } + + $subtheme = $subtheme->findBySlug($slug); + + if (!$subtheme) { + return new WP_Error( + 'no_subtheme_found', + sprintf('Subheme with slug [%s] not found', $slug), + ['status' => 404] + ); + } + + return $subtheme; + } } diff --git a/src/Base/RestAPI/Controllers/ThemaController.php b/src/Base/RestAPI/Controllers/ThemaController.php index ef20ef5..daf4435 100644 --- a/src/Base/RestAPI/Controllers/ThemaController.php +++ b/src/Base/RestAPI/Controllers/ThemaController.php @@ -25,9 +25,8 @@ public function getThemas(WP_REST_Request $request): array $items = (new Thema()) ->query(apply_filters('owc/pdc/rest-api/themas/query', $this->getPaginatorParams($request))) - ->query([ - 'order' => $order, - 'orderby' => $orderBy, + ->query($this->getOrderClause($orderBy, $order)) + ->query([ 'post_status' => $this->getPostStatus($request) ]) ->hide(['items']); From 79c06d632631392862c8e3d0bc8f690bd9cf6703 Mon Sep 17 00:00:00 2001 From: Remon Pel Date: Mon, 1 Dec 2025 11:47:11 +0100 Subject: [PATCH 2/5] rebalance code with updated .editorconfig --- .editorconfig | 3 + .../RestAPI/Controllers/BaseController.php | 62 +++--- .../RestAPI/Controllers/ItemController.php | 2 +- .../Controllers/SubthemaController.php | 188 +++++++++--------- .../RestAPI/Controllers/ThemaController.php | 16 +- 5 files changed, 137 insertions(+), 134 deletions(-) diff --git a/.editorconfig b/.editorconfig index 76ff616..35ba4d8 100644 --- a/.editorconfig +++ b/.editorconfig @@ -15,6 +15,9 @@ indent_style = tab space_around_brackets = true indent_size = 4 +[*.php] +indent_style = space + [{.jshintrc,*.json,*.yml}] indent_style = space indent_size = 2 diff --git a/src/Base/RestAPI/Controllers/BaseController.php b/src/Base/RestAPI/Controllers/BaseController.php index b0adc70..d504aa3 100644 --- a/src/Base/RestAPI/Controllers/BaseController.php +++ b/src/Base/RestAPI/Controllers/BaseController.php @@ -42,7 +42,7 @@ protected function addPaginator(array $data, WP_Query $query): array 'data' => $data, ], [ 'pagination' => [ - 'total_count' => (int) $query->found_posts, + 'total_count' => (int)$query->found_posts, 'total_pages' => $query->max_num_pages, 'current_page' => $page, 'limit' => $query->get('posts_per_page'), @@ -68,7 +68,7 @@ protected function getPostStatus(WP_REST_Request $request): array { $preview = filter_var($request->get_param('draft-preview'), FILTER_VALIDATE_BOOLEAN); - if (! \is_user_logged_in()) { + if (!\is_user_logged_in()) { $preview = false; } @@ -84,7 +84,7 @@ protected function showOnParamIsValid(WP_REST_Request $request): bool return false; } - if (! is_numeric($request->get_param('source'))) { + if (!is_numeric($request->get_param('source'))) { return false; } @@ -112,38 +112,38 @@ protected function defaultTaxonomyParamIsValid(WP_REST_Request $request, string return false; } - if (! is_array($request->get_param($param)) && ! is_string($request->get_param($param))) { + if (!is_array($request->get_param($param)) && !is_string($request->get_param($param))) { return false; } return true; } - protected function getOrderClause(mixed $orderBy, mixed $order) - { - $orderArray = []; - $orderByParts = explode(',', $orderBy); - $orderParts = explode(',', $order); - - // Empty string results in array with one empty value, we ignore that. - if (!array_filter($orderByParts)) { - return []; - } - - // Single orderby value, return simple array. - if (count($orderByParts) === 1) { - return [ - 'orderby' => trim($orderByParts[0]), - 'order' => strtoupper(trim($orderParts[0] ?? 'ASC')), - ]; - } - - // Multiple orderby values, return associative array. - foreach ($orderByParts as $index => $orderByPart) { - $orderValue = $orderParts[$index] ?? $orderParts[0] ?? 'ASC'; - $orderArray[trim($orderByPart)] = strtoupper(trim($orderValue)); - } - - return ['orderby' => $orderArray]; - } + protected function getOrderClause(mixed $orderBy, mixed $order) + { + $orderArray = []; + $orderByParts = explode(',', $orderBy); + $orderParts = explode(',', $order); + + // Empty string results in array with one empty value, we ignore that. + if (!array_filter($orderByParts)) { + return []; + } + + // Single orderby value, return simple array. + if (count($orderByParts) === 1) { + return [ + 'orderby' => trim($orderByParts[0]), + 'order' => strtoupper(trim($orderParts[0] ?? 'ASC')), + ]; + } + + // Multiple orderby values, return associative array. + foreach ($orderByParts as $index => $orderByPart) { + $orderValue = $orderParts[$index] ?? $orderParts[0] ?? 'ASC'; + $orderArray[trim($orderByPart)] = strtoupper(trim($orderValue)); + } + + return ['orderby' => $orderArray]; + } } diff --git a/src/Base/RestAPI/Controllers/ItemController.php b/src/Base/RestAPI/Controllers/ItemController.php index 0f4b4a3..8f42817 100644 --- a/src/Base/RestAPI/Controllers/ItemController.php +++ b/src/Base/RestAPI/Controllers/ItemController.php @@ -17,7 +17,7 @@ */ class ItemController extends BaseController { - use CheckPluginActive; + use CheckPluginActive; use QueryHelpers; /** diff --git a/src/Base/RestAPI/Controllers/SubthemaController.php b/src/Base/RestAPI/Controllers/SubthemaController.php index a1adfa1..4c264fc 100644 --- a/src/Base/RestAPI/Controllers/SubthemaController.php +++ b/src/Base/RestAPI/Controllers/SubthemaController.php @@ -15,98 +15,98 @@ */ class SubthemaController extends BaseController { - /** - * Get a list of all subthemas. - */ - public function getSubthemas(WP_REST_Request $request): array - { - $orderBy = $request->get_param('orderby') ?? 'name'; - $order = $request->get_param('order') ?? 'ASC'; - - $items = (new Subthema()) - ->query(apply_filters('owc/pdc/rest-api/subthemas/query', $this->getPaginatorParams($request))) - ->query($this->getOrderClause($orderBy, $order)) - ->query([ - 'post_status' => $this->getPostStatus($request) - ]); - - if ($this->plugin->settings->useShowOn() && $this->showOnParamIsValid($request)) { - $items->filterSource($request->get_param('source')); - } - - if ($language = $request->get_param('language')) { - $items->filterLanguage((string)$language); - } - - $data = $items->all(); - $query = $items->getQuery(); - - return $this->addPaginator($data, $query); - } - - /** - * Get an individual subthema. - * - * @return array|WP_Error - */ - public function getSubthema(WP_REST_Request $request) - { - $id = (int)$request->get_param('id'); - - $thema = (new Subthema()) - ->query(apply_filters('owc/pdc/rest-api/subthemas/query/single', [])) - ->query(['post_status' => $this->getPostStatus($request)]); - - if ($this->plugin->settings->useShowOn() && $this->showOnParamIsValid($request)) { - $thema->filterSource($request->get_param('source')); - } - - if ($language = $request->get_param('language')) { - $thema->filterLanguage((string)$language); - } - - $thema = $thema->find($id); - - if (!$thema) { - return new WP_Error('no_item_found', sprintf('Subthema with ID [%d] not found', $id), [ - 'status' => 404, - ]); - } - - return $thema; - } - - /** - * Get an individual subtheme by slug. - * - * @return array|WP_Error - */ - public function getSubthemeBySlug(WP_REST_Request $request) - { - $slug = $request->get_param('slug'); - - $subtheme = (new Subthema()) - ->query(apply_filters('owc/pdc/rest-api/subthemas/query/single', [])) - ->query(['post_status' => $this->getPostStatus($request)]); - - if ($this->plugin->settings->useShowOn() && $this->showOnParamIsValid($request)) { - $subtheme->filterSource($request->get_param('source')); - } - - if ($language = $request->get_param('language')) { - $subtheme->filterLanguage((string)$language); - } - - $subtheme = $subtheme->findBySlug($slug); - - if (!$subtheme) { - return new WP_Error( - 'no_subtheme_found', - sprintf('Subheme with slug [%s] not found', $slug), - ['status' => 404] - ); - } - - return $subtheme; - } + /** + * Get a list of all subthemas. + */ + public function getSubthemas(WP_REST_Request $request): array + { + $orderBy = $request->get_param('orderby') ?? 'name'; + $order = $request->get_param('order') ?? 'ASC'; + + $items = (new Subthema()) + ->query(apply_filters('owc/pdc/rest-api/subthemas/query', $this->getPaginatorParams($request))) + ->query($this->getOrderClause($orderBy, $order)) + ->query([ + 'post_status' => $this->getPostStatus($request) + ]); + + if ($this->plugin->settings->useShowOn() && $this->showOnParamIsValid($request)) { + $items->filterSource($request->get_param('source')); + } + + if ($language = $request->get_param('language')) { + $items->filterLanguage((string)$language); + } + + $data = $items->all(); + $query = $items->getQuery(); + + return $this->addPaginator($data, $query); + } + + /** + * Get an individual subthema. + * + * @return array|WP_Error + */ + public function getSubthema(WP_REST_Request $request) + { + $id = (int)$request->get_param('id'); + + $thema = (new Subthema()) + ->query(apply_filters('owc/pdc/rest-api/subthemas/query/single', [])) + ->query(['post_status' => $this->getPostStatus($request)]); + + if ($this->plugin->settings->useShowOn() && $this->showOnParamIsValid($request)) { + $thema->filterSource($request->get_param('source')); + } + + if ($language = $request->get_param('language')) { + $thema->filterLanguage((string)$language); + } + + $thema = $thema->find($id); + + if (!$thema) { + return new WP_Error('no_item_found', sprintf('Subthema with ID [%d] not found', $id), [ + 'status' => 404, + ]); + } + + return $thema; + } + + /** + * Get an individual subtheme by slug. + * + * @return array|WP_Error + */ + public function getSubthemeBySlug(WP_REST_Request $request) + { + $slug = $request->get_param('slug'); + + $subtheme = (new Subthema()) + ->query(apply_filters('owc/pdc/rest-api/subthemas/query/single', [])) + ->query(['post_status' => $this->getPostStatus($request)]); + + if ($this->plugin->settings->useShowOn() && $this->showOnParamIsValid($request)) { + $subtheme->filterSource($request->get_param('source')); + } + + if ($language = $request->get_param('language')) { + $subtheme->filterLanguage((string)$language); + } + + $subtheme = $subtheme->findBySlug($slug); + + if (!$subtheme) { + return new WP_Error( + 'no_subtheme_found', + sprintf('Subheme with slug [%s] not found', $slug), + ['status' => 404] + ); + } + + return $subtheme; + } } diff --git a/src/Base/RestAPI/Controllers/ThemaController.php b/src/Base/RestAPI/Controllers/ThemaController.php index daf4435..2949a82 100644 --- a/src/Base/RestAPI/Controllers/ThemaController.php +++ b/src/Base/RestAPI/Controllers/ThemaController.php @@ -25,8 +25,8 @@ public function getThemas(WP_REST_Request $request): array $items = (new Thema()) ->query(apply_filters('owc/pdc/rest-api/themas/query', $this->getPaginatorParams($request))) - ->query($this->getOrderClause($orderBy, $order)) - ->query([ + ->query($this->getOrderClause($orderBy, $order)) + ->query([ 'post_status' => $this->getPostStatus($request) ]) ->hide(['items']); @@ -36,7 +36,7 @@ public function getThemas(WP_REST_Request $request): array } if ($language = $request->get_param('language')) { - $items->filterLanguage((string) $language); + $items->filterLanguage((string)$language); } $data = $items->all(); @@ -52,7 +52,7 @@ public function getThemas(WP_REST_Request $request): array */ public function getThema(WP_REST_Request $request) { - $id = (int) $request->get_param('id'); + $id = (int)$request->get_param('id'); $thema = (new Thema()) ->query(apply_filters('owc/pdc/rest-api/themas/query/single', [])) @@ -63,12 +63,12 @@ public function getThema(WP_REST_Request $request) } if ($language = $request->get_param('language')) { - $thema->filterLanguage((string) $language); + $thema->filterLanguage((string)$language); } $thema = $thema->find($id); - if (! $thema) { + if (!$thema) { return new WP_Error('no_item_found', sprintf('Thema with ID [%d] not found', $id), [ 'status' => 404, ]); @@ -95,12 +95,12 @@ public function getThemeBySlug(WP_REST_Request $request) } if ($language = $request->get_param('language')) { - $theme->filterLanguage((string) $language); + $theme->filterLanguage((string)$language); } $theme = $theme->findBySlug($slug); - if (! $theme) { + if (!$theme) { return new WP_Error( 'no_theme_found', sprintf('Theme with slug [%s] not found', $slug), From 593602730e807250b6022631896320e43d4c3d0a Mon Sep 17 00:00:00 2001 From: Remon Pel Date: Mon, 1 Dec 2025 11:49:12 +0100 Subject: [PATCH 3/5] Whitespace corrections ... --- .../RestAPI/Controllers/BaseController.php | 8 +- .../RestAPI/Controllers/ItemController.php | 354 +++++++++--------- 2 files changed, 181 insertions(+), 181 deletions(-) diff --git a/src/Base/RestAPI/Controllers/BaseController.php b/src/Base/RestAPI/Controllers/BaseController.php index d504aa3..f332b1d 100644 --- a/src/Base/RestAPI/Controllers/BaseController.php +++ b/src/Base/RestAPI/Controllers/BaseController.php @@ -42,7 +42,7 @@ protected function addPaginator(array $data, WP_Query $query): array 'data' => $data, ], [ 'pagination' => [ - 'total_count' => (int)$query->found_posts, + 'total_count' => (int) $query->found_posts, 'total_pages' => $query->max_num_pages, 'current_page' => $page, 'limit' => $query->get('posts_per_page'), @@ -68,7 +68,7 @@ protected function getPostStatus(WP_REST_Request $request): array { $preview = filter_var($request->get_param('draft-preview'), FILTER_VALIDATE_BOOLEAN); - if (!\is_user_logged_in()) { + if (! \is_user_logged_in()) { $preview = false; } @@ -84,7 +84,7 @@ protected function showOnParamIsValid(WP_REST_Request $request): bool return false; } - if (!is_numeric($request->get_param('source'))) { + if (! is_numeric($request->get_param('source'))) { return false; } @@ -112,7 +112,7 @@ protected function defaultTaxonomyParamIsValid(WP_REST_Request $request, string return false; } - if (!is_array($request->get_param($param)) && !is_string($request->get_param($param))) { + if (! is_array($request->get_param($param)) && ! is_string($request->get_param($param))) { return false; } diff --git a/src/Base/RestAPI/Controllers/ItemController.php b/src/Base/RestAPI/Controllers/ItemController.php index 8f42817..9afc3fe 100644 --- a/src/Base/RestAPI/Controllers/ItemController.php +++ b/src/Base/RestAPI/Controllers/ItemController.php @@ -18,181 +18,181 @@ class ItemController extends BaseController { use CheckPluginActive; - use QueryHelpers; - - /** - * Get a list of all items. - */ - public function getItems(WP_REST_Request $request): array - { - $orderBy = $request->get_param('orderby') ?? 'post_date,ID'; - $order = $request->get_param('order') ?? 'DESC,DESC'; - - $parameters = $this->convertParameters($request->get_params()); - $items = (new Item()) - ->query(apply_filters('owc/pdc/rest-api/items/query', $this->getPaginatorParams($request))) - ->query($parameters) - ->query($this->excludeInactiveItemsQuery()) - ->query($this->getOrderClause($orderBy, $order)); - - if ($this->plugin->settings->useShowOn() && $this->showOnParamIsValid($request)) { - $items->filterSource($request->get_param('source')); - }; - - if ($this->targetAudienceParamIsValid($request)) { - $items->filterTargetAudience($request->get_param('pdc-doelgroep')); - } - - if ($this->aspectParamIsValid($request)) { - $items->filterAspect($request->get_param('pdc-aspect')); - } - - if ($this->usageParamIsValid($request)) { - $items->filterUsage($request->get_param('pdc-usage')); - } - - if (false === $parameters['include-connected']) { - $items->hide(['connected']); - } - - $data = $items->all(); - $query = $items->getQuery(); - - return $this->addPaginator($data, $query); - } - - /** - * Convert the parameters to the allowed ones. - */ - protected function convertParameters(array $parametersFromRequest): array - { - $parameters = []; - - if (isset($parametersFromRequest['name'])) { - $parameters['name'] = esc_attr($parametersFromRequest['name']); - } - - $parameters['include-connected'] = (isset($parametersFromRequest['include-connected'])) ? true : false; - - if (isset($parametersFromRequest['slug'])) { - $parameters['name'] = esc_attr($parametersFromRequest['slug']); - unset($parametersFromRequest['slug']); - } - - if (isset($parametersFromRequest['id'])) { - $parameters['p'] = absint($parametersFromRequest['id']); - unset($parametersFromRequest['slug']); - } - - return $parameters; - } - - /** - * Get an individual post item. - * - * @return array|WP_Error - */ - public function getItem(WP_REST_Request $request) - { - $id = (int)$request->get_param('id'); - $item = $this->buildQueryFromRequest($request); - - $item = $item->find($id); - - if (!$item) { - return new WP_Error('no_item_found', sprintf('Item with ID [%d] not found', $id), [ - 'status' => 404, - ]); - } - - if ($this->needsAuthorization($item)) { - return new WP_Error( - 'unauthorized_request', - sprintf('Unauthorized request for item with ID [%d]', $id), - ['status' => 401] - ); - } - - return $item; - } - - /** - * Get an individual post item by slug. - * - * @return array|WP_Error - */ - public function getItemBySlug(WP_REST_Request $request) - { - $slug = $request->get_param('slug'); - $item = $this->buildQueryFromRequest($request); - - $item = $item->findBySlug($slug); - - if (!$item) { - return new WP_Error( - 'no_item_found', - sprintf('Item with slug [%s] not found', $slug), - ['status' => 404] - ); - } - - if ($this->needsAuthorization($item)) { - return new WP_Error( - 'unauthorized_request', - sprintf('Unauthorized request for item with slug [%s]', $slug), - ['status' => 401] - ); - } - - return $item; - } - - public function buildQueryFromRequest(WP_REST_Request $request): Item - { - $item = (new Item()) - ->query(apply_filters('owc/pdc/rest-api/items/query/single', [])) - ->query(['post_status' => $this->getPostStatus($request)]) - ->query($this->excludeInactiveItemsQuery()); - - $password = esc_attr($request->get_param('password')); - if (!empty($password)) { - $item->setPassword($password); - } - - if ($this->plugin->settings->useShowOn() && $this->showOnParamIsValid($request)) { - $item->filterSource($request->get_param('source')); - }; - - $connectedField = $item->getGlobalField('connected'); - if ($request->get_param('connected_sort') && !empty($connectedField)) { - $connectedField['creator']->setSorting( - $request->get_param('connected_sort'), - strtoupper($request->get_param('connected_sort_direction')) ?: 'ASC', - $request->get_param('connected_sort_type') ?: 'string' - ); - } - - return $item; - } - - private function needsAuthorization(array $item): bool - { - if (!$this->isPluginPDCInternalProductsActive()) { - return false; - } - - $types = $item['taxonomies']['pdc-type'] ?? []; - - if (empty($types)) { - return false; - } - - foreach ($types as $type) { - if ('external' === $type['slug']) { - return false; - } - } - - return true; - } + use QueryHelpers; + + /** + * Get a list of all items. + */ + public function getItems(WP_REST_Request $request): array + { + $orderBy = $request->get_param('orderby') ?? 'post_date,ID'; + $order = $request->get_param('order') ?? 'DESC,DESC'; + + $parameters = $this->convertParameters($request->get_params()); + $items = (new Item()) + ->query(apply_filters('owc/pdc/rest-api/items/query', $this->getPaginatorParams($request))) + ->query($parameters) + ->query($this->excludeInactiveItemsQuery()) + ->query($this->getOrderClause($orderBy, $order)); + + if ($this->plugin->settings->useShowOn() && $this->showOnParamIsValid($request)) { + $items->filterSource($request->get_param('source')); + }; + + if ($this->targetAudienceParamIsValid($request)) { + $items->filterTargetAudience($request->get_param('pdc-doelgroep')); + } + + if ($this->aspectParamIsValid($request)) { + $items->filterAspect($request->get_param('pdc-aspect')); + } + + if ($this->usageParamIsValid($request)) { + $items->filterUsage($request->get_param('pdc-usage')); + } + + if (false === $parameters['include-connected']) { + $items->hide(['connected']); + } + + $data = $items->all(); + $query = $items->getQuery(); + + return $this->addPaginator($data, $query); + } + + /** + * Convert the parameters to the allowed ones. + */ + protected function convertParameters(array $parametersFromRequest): array + { + $parameters = []; + + if (isset($parametersFromRequest['name'])) { + $parameters['name'] = esc_attr($parametersFromRequest['name']); + } + + $parameters['include-connected'] = (isset($parametersFromRequest['include-connected'])) ? true : false; + + if (isset($parametersFromRequest['slug'])) { + $parameters['name'] = esc_attr($parametersFromRequest['slug']); + unset($parametersFromRequest['slug']); + } + + if (isset($parametersFromRequest['id'])) { + $parameters['p'] = absint($parametersFromRequest['id']); + unset($parametersFromRequest['slug']); + } + + return $parameters; + } + + /** + * Get an individual post item. + * + * @return array|WP_Error + */ + public function getItem(WP_REST_Request $request) + { + $id = (int)$request->get_param('id'); + $item = $this->buildQueryFromRequest($request); + + $item = $item->find($id); + + if (!$item) { + return new WP_Error('no_item_found', sprintf('Item with ID [%d] not found', $id), [ + 'status' => 404, + ]); + } + + if ($this->needsAuthorization($item)) { + return new WP_Error( + 'unauthorized_request', + sprintf('Unauthorized request for item with ID [%d]', $id), + ['status' => 401] + ); + } + + return $item; + } + + /** + * Get an individual post item by slug. + * + * @return array|WP_Error + */ + public function getItemBySlug(WP_REST_Request $request) + { + $slug = $request->get_param('slug'); + $item = $this->buildQueryFromRequest($request); + + $item = $item->findBySlug($slug); + + if (!$item) { + return new WP_Error( + 'no_item_found', + sprintf('Item with slug [%s] not found', $slug), + ['status' => 404] + ); + } + + if ($this->needsAuthorization($item)) { + return new WP_Error( + 'unauthorized_request', + sprintf('Unauthorized request for item with slug [%s]', $slug), + ['status' => 401] + ); + } + + return $item; + } + + public function buildQueryFromRequest(WP_REST_Request $request): Item + { + $item = (new Item()) + ->query(apply_filters('owc/pdc/rest-api/items/query/single', [])) + ->query(['post_status' => $this->getPostStatus($request)]) + ->query($this->excludeInactiveItemsQuery()); + + $password = esc_attr($request->get_param('password')); + if (!empty($password)) { + $item->setPassword($password); + } + + if ($this->plugin->settings->useShowOn() && $this->showOnParamIsValid($request)) { + $item->filterSource($request->get_param('source')); + }; + + $connectedField = $item->getGlobalField('connected'); + if ($request->get_param('connected_sort') && !empty($connectedField)) { + $connectedField['creator']->setSorting( + $request->get_param('connected_sort'), + strtoupper($request->get_param('connected_sort_direction')) ?: 'ASC', + $request->get_param('connected_sort_type') ?: 'string' + ); + } + + return $item; + } + + private function needsAuthorization(array $item): bool + { + if (!$this->isPluginPDCInternalProductsActive()) { + return false; + } + + $types = $item['taxonomies']['pdc-type'] ?? []; + + if (empty($types)) { + return false; + } + + foreach ($types as $type) { + if ('external' === $type['slug']) { + return false; + } + } + + return true; + } } From c8642ba997a02809bf432d7d9eda5796d06ef191 Mon Sep 17 00:00:00 2001 From: Remon Pel Date: Mon, 1 Dec 2025 11:52:03 +0100 Subject: [PATCH 4/5] Whitespace corrections ... --- src/Base/RestAPI/Controllers/ItemController.php | 12 ++++++------ src/Base/RestAPI/Controllers/SubthemaController.php | 12 ++++++------ src/Base/RestAPI/Controllers/ThemaController.php | 12 ++++++------ 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/Base/RestAPI/Controllers/ItemController.php b/src/Base/RestAPI/Controllers/ItemController.php index 9afc3fe..afe3ec0 100644 --- a/src/Base/RestAPI/Controllers/ItemController.php +++ b/src/Base/RestAPI/Controllers/ItemController.php @@ -94,12 +94,12 @@ protected function convertParameters(array $parametersFromRequest): array */ public function getItem(WP_REST_Request $request) { - $id = (int)$request->get_param('id'); + $id = (int) $request->get_param('id'); $item = $this->buildQueryFromRequest($request); $item = $item->find($id); - if (!$item) { + if (! $item) { return new WP_Error('no_item_found', sprintf('Item with ID [%d] not found', $id), [ 'status' => 404, ]); @@ -128,7 +128,7 @@ public function getItemBySlug(WP_REST_Request $request) $item = $item->findBySlug($slug); - if (!$item) { + if (! $item) { return new WP_Error( 'no_item_found', sprintf('Item with slug [%s] not found', $slug), @@ -155,7 +155,7 @@ public function buildQueryFromRequest(WP_REST_Request $request): Item ->query($this->excludeInactiveItemsQuery()); $password = esc_attr($request->get_param('password')); - if (!empty($password)) { + if (! empty($password)) { $item->setPassword($password); } @@ -164,7 +164,7 @@ public function buildQueryFromRequest(WP_REST_Request $request): Item }; $connectedField = $item->getGlobalField('connected'); - if ($request->get_param('connected_sort') && !empty($connectedField)) { + if ($request->get_param('connected_sort') && ! empty($connectedField)) { $connectedField['creator']->setSorting( $request->get_param('connected_sort'), strtoupper($request->get_param('connected_sort_direction')) ?: 'ASC', @@ -177,7 +177,7 @@ public function buildQueryFromRequest(WP_REST_Request $request): Item private function needsAuthorization(array $item): bool { - if (!$this->isPluginPDCInternalProductsActive()) { + if (! $this->isPluginPDCInternalProductsActive()) { return false; } diff --git a/src/Base/RestAPI/Controllers/SubthemaController.php b/src/Base/RestAPI/Controllers/SubthemaController.php index 4c264fc..629ff46 100644 --- a/src/Base/RestAPI/Controllers/SubthemaController.php +++ b/src/Base/RestAPI/Controllers/SubthemaController.php @@ -35,7 +35,7 @@ public function getSubthemas(WP_REST_Request $request): array } if ($language = $request->get_param('language')) { - $items->filterLanguage((string)$language); + $items->filterLanguage((string) $language); } $data = $items->all(); @@ -51,7 +51,7 @@ public function getSubthemas(WP_REST_Request $request): array */ public function getSubthema(WP_REST_Request $request) { - $id = (int)$request->get_param('id'); + $id = (int) $request->get_param('id'); $thema = (new Subthema()) ->query(apply_filters('owc/pdc/rest-api/subthemas/query/single', [])) @@ -62,12 +62,12 @@ public function getSubthema(WP_REST_Request $request) } if ($language = $request->get_param('language')) { - $thema->filterLanguage((string)$language); + $thema->filterLanguage((string) $language); } $thema = $thema->find($id); - if (!$thema) { + if (! $thema) { return new WP_Error('no_item_found', sprintf('Subthema with ID [%d] not found', $id), [ 'status' => 404, ]); @@ -94,12 +94,12 @@ public function getSubthemeBySlug(WP_REST_Request $request) } if ($language = $request->get_param('language')) { - $subtheme->filterLanguage((string)$language); + $subtheme->filterLanguage((string) $language); } $subtheme = $subtheme->findBySlug($slug); - if (!$subtheme) { + if (! $subtheme) { return new WP_Error( 'no_subtheme_found', sprintf('Subheme with slug [%s] not found', $slug), diff --git a/src/Base/RestAPI/Controllers/ThemaController.php b/src/Base/RestAPI/Controllers/ThemaController.php index 2949a82..71f924e 100644 --- a/src/Base/RestAPI/Controllers/ThemaController.php +++ b/src/Base/RestAPI/Controllers/ThemaController.php @@ -36,7 +36,7 @@ public function getThemas(WP_REST_Request $request): array } if ($language = $request->get_param('language')) { - $items->filterLanguage((string)$language); + $items->filterLanguage((string) $language); } $data = $items->all(); @@ -52,7 +52,7 @@ public function getThemas(WP_REST_Request $request): array */ public function getThema(WP_REST_Request $request) { - $id = (int)$request->get_param('id'); + $id = (int) $request->get_param('id'); $thema = (new Thema()) ->query(apply_filters('owc/pdc/rest-api/themas/query/single', [])) @@ -63,12 +63,12 @@ public function getThema(WP_REST_Request $request) } if ($language = $request->get_param('language')) { - $thema->filterLanguage((string)$language); + $thema->filterLanguage((string) $language); } $thema = $thema->find($id); - if (!$thema) { + if (! $thema) { return new WP_Error('no_item_found', sprintf('Thema with ID [%d] not found', $id), [ 'status' => 404, ]); @@ -95,12 +95,12 @@ public function getThemeBySlug(WP_REST_Request $request) } if ($language = $request->get_param('language')) { - $theme->filterLanguage((string)$language); + $theme->filterLanguage((string) $language); } $theme = $theme->findBySlug($slug); - if (!$theme) { + if (! $theme) { return new WP_Error( 'no_theme_found', sprintf('Theme with slug [%s] not found', $slug), From be078ab2c63e2dd8a8ba3a2a527244c527edaece Mon Sep 17 00:00:00 2001 From: Remon Pel Date: Wed, 3 Dec 2025 11:02:07 +0100 Subject: [PATCH 5/5] Fix typing --- src/Base/RestAPI/Controllers/BaseController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Base/RestAPI/Controllers/BaseController.php b/src/Base/RestAPI/Controllers/BaseController.php index f332b1d..a199ba1 100644 --- a/src/Base/RestAPI/Controllers/BaseController.php +++ b/src/Base/RestAPI/Controllers/BaseController.php @@ -119,7 +119,7 @@ protected function defaultTaxonomyParamIsValid(WP_REST_Request $request, string return true; } - protected function getOrderClause(mixed $orderBy, mixed $order) + protected function getOrderClause(string $orderBy, string $order): array { $orderArray = []; $orderByParts = explode(',', $orderBy);