import { fetchEbayItems } from "@marketplace-scrapers/core"; /** * GET /api/ebay?q={query}&minPrice={minPrice}&maxPrice={maxPrice}&strictMode={strictMode}&exclusions={exclusions}&keywords={keywords}&buyItNowOnly={buyItNowOnly}&canadaOnly={canadaOnly} * Search eBay for listings (default: Buy It Now only, Canada only) */ export async function ebayRoute(req: Request): Promise { try { const reqUrl = new URL(req.url); const SEARCH_QUERY = req.headers.get("query") || reqUrl.searchParams.get("q") || null; if (!SEARCH_QUERY) return Response.json( { message: "Request didn't have 'query' header or 'q' search parameter!", }, { status: 400 }, ); const minPriceParam = reqUrl.searchParams.get("minPrice"); const minPrice = minPriceParam ? parseInt(minPriceParam, 10) : undefined; const maxPriceParam = reqUrl.searchParams.get("maxPrice"); const maxPrice = maxPriceParam ? parseInt(maxPriceParam, 10) : undefined; const strictMode = reqUrl.searchParams.get("strictMode") === "true"; const buyItNowOnly = reqUrl.searchParams.get("buyItNowOnly") !== "false"; const canadaOnly = reqUrl.searchParams.get("canadaOnly") !== "false"; const exclusionsParam = reqUrl.searchParams.get("exclusions"); const exclusions = exclusionsParam ? exclusionsParam.split(",").map((s) => s.trim()) : []; const keywordsParam = reqUrl.searchParams.get("keywords"); const keywords = keywordsParam ? keywordsParam.split(",").map((s) => s.trim()) : [SEARCH_QUERY]; const maxItemsParam = reqUrl.searchParams.get("maxItems"); const maxItems = maxItemsParam ? parseInt(maxItemsParam, 10) : undefined; const hideUnstableResults = reqUrl.searchParams.get("unstableFilter") === "true"; const items = hideUnstableResults ? await fetchEbayItems( SEARCH_QUERY, 1, { minPrice, maxPrice, strictMode, exclusions, keywords, buyItNowOnly, canadaOnly, }, { hideUnstableResults: true }, ) : await fetchEbayItems(SEARCH_QUERY, 1, { minPrice, maxPrice, strictMode, exclusions, keywords, buyItNowOnly, canadaOnly, }); let results; if (hideUnstableResults) { results = maxItems ? { results: items.results.slice(0, maxItems), unstableResults: items.unstableResults.slice(0, maxItems), } : items; } else { results = maxItems ? items.slice(0, maxItems) : items; } const isEmpty = hideUnstableResults ? results.results.length === 0 && results.unstableResults.length === 0 : !results || results.length === 0; if (isEmpty) return Response.json( { message: "Search didn't return any results!" }, { status: 404 }, ); return Response.json(results, { status: 200 }); } catch (error) { console.error("eBay scraping error:", error); const errorMessage = error instanceof Error ? error.message : "Unknown error occurred"; return Response.json({ message: errorMessage }, { status: 400 }); } }