feat: add multi choice submission logic

This commit is contained in:
2026-08-21 10:25:33 +03:30
parent ca88e6994e
commit 2e146e52b5
12 changed files with 262 additions and 22 deletions
@@ -4,11 +4,17 @@ export class SubmissionCurrentQuestion1786282238898 implements MigrationInterfac
name = 'SubmissionCurrentQuestion1786282238898';
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`DROP INDEX "public"."unq_test_start"`);
await queryRunner.query(`DROP INDEX "public"."unq_question_end"`);
await queryRunner.query(`DROP INDEX "public"."unq_question_default"`);
await queryRunner.query(`DROP INDEX "public"."unq_question_choice"`);
await queryRunner.query(`DROP INDEX "public"."unq_question_number_range"`);
await queryRunner.query(`DROP INDEX IF EXISTS "public"."unq_test_start"`);
await queryRunner.query(`DROP INDEX IF EXISTS "public"."unq_question_end"`);
await queryRunner.query(
`DROP INDEX IF EXISTS "public"."unq_question_default"`,
);
await queryRunner.query(
`DROP INDEX IF EXISTS "public"."unq_question_choice"`,
);
await queryRunner.query(
`DROP INDEX IF EXISTS "public"."unq_question_number_range"`,
);
await queryRunner.query(
`ALTER TABLE "question_transition" DROP CONSTRAINT "ex_question_number_range_overlap"`,
);
@@ -0,0 +1,107 @@
import { MigrationInterface, QueryRunner } from 'typeorm';
export class MultiChoiceSubmission1787294625853 implements MigrationInterface {
name = 'MultiChoiceSubmission1787294625853';
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
`DROP INDEX "public"."IDX_ea78aac2e76e03f1c2fc720f1d"`,
);
await queryRunner.query(
`CREATE TABLE "submission_answer_choices_choice" ("submissionAnswerId" integer NOT NULL, "choiceId" integer NOT NULL, CONSTRAINT "PK_d3154f459415dc8f97a4bb10a1e" PRIMARY KEY ("submissionAnswerId", "choiceId"))`,
);
await queryRunner.query(
`CREATE INDEX "IDX_6f1902623cd8b3b52a5688a949" ON "submission_answer_choices_choice" ("submissionAnswerId") `,
);
await queryRunner.query(
`CREATE INDEX "IDX_2e699b5f339fb37917549c2fbf" ON "submission_answer_choices_choice" ("choiceId") `,
);
await queryRunner.query(
`ALTER TYPE "public"."question_transition_type_enum" RENAME TO "question_transition_type_enum_old"`,
);
await queryRunner.query(
`CREATE TYPE "public"."question_transition_type_enum" AS ENUM('start', 'default', 'choice', 'multi-choice', 'number-range', 'end')`,
);
await queryRunner.query(
`ALTER TABLE "question_transition" ALTER COLUMN "type" TYPE "public"."question_transition_type_enum" USING "type"::"text"::"public"."question_transition_type_enum"`,
);
await queryRunner.query(
`DROP TYPE "public"."question_transition_type_enum_old"`,
);
await queryRunner.query(
`ALTER TYPE "public"."question_type_enum" RENAME TO "question_type_enum_old"`,
);
await queryRunner.query(
`CREATE TYPE "public"."question_type_enum" AS ENUM('single-choice', 'multi-choice', 'numeric', 'text')`,
);
await queryRunner.query(
`ALTER TABLE "question" ALTER COLUMN "type" DROP DEFAULT`,
);
await queryRunner.query(
`ALTER TABLE "question" ALTER COLUMN "type" TYPE "public"."question_type_enum" USING "type"::"text"::"public"."question_type_enum"`,
);
await queryRunner.query(
`ALTER TABLE "question" ALTER COLUMN "type" SET DEFAULT 'single-choice'`,
);
await queryRunner.query(`DROP TYPE "public"."question_type_enum_old"`);
await queryRunner.query(
`CREATE UNIQUE INDEX "UNQ_SUBMISSION_QUESTION_IDX" ON "submission_answer" ("submissionId", "questionId") `,
);
await queryRunner.query(
`ALTER TABLE "submission_answer_choices_choice" ADD CONSTRAINT "FK_6f1902623cd8b3b52a5688a949b" FOREIGN KEY ("submissionAnswerId") REFERENCES "submission_answer"("id") ON DELETE CASCADE ON UPDATE CASCADE`,
);
await queryRunner.query(
`ALTER TABLE "submission_answer_choices_choice" ADD CONSTRAINT "FK_2e699b5f339fb37917549c2fbfc" FOREIGN KEY ("choiceId") REFERENCES "choice"("id") ON DELETE CASCADE ON UPDATE CASCADE`,
);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(
`ALTER TABLE "submission_answer_choices_choice" DROP CONSTRAINT "FK_2e699b5f339fb37917549c2fbfc"`,
);
await queryRunner.query(
`ALTER TABLE "submission_answer_choices_choice" DROP CONSTRAINT "FK_6f1902623cd8b3b52a5688a949b"`,
);
await queryRunner.query(
`DROP INDEX "public"."UNQ_SUBMISSION_QUESTION_IDX"`,
);
await queryRunner.query(
`CREATE TYPE "public"."question_type_enum_old" AS ENUM('multi-choice', 'numeric', 'text')`,
);
await queryRunner.query(
`ALTER TABLE "question" ALTER COLUMN "type" DROP DEFAULT`,
);
await queryRunner.query(
`ALTER TABLE "question" ALTER COLUMN "type" TYPE "public"."question_type_enum_old" USING "type"::"text"::"public"."question_type_enum_old"`,
);
await queryRunner.query(
`ALTER TABLE "question" ALTER COLUMN "type" SET DEFAULT 'multi-choice'`,
);
await queryRunner.query(`DROP TYPE "public"."question_type_enum"`);
await queryRunner.query(
`ALTER TYPE "public"."question_type_enum_old" RENAME TO "question_type_enum"`,
);
await queryRunner.query(
`CREATE TYPE "public"."question_transition_type_enum_old" AS ENUM('start', 'default', 'choice', 'number-range', 'end')`,
);
await queryRunner.query(
`ALTER TABLE "question_transition" ALTER COLUMN "type" TYPE "public"."question_transition_type_enum_old" USING "type"::"text"::"public"."question_transition_type_enum_old"`,
);
await queryRunner.query(
`DROP TYPE "public"."question_transition_type_enum"`,
);
await queryRunner.query(
`ALTER TYPE "public"."question_transition_type_enum_old" RENAME TO "question_transition_type_enum"`,
);
await queryRunner.query(
`DROP INDEX "public"."IDX_2e699b5f339fb37917549c2fbf"`,
);
await queryRunner.query(
`DROP INDEX "public"."IDX_6f1902623cd8b3b52a5688a949"`,
);
await queryRunner.query(`DROP TABLE "submission_answer_choices_choice"`);
await queryRunner.query(
`CREATE UNIQUE INDEX "IDX_ea78aac2e76e03f1c2fc720f1d" ON "submission_answer" ("questionId", "submissionId") `,
);
}
}