140 lines
3.3 KiB
JavaScript
140 lines
3.3 KiB
JavaScript
const express = require("express");
|
|
const ikea = require("ikea-availability-checker");
|
|
|
|
const app = express();
|
|
const PORT = 3000;
|
|
|
|
app.use(express.static("public"));
|
|
|
|
app.get("/api/stock", async (req, res) => {
|
|
const { store, product } = req.query;
|
|
|
|
if (!product || !store) {
|
|
return res.status(400).json({ error: "Missing product or store parameter" });
|
|
}
|
|
|
|
try {
|
|
const result = await ikea.availability(store, product);
|
|
const Filterdresult = ({
|
|
productId: result.productId || null,
|
|
stock: result.stock,
|
|
probability: result.probability,
|
|
store: result.store.name,
|
|
buCode: result.store.buCode,
|
|
country: result.store.country,
|
|
});
|
|
res.json(Filterdresult);
|
|
} catch (err) {
|
|
res.status(500).json({
|
|
error: "Failed to fetch stock",
|
|
details: err.message
|
|
});
|
|
}
|
|
});
|
|
|
|
|
|
app.get("/api/countrystock", async (req, res) => {
|
|
const { countryCode, product } = req.query;
|
|
|
|
if (!product || !countryCode) {
|
|
return res.status(400).json({ error: "Missing product or countryCode parameter" });
|
|
}
|
|
|
|
try {
|
|
const stores = ikea.stores.findByCountryCode(countryCode);
|
|
const result = await ikea.availabilities(stores, [product]);
|
|
const Filterdresult = result.map(item => ({
|
|
productId: item.productId || null,
|
|
stock: item.stock,
|
|
probability: item.probability,
|
|
store: item.store.name,
|
|
buCode: item.store.buCode,
|
|
country: item.store.country,
|
|
}));
|
|
res.json(Filterdresult);
|
|
} catch (err) {
|
|
res.status(500).json({
|
|
error: "Failed to fetch stock",
|
|
details: err.message
|
|
});
|
|
}
|
|
});
|
|
|
|
app.get("/api/stores", async (req, res) => {
|
|
const { countryCode } = req.query;
|
|
|
|
if (!countryCode) {
|
|
return res.status(400).json({ error: "Missing product or store parameter" });
|
|
}
|
|
|
|
try {
|
|
const result = await ikea.stores.findByCountryCode(countryCode);
|
|
|
|
const Filterdresult = result.map(item => ({
|
|
buCode: item.buCode || null,
|
|
name: item.name,
|
|
country: item.country
|
|
}));
|
|
|
|
res.json(Filterdresult);
|
|
} catch (err) {
|
|
res.status(500).json({
|
|
error: "Failed to fetch stock",
|
|
details: err.message
|
|
});
|
|
}
|
|
});
|
|
|
|
//For ChangeDetection.io instance
|
|
app.get("/api/change", async (req, res) => {
|
|
const { product, store } = req.query;
|
|
|
|
if (!product || !store) {
|
|
return res.status(400).send("Missing product or store");
|
|
}
|
|
|
|
try {
|
|
const result = await ikea.availability(store, product);
|
|
const quantity = result.stock ?? 0;
|
|
let inStock;
|
|
|
|
if( quantity > 0 ) {
|
|
inStock = "InStock" ;
|
|
} else{
|
|
inStock = "OutOfStock" ;
|
|
}
|
|
|
|
res.send(`
|
|
<style>
|
|
html {
|
|
background: #000000ab;
|
|
color: white;
|
|
}
|
|
</style>
|
|
<h1>${product}</h1>
|
|
<p>Status: ${inStock ? "In Stock" : "Out of Stock"}</p>
|
|
|
|
<!-- JSON-LD structured data for restock detection -->
|
|
<script type="application/ld+json">
|
|
{
|
|
"@context": "https://schema.org/",
|
|
"@type": "Product",
|
|
"name": "${product}",
|
|
"offers": {
|
|
"@type": "Offer",
|
|
"priceCurrency": "EUR",
|
|
"availability": "https://schema.org/${inStock}"
|
|
}
|
|
}
|
|
</script>
|
|
`);
|
|
} catch (err) {
|
|
res.type("text").send("error");
|
|
}
|
|
});
|
|
|
|
|
|
app.listen(PORT, () => {
|
|
console.log(`Server running at http://localhost:${PORT}`);
|
|
});
|