39502-vm/backend/src/db/migrations/1775480972757.js
2026-04-06 13:11:07 +00:00

4667 lines
148 KiB
JavaScript

module.exports = {
/**
* @param {QueryInterface} queryInterface
* @param {Sequelize} Sequelize
* @returns {Promise<void>}
*/
async up(queryInterface, Sequelize) {
/**
* @type {Transaction}
*/
const transaction = await queryInterface.sequelize.transaction();
try {
await queryInterface.createTable('users', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('roles', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('permissions', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('organizations', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('sites', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('pages', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('sections', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('feature_tiles', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('whatsapp_scenarios', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('whatsapp_messages', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('lead_sources', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('leads', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('conversations', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('inbound_messages', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('programs', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('sessions', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('placement_tests', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('trial_signups', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('integrations', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.createTable('lead_capture_events', {
id: {
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.DataTypes.UUIDV4,
primaryKey: true,
},
createdById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
updatedById: {
type: Sequelize.DataTypes.UUID,
references: {
key: 'id',
model: 'users',
},
},
createdAt: { type: Sequelize.DataTypes.DATE },
updatedAt: { type: Sequelize.DataTypes.DATE },
deletedAt: { type: Sequelize.DataTypes.DATE },
importHash: {
type: Sequelize.DataTypes.STRING(255),
allowNull: true,
unique: true,
},
}, { transaction });
await queryInterface.addColumn(
'users',
'firstName',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'users',
'lastName',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'users',
'phoneNumber',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'users',
'email',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'users',
'disabled',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'users',
'password',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'users',
'emailVerified',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'users',
'emailVerificationToken',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'users',
'emailVerificationTokenExpiresAt',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'users',
'passwordResetToken',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'users',
'passwordResetTokenExpiresAt',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'users',
'provider',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'users',
'app_roleId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'roles',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'users',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'roles',
'name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'roles',
'role_customization',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'roles',
'globalAccess',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'permissions',
'name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'organizations',
'name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'sites',
'name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'sites',
'brand_name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'sites',
'primary_domain',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'sites',
'obsidian_background_hex',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'sites',
'indigo_glow_hex',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'sites',
'default_language',
{
type: Sequelize.DataTypes.ENUM,
values: ['fr','en'],
},
{ transaction }
);
await queryInterface.addColumn(
'sites',
'is_bilingual_enabled',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'sites',
'ownerId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'users',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'sites',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'pages',
'siteId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'sites',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'pages',
'page_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['landing','legal','custom'],
},
{ transaction }
);
await queryInterface.addColumn(
'pages',
'slug',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'pages',
'title_en',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'pages',
'title_fr',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'pages',
'is_published',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'pages',
'published_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'pages',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'sections',
'pageId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'pages',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'sections',
'section_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['neural_bridge','hero','bento_features','whatsapp_simulation','closer','custom'],
},
{ transaction }
);
await queryInterface.addColumn(
'sections',
'internal_name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'sections',
'sort_order',
{
type: Sequelize.DataTypes.INTEGER,
},
{ transaction }
);
await queryInterface.addColumn(
'sections',
'is_enabled',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'sections',
'headline_en',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'sections',
'headline_fr',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'sections',
'subheadline_en',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'sections',
'subheadline_fr',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'sections',
'cta_label_en',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'sections',
'cta_label_fr',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'sections',
'cta_url',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'sections',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'feature_tiles',
'sectionId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'sections',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'feature_tiles',
'feature_key',
{
type: Sequelize.DataTypes.ENUM,
values: ['lead_gen','media_production','ai_infrastructure','elite_presence'],
},
{ transaction }
);
await queryInterface.addColumn(
'feature_tiles',
'title_en',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'feature_tiles',
'title_fr',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'feature_tiles',
'description_en',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'feature_tiles',
'description_fr',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'feature_tiles',
'sort_order',
{
type: Sequelize.DataTypes.INTEGER,
},
{ transaction }
);
await queryInterface.addColumn(
'feature_tiles',
'accent_hex',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'feature_tiles',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'whatsapp_scenarios',
'sectionId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'sections',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'whatsapp_scenarios',
'name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'whatsapp_scenarios',
'is_looping',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'whatsapp_scenarios',
'is_sound_enabled',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'whatsapp_scenarios',
'student_display_name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'whatsapp_scenarios',
'bot_display_name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'whatsapp_scenarios',
'capture_target',
{
type: Sequelize.DataTypes.ENUM,
values: ['google_sheet_row_preview','internal_lead'],
},
{ transaction }
);
await queryInterface.addColumn(
'whatsapp_scenarios',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'whatsapp_messages',
'scenarioId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'whatsapp_scenarios',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'whatsapp_messages',
'sender',
{
type: Sequelize.DataTypes.ENUM,
values: ['student','bot','system'],
},
{ transaction }
);
await queryInterface.addColumn(
'whatsapp_messages',
'message_en',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'whatsapp_messages',
'message_fr',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'whatsapp_messages',
'delay_ms',
{
type: Sequelize.DataTypes.INTEGER,
},
{ transaction }
);
await queryInterface.addColumn(
'whatsapp_messages',
'shows_typing_indicator',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'whatsapp_messages',
'sort_order',
{
type: Sequelize.DataTypes.INTEGER,
},
{ transaction }
);
await queryInterface.addColumn(
'whatsapp_messages',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'lead_sources',
'name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'lead_sources',
'channel',
{
type: Sequelize.DataTypes.ENUM,
values: ['instagram','tiktok','whatsapp','landing_page','referral','other'],
},
{ transaction }
);
await queryInterface.addColumn(
'lead_sources',
'utm_source',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'lead_sources',
'utm_medium',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'lead_sources',
'utm_campaign',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'lead_sources',
'is_active',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'lead_sources',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'leads',
'siteId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'sites',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'leads',
'lead_sourceId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'lead_sources',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'leads',
'full_name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'leads',
'phone',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'leads',
'email',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'leads',
'preferred_language',
{
type: Sequelize.DataTypes.ENUM,
values: ['fr','en'],
},
{ transaction }
);
await queryInterface.addColumn(
'leads',
'interest',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'leads',
'notes',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'leads',
'status',
{
type: Sequelize.DataTypes.ENUM,
values: ['new','contacted','qualified','scheduled_test','registered','lost'],
},
{ transaction }
);
await queryInterface.addColumn(
'leads',
'first_contact_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'leads',
'registered_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'leads',
'next_follow_up_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'leads',
'assigned_toId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'users',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'leads',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'conversations',
'leadId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'leads',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'conversations',
'channel',
{
type: Sequelize.DataTypes.ENUM,
values: ['whatsapp','instagram_dm','tiktok_dm','email','phone'],
},
{ transaction }
);
await queryInterface.addColumn(
'conversations',
'external_thread_reference',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'conversations',
'state',
{
type: Sequelize.DataTypes.ENUM,
values: ['open','paused','closed'],
},
{ transaction }
);
await queryInterface.addColumn(
'conversations',
'started_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'conversations',
'last_message_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'conversations',
'is_ai_assisted',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'conversations',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'inbound_messages',
'conversationId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'conversations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'inbound_messages',
'direction',
{
type: Sequelize.DataTypes.ENUM,
values: ['inbound','outbound'],
},
{ transaction }
);
await queryInterface.addColumn(
'inbound_messages',
'sender_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['lead','bot','agent','system'],
},
{ transaction }
);
await queryInterface.addColumn(
'inbound_messages',
'body_text',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'inbound_messages',
'sent_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'inbound_messages',
'delivery_status',
{
type: Sequelize.DataTypes.ENUM,
values: ['queued','sent','delivered','read','failed'],
},
{ transaction }
);
await queryInterface.addColumn(
'inbound_messages',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'programs',
'siteId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'sites',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'programs',
'name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'programs',
'description',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'programs',
'program_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['summer_camp','language_class','placement_test','other'],
},
{ transaction }
);
await queryInterface.addColumn(
'programs',
'is_active',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'programs',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'sessions',
'programId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'programs',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'sessions',
'name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'sessions',
'starts_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'sessions',
'ends_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'sessions',
'capacity',
{
type: Sequelize.DataTypes.INTEGER,
},
{ transaction }
);
await queryInterface.addColumn(
'sessions',
'spots_remaining',
{
type: Sequelize.DataTypes.INTEGER,
},
{ transaction }
);
await queryInterface.addColumn(
'sessions',
'is_open_for_registration',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'sessions',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'placement_tests',
'leadId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'leads',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'placement_tests',
'sessionId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'sessions',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'placement_tests',
'requested_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'placement_tests',
'scheduled_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'placement_tests',
'status',
{
type: Sequelize.DataTypes.ENUM,
values: ['requested','scheduled','completed','no_show','cancelled'],
},
{ transaction }
);
await queryInterface.addColumn(
'placement_tests',
'level_result',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'placement_tests',
'comments',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'placement_tests',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'trial_signups',
'siteId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'sites',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'trial_signups',
'full_name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'trial_signups',
'email',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'trial_signups',
'phone',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'trial_signups',
'language',
{
type: Sequelize.DataTypes.ENUM,
values: ['fr','en'],
},
{ transaction }
);
await queryInterface.addColumn(
'trial_signups',
'status',
{
type: Sequelize.DataTypes.ENUM,
values: ['started','active','completed','expired','cancelled'],
},
{ transaction }
);
await queryInterface.addColumn(
'trial_signups',
'started_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'trial_signups',
'ends_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'trial_signups',
'captured_leadId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'leads',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'trial_signups',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'integrations',
'siteId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'sites',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'integrations',
'provider',
{
type: Sequelize.DataTypes.ENUM,
values: ['google_sheets','whatsapp_business','meta_ads','tiktok_ads','webhook','other'],
},
{ transaction }
);
await queryInterface.addColumn(
'integrations',
'name',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'integrations',
'is_enabled',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'integrations',
'configuration_json',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'integrations',
'last_sync_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'integrations',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'lead_capture_events',
'leadId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'leads',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'lead_capture_events',
'integrationId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'integrations',
key: 'id',
},
},
{ transaction }
);
await queryInterface.addColumn(
'lead_capture_events',
'capture_type',
{
type: Sequelize.DataTypes.ENUM,
values: ['google_sheet_row','crm_record','notification'],
},
{ transaction }
);
await queryInterface.addColumn(
'lead_capture_events',
'external_reference',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'lead_capture_events',
'captured_at',
{
type: Sequelize.DataTypes.DATE,
},
{ transaction }
);
await queryInterface.addColumn(
'lead_capture_events',
'is_success',
{
type: Sequelize.DataTypes.BOOLEAN,
defaultValue: false,
allowNull: false,
},
{ transaction }
);
await queryInterface.addColumn(
'lead_capture_events',
'error_message',
{
type: Sequelize.DataTypes.TEXT,
},
{ transaction }
);
await queryInterface.addColumn(
'lead_capture_events',
'organizationsId',
{
type: Sequelize.DataTypes.UUID,
references: {
model: 'organizations',
key: 'id',
},
},
{ transaction }
);
await transaction.commit();
} catch (err) {
await transaction.rollback();
throw err;
}
},
/**
* @param {QueryInterface} queryInterface
* @param {Sequelize} Sequelize
* @returns {Promise<void>}
*/
async down(queryInterface, Sequelize) {
/**
* @type {Transaction}
*/
const transaction = await queryInterface.sequelize.transaction();
try {
await queryInterface.removeColumn(
'lead_capture_events',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'lead_capture_events',
'error_message',
{ transaction }
);
await queryInterface.removeColumn(
'lead_capture_events',
'is_success',
{ transaction }
);
await queryInterface.removeColumn(
'lead_capture_events',
'captured_at',
{ transaction }
);
await queryInterface.removeColumn(
'lead_capture_events',
'external_reference',
{ transaction }
);
await queryInterface.removeColumn(
'lead_capture_events',
'capture_type',
{ transaction }
);
await queryInterface.removeColumn(
'lead_capture_events',
'integrationId',
{ transaction }
);
await queryInterface.removeColumn(
'lead_capture_events',
'leadId',
{ transaction }
);
await queryInterface.removeColumn(
'integrations',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'integrations',
'last_sync_at',
{ transaction }
);
await queryInterface.removeColumn(
'integrations',
'configuration_json',
{ transaction }
);
await queryInterface.removeColumn(
'integrations',
'is_enabled',
{ transaction }
);
await queryInterface.removeColumn(
'integrations',
'name',
{ transaction }
);
await queryInterface.removeColumn(
'integrations',
'provider',
{ transaction }
);
await queryInterface.removeColumn(
'integrations',
'siteId',
{ transaction }
);
await queryInterface.removeColumn(
'trial_signups',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'trial_signups',
'captured_leadId',
{ transaction }
);
await queryInterface.removeColumn(
'trial_signups',
'ends_at',
{ transaction }
);
await queryInterface.removeColumn(
'trial_signups',
'started_at',
{ transaction }
);
await queryInterface.removeColumn(
'trial_signups',
'status',
{ transaction }
);
await queryInterface.removeColumn(
'trial_signups',
'language',
{ transaction }
);
await queryInterface.removeColumn(
'trial_signups',
'phone',
{ transaction }
);
await queryInterface.removeColumn(
'trial_signups',
'email',
{ transaction }
);
await queryInterface.removeColumn(
'trial_signups',
'full_name',
{ transaction }
);
await queryInterface.removeColumn(
'trial_signups',
'siteId',
{ transaction }
);
await queryInterface.removeColumn(
'placement_tests',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'placement_tests',
'comments',
{ transaction }
);
await queryInterface.removeColumn(
'placement_tests',
'level_result',
{ transaction }
);
await queryInterface.removeColumn(
'placement_tests',
'status',
{ transaction }
);
await queryInterface.removeColumn(
'placement_tests',
'scheduled_at',
{ transaction }
);
await queryInterface.removeColumn(
'placement_tests',
'requested_at',
{ transaction }
);
await queryInterface.removeColumn(
'placement_tests',
'sessionId',
{ transaction }
);
await queryInterface.removeColumn(
'placement_tests',
'leadId',
{ transaction }
);
await queryInterface.removeColumn(
'sessions',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'sessions',
'is_open_for_registration',
{ transaction }
);
await queryInterface.removeColumn(
'sessions',
'spots_remaining',
{ transaction }
);
await queryInterface.removeColumn(
'sessions',
'capacity',
{ transaction }
);
await queryInterface.removeColumn(
'sessions',
'ends_at',
{ transaction }
);
await queryInterface.removeColumn(
'sessions',
'starts_at',
{ transaction }
);
await queryInterface.removeColumn(
'sessions',
'name',
{ transaction }
);
await queryInterface.removeColumn(
'sessions',
'programId',
{ transaction }
);
await queryInterface.removeColumn(
'programs',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'programs',
'is_active',
{ transaction }
);
await queryInterface.removeColumn(
'programs',
'program_type',
{ transaction }
);
await queryInterface.removeColumn(
'programs',
'description',
{ transaction }
);
await queryInterface.removeColumn(
'programs',
'name',
{ transaction }
);
await queryInterface.removeColumn(
'programs',
'siteId',
{ transaction }
);
await queryInterface.removeColumn(
'inbound_messages',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'inbound_messages',
'delivery_status',
{ transaction }
);
await queryInterface.removeColumn(
'inbound_messages',
'sent_at',
{ transaction }
);
await queryInterface.removeColumn(
'inbound_messages',
'body_text',
{ transaction }
);
await queryInterface.removeColumn(
'inbound_messages',
'sender_type',
{ transaction }
);
await queryInterface.removeColumn(
'inbound_messages',
'direction',
{ transaction }
);
await queryInterface.removeColumn(
'inbound_messages',
'conversationId',
{ transaction }
);
await queryInterface.removeColumn(
'conversations',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'conversations',
'is_ai_assisted',
{ transaction }
);
await queryInterface.removeColumn(
'conversations',
'last_message_at',
{ transaction }
);
await queryInterface.removeColumn(
'conversations',
'started_at',
{ transaction }
);
await queryInterface.removeColumn(
'conversations',
'state',
{ transaction }
);
await queryInterface.removeColumn(
'conversations',
'external_thread_reference',
{ transaction }
);
await queryInterface.removeColumn(
'conversations',
'channel',
{ transaction }
);
await queryInterface.removeColumn(
'conversations',
'leadId',
{ transaction }
);
await queryInterface.removeColumn(
'leads',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'leads',
'assigned_toId',
{ transaction }
);
await queryInterface.removeColumn(
'leads',
'next_follow_up_at',
{ transaction }
);
await queryInterface.removeColumn(
'leads',
'registered_at',
{ transaction }
);
await queryInterface.removeColumn(
'leads',
'first_contact_at',
{ transaction }
);
await queryInterface.removeColumn(
'leads',
'status',
{ transaction }
);
await queryInterface.removeColumn(
'leads',
'notes',
{ transaction }
);
await queryInterface.removeColumn(
'leads',
'interest',
{ transaction }
);
await queryInterface.removeColumn(
'leads',
'preferred_language',
{ transaction }
);
await queryInterface.removeColumn(
'leads',
'email',
{ transaction }
);
await queryInterface.removeColumn(
'leads',
'phone',
{ transaction }
);
await queryInterface.removeColumn(
'leads',
'full_name',
{ transaction }
);
await queryInterface.removeColumn(
'leads',
'lead_sourceId',
{ transaction }
);
await queryInterface.removeColumn(
'leads',
'siteId',
{ transaction }
);
await queryInterface.removeColumn(
'lead_sources',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'lead_sources',
'is_active',
{ transaction }
);
await queryInterface.removeColumn(
'lead_sources',
'utm_campaign',
{ transaction }
);
await queryInterface.removeColumn(
'lead_sources',
'utm_medium',
{ transaction }
);
await queryInterface.removeColumn(
'lead_sources',
'utm_source',
{ transaction }
);
await queryInterface.removeColumn(
'lead_sources',
'channel',
{ transaction }
);
await queryInterface.removeColumn(
'lead_sources',
'name',
{ transaction }
);
await queryInterface.removeColumn(
'whatsapp_messages',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'whatsapp_messages',
'sort_order',
{ transaction }
);
await queryInterface.removeColumn(
'whatsapp_messages',
'shows_typing_indicator',
{ transaction }
);
await queryInterface.removeColumn(
'whatsapp_messages',
'delay_ms',
{ transaction }
);
await queryInterface.removeColumn(
'whatsapp_messages',
'message_fr',
{ transaction }
);
await queryInterface.removeColumn(
'whatsapp_messages',
'message_en',
{ transaction }
);
await queryInterface.removeColumn(
'whatsapp_messages',
'sender',
{ transaction }
);
await queryInterface.removeColumn(
'whatsapp_messages',
'scenarioId',
{ transaction }
);
await queryInterface.removeColumn(
'whatsapp_scenarios',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'whatsapp_scenarios',
'capture_target',
{ transaction }
);
await queryInterface.removeColumn(
'whatsapp_scenarios',
'bot_display_name',
{ transaction }
);
await queryInterface.removeColumn(
'whatsapp_scenarios',
'student_display_name',
{ transaction }
);
await queryInterface.removeColumn(
'whatsapp_scenarios',
'is_sound_enabled',
{ transaction }
);
await queryInterface.removeColumn(
'whatsapp_scenarios',
'is_looping',
{ transaction }
);
await queryInterface.removeColumn(
'whatsapp_scenarios',
'name',
{ transaction }
);
await queryInterface.removeColumn(
'whatsapp_scenarios',
'sectionId',
{ transaction }
);
await queryInterface.removeColumn(
'feature_tiles',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'feature_tiles',
'accent_hex',
{ transaction }
);
await queryInterface.removeColumn(
'feature_tiles',
'sort_order',
{ transaction }
);
await queryInterface.removeColumn(
'feature_tiles',
'description_fr',
{ transaction }
);
await queryInterface.removeColumn(
'feature_tiles',
'description_en',
{ transaction }
);
await queryInterface.removeColumn(
'feature_tiles',
'title_fr',
{ transaction }
);
await queryInterface.removeColumn(
'feature_tiles',
'title_en',
{ transaction }
);
await queryInterface.removeColumn(
'feature_tiles',
'feature_key',
{ transaction }
);
await queryInterface.removeColumn(
'feature_tiles',
'sectionId',
{ transaction }
);
await queryInterface.removeColumn(
'sections',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'sections',
'cta_url',
{ transaction }
);
await queryInterface.removeColumn(
'sections',
'cta_label_fr',
{ transaction }
);
await queryInterface.removeColumn(
'sections',
'cta_label_en',
{ transaction }
);
await queryInterface.removeColumn(
'sections',
'subheadline_fr',
{ transaction }
);
await queryInterface.removeColumn(
'sections',
'subheadline_en',
{ transaction }
);
await queryInterface.removeColumn(
'sections',
'headline_fr',
{ transaction }
);
await queryInterface.removeColumn(
'sections',
'headline_en',
{ transaction }
);
await queryInterface.removeColumn(
'sections',
'is_enabled',
{ transaction }
);
await queryInterface.removeColumn(
'sections',
'sort_order',
{ transaction }
);
await queryInterface.removeColumn(
'sections',
'internal_name',
{ transaction }
);
await queryInterface.removeColumn(
'sections',
'section_type',
{ transaction }
);
await queryInterface.removeColumn(
'sections',
'pageId',
{ transaction }
);
await queryInterface.removeColumn(
'pages',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'pages',
'published_at',
{ transaction }
);
await queryInterface.removeColumn(
'pages',
'is_published',
{ transaction }
);
await queryInterface.removeColumn(
'pages',
'title_fr',
{ transaction }
);
await queryInterface.removeColumn(
'pages',
'title_en',
{ transaction }
);
await queryInterface.removeColumn(
'pages',
'slug',
{ transaction }
);
await queryInterface.removeColumn(
'pages',
'page_type',
{ transaction }
);
await queryInterface.removeColumn(
'pages',
'siteId',
{ transaction }
);
await queryInterface.removeColumn(
'sites',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'sites',
'ownerId',
{ transaction }
);
await queryInterface.removeColumn(
'sites',
'is_bilingual_enabled',
{ transaction }
);
await queryInterface.removeColumn(
'sites',
'default_language',
{ transaction }
);
await queryInterface.removeColumn(
'sites',
'indigo_glow_hex',
{ transaction }
);
await queryInterface.removeColumn(
'sites',
'obsidian_background_hex',
{ transaction }
);
await queryInterface.removeColumn(
'sites',
'primary_domain',
{ transaction }
);
await queryInterface.removeColumn(
'sites',
'brand_name',
{ transaction }
);
await queryInterface.removeColumn(
'sites',
'name',
{ transaction }
);
await queryInterface.removeColumn(
'organizations',
'name',
{ transaction }
);
await queryInterface.removeColumn(
'permissions',
'name',
{ transaction }
);
await queryInterface.removeColumn(
'roles',
'globalAccess',
{ transaction }
);
await queryInterface.removeColumn(
'roles',
'role_customization',
{ transaction }
);
await queryInterface.removeColumn(
'roles',
'name',
{ transaction }
);
await queryInterface.removeColumn(
'users',
'organizationsId',
{ transaction }
);
await queryInterface.removeColumn(
'users',
'app_roleId',
{ transaction }
);
await queryInterface.removeColumn(
'users',
'provider',
{ transaction }
);
await queryInterface.removeColumn(
'users',
'passwordResetTokenExpiresAt',
{ transaction }
);
await queryInterface.removeColumn(
'users',
'passwordResetToken',
{ transaction }
);
await queryInterface.removeColumn(
'users',
'emailVerificationTokenExpiresAt',
{ transaction }
);
await queryInterface.removeColumn(
'users',
'emailVerificationToken',
{ transaction }
);
await queryInterface.removeColumn(
'users',
'emailVerified',
{ transaction }
);
await queryInterface.removeColumn(
'users',
'password',
{ transaction }
);
await queryInterface.removeColumn(
'users',
'disabled',
{ transaction }
);
await queryInterface.removeColumn(
'users',
'email',
{ transaction }
);
await queryInterface.removeColumn(
'users',
'phoneNumber',
{ transaction }
);
await queryInterface.removeColumn(
'users',
'lastName',
{ transaction }
);
await queryInterface.removeColumn(
'users',
'firstName',
{ transaction }
);
await queryInterface.dropTable('lead_capture_events', { transaction });
await queryInterface.dropTable('integrations', { transaction });
await queryInterface.dropTable('trial_signups', { transaction });
await queryInterface.dropTable('placement_tests', { transaction });
await queryInterface.dropTable('sessions', { transaction });
await queryInterface.dropTable('programs', { transaction });
await queryInterface.dropTable('inbound_messages', { transaction });
await queryInterface.dropTable('conversations', { transaction });
await queryInterface.dropTable('leads', { transaction });
await queryInterface.dropTable('lead_sources', { transaction });
await queryInterface.dropTable('whatsapp_messages', { transaction });
await queryInterface.dropTable('whatsapp_scenarios', { transaction });
await queryInterface.dropTable('feature_tiles', { transaction });
await queryInterface.dropTable('sections', { transaction });
await queryInterface.dropTable('pages', { transaction });
await queryInterface.dropTable('sites', { transaction });
await queryInterface.dropTable('organizations', { transaction });
await queryInterface.dropTable('permissions', { transaction });
await queryInterface.dropTable('roles', { transaction });
await queryInterface.dropTable('users', { transaction });
await transaction.commit();
} catch (err) {
await transaction.rollback();
throw err;
}
}
};