image_crawler/server.cjs

123 lines
4.2 KiB
JavaScript

// 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}`);
});