69 lines
1.8 KiB
JavaScript

const express = require("express");
const { createJob, updateJob, getJob, listJobs, canStartJob } = require("../src/pipelineJobs");
const { runKytPipelineJob } = require("../src/runKytPipelineJob");
const { getToken } = require("../tokenStore");
const { getSource, listSources } = require("../src/business-logic/import-pipeline/sources");
const router = express.Router();
router.post("/run", async (req, res) => {
const { shop, limit = null, source = "kyt" } = req.body || {};
if (!shop) {
return res.status(400).json({ error: "Missing shop." });
}
let sourceConfig;
try {
sourceConfig = getSource(source);
} catch (error) {
return res.status(400).json({ error: error.message });
}
if (!getToken(shop)) {
return res.status(400).json({ error: "No stored Shopify token found for this shop. Complete app auth first." });
}
if (!canStartJob(shop, sourceConfig.sourceKey)) {
return res.status(409).json({ error: `An import job is already running for ${shop} and source ${sourceConfig.sourceKey}.` });
}
const job = createJob({ shop, limit, source: sourceConfig.sourceKey });
updateJob(job.id, {
status: "queued",
step: "queued",
detail: `${sourceConfig.label} import job queued`,
});
setImmediate(() => {
runKytPipelineJob(job);
});
return res.json({
jobId: job.id,
status: "queued",
shop,
source: sourceConfig.sourceKey,
limit,
});
});
router.get("/sources", (req, res) => {
return res.json({ sources: listSources() });
});
router.get("/status/:jobId", (req, res) => {
const job = getJob(req.params.jobId);
if (!job) {
return res.status(404).json({ error: "Job not found." });
}
return res.json(job);
});
router.get("/jobs", (req, res) => {
return res.json({ jobs: listJobs() });
});
module.exports = router;