70 lines
1.8 KiB
JavaScript

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-backend" });
});
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);
});