import { EX_QUESTION_NUMBER_RANGE_OVERLAP, UNIQUE_QUESTION_CHOICE, UNIQUE_QUESTION_DEFAULT, UNIQUE_QUESTION_END, UNIQUE_QUESTION_NUMBER_RANGE, UNIQUE_TEST_START, } from '@/modules/questions/constants'; import { QuestionTransitionType } from '@/modules/questions/enums/question-transition-type.enum'; import { MigrationInterface, QueryRunner } from 'typeorm'; export class QuestionTransitionConstraints1785755373000 implements MigrationInterface { name = 'QuestionTransitionConstraints1785755373000'; public async up(queryRunner: QueryRunner): Promise { await queryRunner.query(` CREATE UNIQUE INDEX ${UNIQUE_TEST_START} ON question_transition("testId") WHERE type = '${QuestionTransitionType.START}'; `); await queryRunner.query(` CREATE UNIQUE INDEX ${UNIQUE_QUESTION_END} ON question_transition("fromQuestionId") WHERE type = '${QuestionTransitionType.END}'; `); await queryRunner.query(` CREATE UNIQUE INDEX ${UNIQUE_QUESTION_DEFAULT} ON question_transition("fromQuestionId") WHERE type = '${QuestionTransitionType.DEFAULT}'; `); await queryRunner.query(` CREATE UNIQUE INDEX ${UNIQUE_QUESTION_CHOICE} ON question_transition( "fromQuestionId", (condition ->> 'choiceId') ) WHERE type = '${QuestionTransitionType.CHOICE}'; `); await queryRunner.query(` CREATE UNIQUE INDEX ${UNIQUE_QUESTION_NUMBER_RANGE} ON question_transition( "fromQuestionId", (condition ->> 'min'), (condition ->> 'max') ) WHERE type = '${QuestionTransitionType.NUMBER_RANGE}'; `); await queryRunner.query(` CREATE EXTENSION IF NOT EXISTS btree_gist; `); await queryRunner.query(` ALTER TABLE question_transition ADD CONSTRAINT ${EX_QUESTION_NUMBER_RANGE_OVERLAP} EXCLUDE USING gist ( "fromQuestionId" WITH =, int4range( ((condition ->> 'min')::int), ((condition ->> 'max')::int), '[]' ) WITH && ) WHERE (type = '${QuestionTransitionType.NUMBER_RANGE}'); `); } public async down(queryRunner: QueryRunner): Promise { await queryRunner.query(` ALTER TABLE question_transition DROP CONSTRAINT ${EX_QUESTION_NUMBER_RANGE_OVERLAP}; `); await queryRunner.query( `DROP INDEX IF EXISTS ${UNIQUE_QUESTION_NUMBER_RANGE};`, ); await queryRunner.query(`DROP INDEX IF EXISTS ${UNIQUE_QUESTION_CHOICE};`); await queryRunner.query(`DROP INDEX IF EXISTS ${UNIQUE_QUESTION_DEFAULT};`); await queryRunner.query(`DROP INDEX IF EXISTS ${UNIQUE_QUESTION_END};`); await queryRunner.query(`DROP INDEX IF EXISTS ${UNIQUE_TEST_START};`); } }