'number', 'distance_in_km' => 'number'] * * @return \Illuminate\Http\JsonResponse */ public function getMetabaseData($questionId, array $parameters = [], array $parameterTypes = []) { $formattedData = []; $metabaseUrl = _env('METABASE_SITE_URL'); $metabaseUsername = _env('METABASE_USERNAME'); $metabasePassword = _env('METABASE_PASSWORD'); try { $client = new Client(); // 1. Authentication $authResponse = $client->post($metabaseUrl . '/api/session', [ 'json' => [ 'username' => $metabaseUsername, 'password' => $metabasePassword, ], ]); $authResponse = json_decode($authResponse->getBody()->getContents(), true); $sessionId = $authResponse['id']; // 2. Prepare Parameters for Metabase API $metabaseParameters = []; foreach ($parameters as $key => $value) { $parameterType = isset($parameterTypes[$key]) ? $parameterTypes[$key] : 'string'; // Default to 'string' $metabaseParameters[] = [ 'type' => $parameterType, 'target' => ['variable', ['template-tag', $key]], 'value' => $value, ]; } // 3. Execute the Question $runQueryResponse = $client->post($metabaseUrl . "/api/card/{$questionId}/query", [ 'headers' => [ 'X-Metabase-Session' => $sessionId, 'Content-Type' => 'application/json', ], 'json' => [ 'parameters' => $metabaseParameters, ], ]); $runQueryResponse = json_decode($runQueryResponse->getBody()->getContents(), true); // 4. Process the Data $dataRows = $runQueryResponse['data']['rows']; $dataColumns = $runQueryResponse['data']['cols']; foreach ($dataRows as $row) { $rowData = []; for ($i = 0; $i < count($dataColumns); $i++) { $columnName = $dataColumns[$i]['name']; $rowData[$columnName] = $row[$i]; } $formattedData[] = $rowData; } return $formattedData; } catch (GuzzleException $e) { (new Slack(new Request(['title'=>'Metabase data extraction error','fields'=>['Question ID'=>$questionId,'error'=>$e->getMessage(),'line'=>$e->getLine(),'trace'=>$e->getTraceAsString()]])))->send(); return $formattedData; } } }