import { MigrationInterface, QueryRunner, Table, TableForeignKey, TableIndex, } from 'typeorm'; import { SMS_SCENARIOS } from '../../sms-settings/constants/sms-scenarios.constants'; import { SmsScenarioKey } from '../../sms-settings/enums/sms-scenario-key.enum'; /** Keys that exist on the enum created in this migration (later keys are seeded elsewhere). */ const INITIAL_SCENARIO_KEYS = [ SmsScenarioKey.OTP_LOGIN, SmsScenarioKey.RESERVE_CREATED, SmsScenarioKey.RESERVE_REMINDER, SmsScenarioKey.RESERVE_CONFIRMED, SmsScenarioKey.RESERVE_CANCELLED, ]; export class AddSmsScenarioSettings1721200000000 implements MigrationInterface { name = 'AddSmsScenarioSettings1721200000000'; public async up(queryRunner: QueryRunner): Promise { await queryRunner.query(` CREATE TYPE "sms_scenario_key_enum" AS ENUM ( 'otp_login', 'reserve_created', 'reserve_reminder', 'reserve_confirmed', 'reserve_cancelled' ) `); await queryRunner.createTable( new Table({ name: 'sms_scenario_settings', columns: [ { name: 'id', type: 'uuid', isPrimary: true, generationStrategy: 'uuid', default: 'gen_random_uuid()', }, { name: 'key', type: 'sms_scenario_key_enum', isUnique: true, }, { name: 'body', type: 'text', isNullable: true }, { name: 'templateId', type: 'uuid', isNullable: true }, { name: 'isActive', type: 'boolean', default: true }, { name: 'createdAt', type: 'timestamp', default: 'now()' }, { name: 'updatedAt', type: 'timestamp', default: 'now()' }, ], }), true, ); await queryRunner.createIndex( 'sms_scenario_settings', new TableIndex({ name: 'IDX_sms_scenario_settings_key', columnNames: ['key'], isUnique: true, }), ); await queryRunner.createForeignKey( 'sms_scenario_settings', new TableForeignKey({ name: 'FK_sms_scenario_settings_templateId', columnNames: ['templateId'], referencedTableName: 'sms_templates', referencedColumnNames: ['id'], onDelete: 'SET NULL', }), ); for (const key of INITIAL_SCENARIO_KEYS) { const scenario = SMS_SCENARIOS.find((item) => item.key === key); if (!scenario) { continue; } await queryRunner.query( ` INSERT INTO sms_scenario_settings (key, body, "isActive") VALUES ($1, $2, true) ON CONFLICT (key) DO NOTHING `, [scenario.key, scenario.defaultBody], ); } } public async down(queryRunner: QueryRunner): Promise { await queryRunner.dropTable('sms_scenario_settings', true); await queryRunner.query('DROP TYPE "sms_scenario_key_enum"'); } }