require("dotenv").config(); const express = require("express"); const cors = require("cors"); const { log } = require("./logger"); const auth = require("./auth"); const privacyLawWebhooks = require("./routes/privacyLawWebhooks"); const pipelineRoutes = require("./routes/pipeline"); const { getToken, listTokens } = require("./tokenStore"); const app = express(); const PORT = process.env.PORT || 3002; app.use(cors()); app.get("/health", (req, res) => { res.json({ ok: true, service: "race-nation-shopify-app-backendrftgyhujikod" }); }); app.get("/shops/:shop", (req, res) => { const shop = req.params.shop; const tokenRecord = getToken(shop); if (!tokenRecord) { return res.status(404).json({ status: 0, message: "Shop not found" }); } return res.json({ status: 1, shop, fields: { accessToken: tokenRecord.accessToken ? "present" : "missing", scope: tokenRecord.scope ? "present" : "missing", savedAt: tokenRecord.savedAt ? "present" : "missing", locationId: tokenRecord.locationId ? "present" : "missing", fulfillmentService: tokenRecord.fulfillmentService ? "present" : "missing", }, }); }); app.get("/shops", (req, res) => { res.json({ shops: listTokens() }); }); app.use("/webhooks", privacyLawWebhooks); app.use(express.json({ limit: "10mb" })); app.use(express.urlencoded({ limit: "10mb", extended: true })); app.use("/", auth); app.post("/fulfillment", (req, res) => { console.log("POST /fulfillment:", req.body); res.sendStatus(200); }); app.use("/pipeline", pipelineRoutes); const server = app.listen(PORT, () => { log("general", `Server listening on port ${PORT}`); }); server.on("error", (err) => { if (err.code === "EADDRINUSE") { console.error(`Port ${PORT} is already in use.`); process.exit(1); } console.error("Server error:", err); process.exit(1); });