client = $client ?? Services::curlrequest([ 'timeout' => 30, 'http_errors' => false, ]); } /** * @param array $formData * * @return array{transport_ok: bool, http_code: int, json: array|null, error: string|null, raw: string} */ public function postMobile(string $method, array $formData = []): array { helper(['url']); return $this->post('api/mobile/' . ltrim($method, '/'), $formData); } /** * @param array $formData * * @return array{transport_ok: bool, http_code: int, json: array|null, error: string|null, raw: string} */ public function postMobileWithToken(string $method, string $token, array $formData = []): array { $formData['token'] = $token; return $this->postMobile($method, $formData); } /** * GET ke `/api/admin/{path}` — token ditambahkan ke query string. * * @param array $query * * @return array{transport_ok: bool, http_code: int, json: array|null, error: string|null, raw: string} */ public function getAdmin(string $path, ?string $token, array $query = []): array { helper(['url']); if ($token !== null && $token !== '') { $query['token'] = $token; } $forward = $this->adminInternalHeaders(); if (($forward['Cookie'] ?? '') !== '' && session_status() === PHP_SESSION_ACTIVE) { session_write_close(); } return $this->get('api/admin/' . ltrim($path, '/'), $query, $forward); } /** * POST form ke `/api/admin/{path}`. * * @param array $formData * * @return array{transport_ok: bool, http_code: int, json: array|null, error: string|null, raw: string} */ public function postAdmin(string $path, ?string $token, array $formData = []): array { helper(['url']); if ($token !== null && $token !== '') { $formData['token'] = $token; } $forward = $this->adminInternalHeaders(); if (($forward['Cookie'] ?? '') !== '' && session_status() === PHP_SESSION_ACTIVE) { session_write_close(); } return $this->post('api/admin/' . ltrim($path, '/'), $formData, $forward); } /** * GET generik (relatif terhadap root site, mis. `api/admin/pegawai`). * * @param array $query * @param array $extraHeaders * * @return array{transport_ok: bool, http_code: int, json: array|null, error: string|null, raw: string} */ public function get(string $path, array $query = [], array $extraHeaders = []): array { helper(['url']); $url = base_url(ltrim($path, '/')); $base = $this->emptyResult(); $headers = array_merge( ['Accept' => 'application/json'], $extraHeaders ); try { $response = $this->client->get($url, [ 'query' => $query, 'headers' => $headers, ]); } catch (Throwable $e) { $base['error'] = $e->getMessage(); return $base; } return $this->fillFromResponse($base, $response->getStatusCode(), $response->getBody()); } /** * POST `application/x-www-form-urlencoded`. * * @param array $formData * @param array $extraHeaders * * @return array{transport_ok: bool, http_code: int, json: array|null, error: string|null, raw: string} */ public function post(string $path, array $formData = [], array $extraHeaders = []): array { helper(['url']); $url = base_url(ltrim($path, '/')); $base = $this->emptyResult(); $headers = array_merge( ['Accept' => 'application/json'], $extraHeaders ); try { $response = $this->client->post($url, [ 'form_params' => $formData, 'headers' => $headers, ]); } catch (Throwable $e) { $base['error'] = $e->getMessage(); return $base; } return $this->fillFromResponse($base, $response->getStatusCode(), $response->getBody()); } /** * Teruskan cookie browser ke hit internal `/api/admin/*` agar sesi panel sama. * * @return array */ private function adminInternalHeaders(): array { $cookie = Services::request()->getHeaderLine('Cookie'); return $cookie !== '' ? ['Cookie' => $cookie] : []; } /** * @param array|null $json */ public static function isSuccess(?array $json): bool { return is_array($json) && (int) ($json['status'] ?? 0) === 1; } /** * @return array{transport_ok: bool, http_code: int, json: array|null, error: string|null, raw: string} */ private function emptyResult(): array { return [ 'transport_ok' => false, 'http_code' => 0, 'json' => null, 'error' => null, 'raw' => '', ]; } /** * @param array{transport_ok: bool, http_code: int, json: array|null, error: string|null, raw: string} $base * * @return array{transport_ok: bool, http_code: int, json: array|null, error: string|null, raw: string} */ private function fillFromResponse(array $base, int $statusCode, string $body): array { $base['http_code'] = $statusCode; $base['raw'] = $body; $base['transport_ok'] = $statusCode === 200; $decoded = json_decode($body, true); if (! is_array($decoded)) { $base['error'] = 'Respons bukan JSON objek'; return $base; } $base['json'] = $decoded; return $base; } }