|null */ public function get(WooStore $store, string $path, array $query = []): ?array { return $this->request($store, 'GET', $path, $query); } /** @param array $payload */ public function post(WooStore $store, string $path, array $payload = []): ?array { return $this->request($store, 'POST', $path, $payload); } /** @param array $payload */ public function put(WooStore $store, string $path, array $payload = []): ?array { return $this->request($store, 'PUT', $path, $payload); } public function delete(WooStore $store, string $path): bool { return $this->raw($store, 'DELETE', $path)->successful(); } /** @return array|null */ public function uploadMedia(WooStore $store, UploadedFile $file, string $alt = ''): ?array { $site = rtrim((string) $store->site_url, '/'); $url = $site.'/wp-json/ladill-woo/v1/media'; $response = Http::acceptJson() ->timeout(60) ->withHeaders(['X-Ladill-Store' => $store->public_id]) ->attach( 'file', file_get_contents($file->getRealPath()) ?: '', $file->getClientOriginalName() ?: 'upload.jpg', ) ->post($url, array_filter(['alt' => $alt !== '' ? $alt : null])); if (! $response->successful()) { Log::warning('Woo plugin media upload failed', [ 'store_id' => $store->id, 'status' => $response->status(), ]); return null; } /** @var array|null $json */ $json = $response->json(); return is_array($json) ? $json : null; } /** @return array|null */ private function request(WooStore $store, string $method, string $path, array $data = []): ?array { $response = $this->raw($store, $method, $path, $data); if (! $response->successful()) { Log::warning('Woo plugin API request failed', [ 'store_id' => $store->id, 'method' => $method, 'path' => $path, 'status' => $response->status(), ]); return null; } /** @var array|null $json */ $json = $response->json(); return is_array($json) ? $json : null; } private function raw(WooStore $store, string $method, string $path, array $data = []): Response { $site = rtrim((string) $store->site_url, '/'); $url = $site.'/wp-json/ladill-woo/v1/'.ltrim($path, '/'); $pending = Http::acceptJson() ->timeout(20) ->withHeaders(['X-Ladill-Store' => $store->public_id]); return match (strtoupper($method)) { 'GET' => $pending->get($url, $data), 'POST' => $pending->asJson()->post($url, $data), 'PUT' => $pending->asJson()->put($url, $data), 'DELETE' => $pending->delete($url, $data), default => throw new \InvalidArgumentException("Unsupported method: {$method}"), }; } }