80 lines
2.7 KiB
TypeScript
80 lines
2.7 KiB
TypeScript
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<any> {
|
|
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<any> {
|
|
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};`);
|
|
}
|
|
}
|