import com.firecrawl.client.FirecrawlClient;import com.firecrawl.models.Document;import com.firecrawl.models.SearchData;import com.firecrawl.models.SearchOptions;import com.firecrawl.models.ScrapeOptions;import com.firecrawl.models.BrowserExecuteResponse;import org.springframework.web.bind.annotation.*;import java.util.List;import java.util.Map;@RestController@RequestMapping("/api")public class FirecrawlController { private final FirecrawlClient firecrawl; public FirecrawlController(FirecrawlClient firecrawl) { this.firecrawl = firecrawl; } @PostMapping("/search") public SearchData search(@RequestBody Map<String, Object> body) { return firecrawl.search( (String) body.get("query"), SearchOptions.builder() .limit((int) body.getOrDefault("limit", 5)) .build() ); } @PostMapping("/scrape") public Map<String, Object> scrape(@RequestBody Map<String, String> body) { Document doc = firecrawl.scrape(body.get("url")); return Map.of( "markdown", doc.getMarkdown(), "metadata", doc.getMetadata() ); } @PostMapping("/interact") public Map<String, Object> interact(@RequestBody Map<String, String> body) { Document doc = firecrawl.scrape(body.get("url"), ScrapeOptions.builder().formats(List.of((Object) "markdown")).build()); String scrapeId = (String) doc.getMetadata().get("scrapeId"); BrowserExecuteResponse response = firecrawl.interact(scrapeId, body.getOrDefault("code", "const title = await page.title(); console.log(title);")); firecrawl.stopInteractiveBrowser(scrapeId); return Map.of("result", response.getStdout()); }}