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) { return ctb .addColumn("id", "bigint", (cb) => cb .generatedAlwaysAsIdentity() .primaryKey() ) .addColumn("created_at", "timestamptz", (cb) => cb .notNull() .defaultTo(sql`now()`) ) };