namespace, '/analytics/overview', [[ 'methods' => \WP_REST_Server::READABLE, 'callback' => [$this, 'getOverview'], 'permission_callback' => [$this, 'checkPermission'], 'args' => $this->dateRangeArguments(), ]]); register_rest_route($this->namespace, '/analytics/revenue', [[ 'methods' => \WP_REST_Server::READABLE, 'callback' => [$this, 'getRevenueChart'], 'permission_callback' => [$this, 'checkPermission'], 'args' => $this->dateRangeArguments(), ]]); register_rest_route($this->namespace, '/analytics/events', [[ 'methods' => \WP_REST_Server::READABLE, 'callback' => [$this, 'getEvents'], 'permission_callback' => [$this, 'checkPermission'], 'args' => $this->dateRangeArguments(), ]]); } public function getOverview(\WP_REST_Request $request): \WP_REST_Response { $days = max(1, (int) $request->get_param('days')); return $this->success((new AnalyticsQuery())->getOverview($days), 200, [ 'days' => $days, 'currency' => $this->currencyMeta(), ]); } public function getRevenueChart(\WP_REST_Request $request): \WP_REST_Response { $days = max(1, (int) $request->get_param('days')); return $this->success((new AnalyticsQuery())->getRevenueChart($days), 200, [ 'days' => $days, 'currency' => $this->currencyMeta(), ]); } public function getEvents(\WP_REST_Request $request): \WP_REST_Response { $days = max(1, (int) $request->get_param('days')); return $this->success((new AnalyticsQuery())->getEventsLog(50, 0, $days)); } private function dateRangeArguments(): array { return [ 'days' => [ 'default' => 7, 'sanitize_callback' => 'absint', 'validate_callback' => static fn($value): bool => (int) $value >= 1, ], ]; } private function currencyMeta(): array { return [ 'code' => get_woocommerce_currency(), 'symbol' => get_woocommerce_currency_symbol(), 'position' => get_option('woocommerce_currency_pos'), ]; } }