// server.cjs const express = require("express"); const fetch = require("node-fetch"); const app = express(); const PORT = 9093; app.use(express.static("public")); // Import all search functions const { searchDigikala, getProductById } = require("./digikala"); const { searchBasalam } = require("./basalam"); const { searchTorob } = require("./torob"); const { searchSnappFood } = require("./snappfood"); const { searchKhanoumi } = require("./khanoumi"); const { searchLionComputer } = require("./lioncomputer"); // Main search API route app.get("/api/search", async (req, res) => { const q = req.query.q || ""; if (!q) return res.status(400).json({ error: "Query is required" }); try { // اگر ورودی فقط عدد باشد، فرض می‌کنیم ID محصول دیجی‌کالا است if (/^\d+$/.test(q)) { const product = await getProductById(Number(q)); if (product) { product.link = `https://www.digikala.com/product/dkp-${q}/`; // ✅ فاصله حذف شد return res.json({ basalam: [], torob: [], digikala: [product], snappfood: [], khanoumi: [], lioncomputer: [] }); } } // جستجوی متنی — همه منابع فعال هستند const [basalam, torob, digikala, snappfood, khanoumi, lioncomputer] = await Promise.allSettled([ searchBasalam(q), searchTorob(q), searchDigikala(q), // ✅ فراخوانی می‌شود searchSnappFood(q), searchKhanoumi(q), searchLionComputer(q) ]); res.json({ basalam: basalam.status === 'fulfilled' ? basalam.value : [], torob: torob.status === 'fulfilled' ? torob.value : [], digikala: digikala.status === 'fulfilled' ? digikala.value : [], // ✅ دیگر خالی نیست snappfood: snappfood.status === 'fulfilled' ? snappfood.value : [], khanoumi: khanoumi.status === 'fulfilled' ? khanoumi.value : [], lioncomputer: lioncomputer.status === 'fulfilled' ? lioncomputer.value : [] }); } catch (err) { console.error("Search API error:", err); res.status(500).json({ error: "Internal server error" }); } }); // Test endpoint for each service app.get("/api/test/:service", async (req, res) => { const service = req.params.service; const query = "تست"; try { let results = []; switch(service) { case 'basalam': results = await searchBasalam(query); break; case 'torob': results = await searchTorob(query); break; case 'digikala': results = await searchDigikala(query); break; case 'snappfood': results = await searchSnappFood(query); break; case 'khanoumi': results = await searchKhanoumi(query); break; case 'lioncomputer': results = await searchLionComputer(query); break; default: return res.status(400).json({ error: "Invalid service" }); } res.json({ service, results }); } catch (err) { res.status(500).json({ error: err.message }); } }); // ✅ درست: endpoint برای دریافت محصول با ID app.get("/api/digikala/product/:id", async (req, res) => { const { id } = req.params; if (!/^\d+$/.test(id)) { return res.status(400).json({ error: "Product ID must be a positive integer." }); } try { const product = await getProductById(Number(id)); if (!product) { return res.status(404).json({ error: "Product not found or unavailable." }); } res.json(product); } catch (err) { console.error("Error in /api/digikala/product/:id:", err.message); res.status(500).json({ error: "Internal server error" }); } }); // Start server app.listen(PORT, () => { console.log(`✓ Server running at http://localhost:${PORT}`); });