106 lines
3 KiB
TypeScript
106 lines
3 KiB
TypeScript
|
|
/**
|
||
|
|
* One-time migration: reads Monday.com and webhook config from AppSettings
|
||
|
|
* and creates corresponding Integration rows for each organization.
|
||
|
|
*
|
||
|
|
* Usage: npx tsx prisma/migrate-integrations.ts
|
||
|
|
*/
|
||
|
|
|
||
|
|
import { PrismaClient } from "../src/generated/prisma/client";
|
||
|
|
import { PrismaPg } from "@prisma/adapter-pg";
|
||
|
|
import pg from "pg";
|
||
|
|
|
||
|
|
async function main() {
|
||
|
|
const pool = new pg.Pool({
|
||
|
|
connectionString: process.env.DATABASE_URL,
|
||
|
|
});
|
||
|
|
const adapter = new PrismaPg(pool);
|
||
|
|
const prisma = new PrismaClient({ adapter });
|
||
|
|
|
||
|
|
const settings = await prisma.appSettings.findUnique({
|
||
|
|
where: { id: "singleton" },
|
||
|
|
});
|
||
|
|
|
||
|
|
if (!settings) {
|
||
|
|
console.log("No AppSettings found — nothing to migrate.");
|
||
|
|
await prisma.$disconnect();
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
const orgs = await prisma.organization.findMany();
|
||
|
|
if (orgs.length === 0) {
|
||
|
|
console.log("No organizations found — nothing to migrate.");
|
||
|
|
await prisma.$disconnect();
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
const orgId = orgs[0].id;
|
||
|
|
let created = 0;
|
||
|
|
|
||
|
|
if (settings.mondayEnabled && settings.mondayApiToken && settings.mondayBoardId) {
|
||
|
|
const existing = await prisma.integration.findFirst({
|
||
|
|
where: { organizationId: orgId, provider: "monday" },
|
||
|
|
});
|
||
|
|
|
||
|
|
if (!existing) {
|
||
|
|
await prisma.integration.create({
|
||
|
|
data: {
|
||
|
|
organizationId: orgId,
|
||
|
|
provider: "monday",
|
||
|
|
name: "Monday.com (migrated)",
|
||
|
|
enabled: settings.mondayEnabled,
|
||
|
|
config: {
|
||
|
|
apiToken: settings.mondayApiToken,
|
||
|
|
boardId: settings.mondayBoardId,
|
||
|
|
columnMap: settings.mondayColumnMap || {},
|
||
|
|
},
|
||
|
|
triggerEvents: ["card_reviewed", "card_exported"],
|
||
|
|
syncDirection: "push",
|
||
|
|
},
|
||
|
|
});
|
||
|
|
created++;
|
||
|
|
console.log("Created Monday.com integration from AppSettings.");
|
||
|
|
} else {
|
||
|
|
console.log("Monday.com integration already exists — skipping.");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
if (settings.webhookEnabled && settings.webhookUrl) {
|
||
|
|
const existing = await prisma.integration.findFirst({
|
||
|
|
where: { organizationId: orgId, provider: "webhook" },
|
||
|
|
});
|
||
|
|
|
||
|
|
if (!existing) {
|
||
|
|
await prisma.integration.create({
|
||
|
|
data: {
|
||
|
|
organizationId: orgId,
|
||
|
|
provider: "webhook",
|
||
|
|
name: "Webhook (migrated)",
|
||
|
|
enabled: settings.webhookEnabled,
|
||
|
|
config: {
|
||
|
|
url: settings.webhookUrl,
|
||
|
|
secret: settings.webhookSecret,
|
||
|
|
},
|
||
|
|
triggerEvents: (settings.webhookEvents as string[]) || [
|
||
|
|
"ocr_complete",
|
||
|
|
"card_reviewed",
|
||
|
|
],
|
||
|
|
syncDirection: "push",
|
||
|
|
},
|
||
|
|
});
|
||
|
|
created++;
|
||
|
|
console.log("Created Webhook integration from AppSettings.");
|
||
|
|
} else {
|
||
|
|
console.log("Webhook integration already exists — skipping.");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
console.log(`Migration complete: ${created} integration(s) created.`);
|
||
|
|
await prisma.$disconnect();
|
||
|
|
await pool.end();
|
||
|
|
}
|
||
|
|
|
||
|
|
main().catch((e) => {
|
||
|
|
console.error("Migration failed:", e);
|
||
|
|
process.exit(1);
|
||
|
|
});
|