123 lines
4.2 KiB
JavaScript
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}`);
|
|
}); |