import type { Sequelize } from "sequelize"; import { DataTypes, QueryTypes } from "sequelize"; import { inventoryColumns, specificationColumns } from "./asset-relational-schema"; const id = { type: DataTypes.UUID, primaryKey: true }; const fk = (model: string, nullable = false) => ({ type: DataTypes.UUID, allowNull: nullable, references: { model, key: "id" }, onDelete: "RESTRICT", }); export async function migrateInventory(database: Sequelize) { const query = database.getQueryInterface(); const tables = await database.query<{ name: string }>( "SELECT TABLE_NAME AS name FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE()", { type: QueryTypes.SELECT } ); const asset = { id, companyId: fk("companies"), templateId: fk("asset_definitions"), siteId: fk("company_sites", true), brandId: fk("asset_brands", true), ...inventoryColumns, ...specificationColumns, }; const revision = { id, assetId: fk("assets"), actorId: fk("users"), siteId: fk("company_sites", true), brandId: fk("asset_brands", true), recordedAt: { type: DataTypes.STRING(30), allowNull: false }, ...inventoryColumns, templateId: fk("asset_definitions"), position: { type: DataTypes.INTEGER, allowNull: false }, }; if (!tables.some((table) => table.name === "assets")) { await query.createTable("assets", asset); } if (!tables.some((table) => table.name === "asset_revisions")) { await query.createTable("asset_revisions", revision); } }