path) { '/', '/health' => $this->ok($this->healthController->show()), '/tools' => $this->ok($this->tools()), '/api/order-summary' => $this->post($request, fn (): array => $this->statsController->orderSummary($request)), '/api/offline-stats' => $this->post($request, fn (): array => $this->statsController->offlineStats($request)), '/api/merchant-ranking' => $this->post($request, fn (): array => $this->statsController->merchantRanking($request)), default => JsonResponse::send([ 'success' => false, 'error' => [ 'code' => 'not_found', 'message' => 'API route not found.', ], ], 404), }; } catch (\Throwable $exception) { JsonResponse::send([ 'success' => false, 'error' => [ 'code' => 'server_error', 'message' => $exception->getMessage(), ], ], 500); } } /** * @param \Closure(): array $handler */ private function post(HttpRequest $request, \Closure $handler): void { if ($request->method !== 'POST') { JsonResponse::send([ 'success' => false, 'error' => [ 'code' => 'method_not_allowed', 'message' => 'This endpoint only supports POST.', ], ], 405); return; } $this->ok($handler()); } /** * @param array $data */ private function ok(array $data): void { JsonResponse::send([ 'success' => true, 'data' => $data, ]); } /** * @return array */ private function tools(): array { return [ 'tools' => [ [ 'name' => OrderSummaryTool::NAME, 'description' => OrderSummaryTool::DESCRIPTION, 'method' => 'POST', 'path' => '/api/order-summary', 'inputSchema' => OrderSummaryTool::inputSchema(), ], [ 'name' => AnalyzeOfflineOrdersTool::NAME, 'description' => AnalyzeOfflineOrdersTool::DESCRIPTION, 'method' => 'POST', 'path' => '/api/offline-stats', 'inputSchema' => AnalyzeOfflineOrdersTool::inputSchema(), ], [ 'name' => MerchantRankingTool::NAME, 'description' => MerchantRankingTool::DESCRIPTION, 'method' => 'POST', 'path' => '/api/merchant-ranking', 'inputSchema' => MerchantRankingTool::inputSchema(), ], ], ]; } }