Files
openhuman/scripts/mock-api/routes/cron.mjs
T

146 lines
3.9 KiB
JavaScript

import { json } from "../http.mjs";
import {
createMockId,
fuzzyNumber,
fuzzyPick,
fuzzyTimestamp,
getMockCronJobs,
getMockWebhookTriggers,
} from "../state.mjs";
let fixturesSeeded = false;
export function resetCronFixturesState() {
fixturesSeeded = false;
}
function ensureCronFixtures() {
if (fixturesSeeded) return;
const cronJobs = getMockCronJobs();
const webhookTriggers = getMockWebhookTriggers();
if (cronJobs.length === 0) {
const count = fuzzyNumber("cron:count", 0, 2);
for (let i = 0; i < count; i += 1) {
cronJobs.push({
id: createMockId("cron"),
name: fuzzyPick(
`cron:name:${i}`,
["Morning digest", "Support sweep", "Usage snapshot"],
"Mock cron job",
),
schedule: fuzzyPick(
`cron:schedule:${i}`,
["0 8 * * *", "*/30 * * * *", "15 17 * * 1-5"],
"0 8 * * *",
),
enabled: i % 2 === 0,
createdAt: fuzzyTimestamp(`cron:created:${i}`),
});
}
}
if (webhookTriggers.length === 0) {
const count = fuzzyNumber("trg:count", 0, 2);
for (let i = 0; i < count; i += 1) {
webhookTriggers.push({
id: createMockId("trg"),
name: fuzzyPick(
`trg:name:${i}`,
["Github push", "Stripe paid", "CRM sync"],
"Mock trigger",
),
enabled: true,
createdAt: fuzzyTimestamp(`trg:created:${i}`),
});
}
}
fixturesSeeded = true;
}
export function handleCron(ctx) {
const { method, url, parsedBody, res } = ctx;
ensureCronFixtures();
const cronJobs = getMockCronJobs();
const webhookTriggers = getMockWebhookTriggers();
if (method === "GET" && /^\/settings\/cron-jobs\/?(\?.*)?$/.test(url)) {
json(res, 200, { success: true, data: cronJobs });
return true;
}
if (method === "POST" && /^\/settings\/cron-jobs\/?$/.test(url)) {
const created = {
...(parsedBody || {}),
id: createMockId("cron"),
createdAt: new Date().toISOString(),
};
cronJobs.unshift(created);
json(res, 200, {
success: true,
data: created,
});
return true;
}
const cronItem = url.match(/^\/settings\/cron-jobs\/([^/?]+)\/?(\?.*)?$/);
if (cronItem && (method === "PATCH" || method === "DELETE")) {
const index = cronJobs.findIndex((entry) => entry.id === cronItem[1]);
if (index >= 0 && method === "PATCH") {
const { id: _ignoredId, ...patch } = parsedBody || {};
cronJobs[index] = {
...cronJobs[index],
...patch,
};
}
if (index >= 0 && method === "DELETE") {
cronJobs.splice(index, 1);
}
json(res, 200, {
success: true,
data: { id: cronItem[1], deleted: method === "DELETE" },
});
return true;
}
if (
method === "GET" &&
/^\/settings\/webhooks-triggers\/?(\?.*)?$/.test(url)
) {
json(res, 200, { success: true, data: webhookTriggers });
return true;
}
if (method === "POST" && /^\/settings\/webhooks-triggers\/?$/.test(url)) {
const created = {
...(parsedBody || {}),
id: createMockId("trg"),
createdAt: new Date().toISOString(),
};
webhookTriggers.unshift(created);
json(res, 200, {
success: true,
data: created,
});
return true;
}
const trgItem = url.match(
/^\/settings\/webhooks-triggers\/([^/?]+)\/?(\?.*)?$/,
);
if (trgItem && (method === "PATCH" || method === "DELETE")) {
const index = webhookTriggers.findIndex((entry) => entry.id === trgItem[1]);
if (index >= 0 && method === "PATCH") {
const { id: _ignoredId, ...patch } = parsedBody || {};
webhookTriggers[index] = {
...webhookTriggers[index],
...patch,
};
}
if (index >= 0 && method === "DELETE") {
webhookTriggers.splice(index, 1);
}
json(res, 200, {
success: true,
data: { id: trgItem[1], deleted: method === "DELETE" },
});
return true;
}
return false;
}