ensureCliAccess(); $this->bookImportToken = $_ENV["BOOK_IMPORT_TOKEN"] ?? getenv("BOOK_IMPORT_TOKEN"); } public function handleRequest(): void { $input = json_decode(file_get_contents("php://input"), true); if (!$input) { $this->sendErrorResponse("Invalid or missing JSON body", 400); } $providedToken = $input["token"] ?? null; $isbn = $input["isbn"] ?? null; if ($providedToken !== $this->bookImportToken) { $this->sendErrorResponse("Unauthorized access", 401); } if (!$isbn) { $this->sendErrorResponse("isbn parameter is required", 400); } try { $bookData = $this->fetchBookData($isbn); $this->processBook($bookData); $this->sendResponse(["message" => "Book imported successfully"], 200); } catch (\Exception $e) { $this->sendErrorResponse("Error: " . $e->getMessage(), 500); } } private function fetchBookData(string $isbn): array { $client = new Client(); $response = $client->get("https://openlibrary.org/api/books", [ "query" => [ "bibkeys" => "ISBN:{$isbn}", "format" => "json", "jscmd" => "data", ], "headers" => ["Accept" => "application/json"], ]); $data = json_decode($response->getBody(), true); $bookKey = "ISBN:{$isbn}"; if (empty($data[$bookKey])) { throw new \Exception("Book data not found for ISBN: {$isbn}"); } return $data[$bookKey]; } private function processBook(array $bookData): void { $isbn = $bookData["identifiers"]["isbn_13"][0] ?? ($bookData["identifiers"]["isbn_10"][0] ?? null); $title = $bookData["title"] ?? null; $author = $bookData["authors"][0]["name"] ?? null; $description = $bookData["description"] ?? ($bookData["notes"] ?? ""); if (!$isbn || !$title || !$author) { throw new \Exception("Missing essential book data (title, author, or ISBN)."); } $existingBook = $this->getBookByISBN($isbn); if ($existingBook) { throw new \Exception("Book with ISBN {$isbn} already exists."); } $bookPayload = [ "isbn" => $isbn, "title" => $title, "author" => $author, "description" => $description, "read_status" => "want to read", "slug" => "/reading/books/" . $isbn, ]; $this->makeRequest("POST", "books", ["json" => $bookPayload]); } private function getBookByISBN(string $isbn): ?array { $response = $this->fetchFromApi("books", "isbn=eq." . urlencode($isbn)); return $response[0] ?? null; } } $handler = new BookImportHandler(); $handler->handleRequest();