45 lines
1.5 KiB
TypeScript
45 lines
1.5 KiB
TypeScript
import { CreateTableBuilder, sql } from "kysely";
|
|
import { db } from "./db";
|
|
import { log } from "../util";
|
|
|
|
// =====================
|
|
// PRODUCT SYNCS
|
|
// =====================
|
|
{
|
|
log.info({ name: "product_syncs" }, "Creating table");
|
|
await db.schema.dropTable("product_syncs").ifExists().execute()
|
|
await db.schema.createTable("product_syncs")
|
|
.$call(addDefaultColumns)
|
|
.addColumn("printful_product_id_filter", sql`integer[]`)
|
|
.addColumn("syncing_printful_product_ids", sql`integer[]`, (cb) => cb
|
|
.notNull()
|
|
.defaultTo(sql`'{}'::integer[]`)
|
|
)
|
|
.addColumn("started_at", "timestamptz")
|
|
.addColumn("ended_at", "timestamptz")
|
|
.addColumn("has_failed", "boolean", (cb) => cb.notNull().defaultTo(false))
|
|
.execute()
|
|
|
|
await db.schema.dropIndex("idx_one_active_product_sync").ifExists().execute();
|
|
await db.schema.createIndex("idx_one_active_product_sync")
|
|
.on("product_syncs")
|
|
.unique()
|
|
.column("ended_at")
|
|
.where(sql.ref("started_at"), "is not", null)
|
|
.where("ended_at", "is", null)
|
|
.nullsNotDistinct()
|
|
.execute();
|
|
}
|
|
|
|
function addDefaultColumns(ctb: CreateTableBuilder<any, any>) {
|
|
return ctb
|
|
.addColumn("id", "bigint", (cb) => cb
|
|
.generatedAlwaysAsIdentity()
|
|
.primaryKey()
|
|
)
|
|
.addColumn("created_at", "timestamptz", (cb) => cb
|
|
.notNull()
|
|
.defaultTo(sql`now()`)
|
|
)
|
|
};
|