@ooneex/typeorm 0.0.1 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/shared/chunk-1ez1q8rj.js +5 -0
- package/dist/shared/chunk-1ez1q8rj.js.map +10 -0
- package/dist/shared/chunk-23739ja5.js +5 -0
- package/dist/shared/{chunk-pwhygf44.js.map → chunk-23739ja5.js.map} +2 -2
- package/dist/shared/chunk-3s989zjv.js +5 -0
- package/dist/shared/{chunk-eh420jqn.js.map → chunk-3s989zjv.js.map} +2 -2
- package/dist/shared/chunk-4ysz6b7v.js +5 -0
- package/dist/shared/chunk-4ysz6b7v.js.map +10 -0
- package/dist/shared/chunk-635xd7h1.js +5 -0
- package/dist/shared/{chunk-wmftwzcs.js.map → chunk-635xd7h1.js.map} +2 -2
- package/dist/shared/chunk-63wp98dt.js +101 -0
- package/dist/shared/chunk-63wp98dt.js.map +11 -0
- package/dist/shared/chunk-6gzanxfz.js +5 -0
- package/dist/shared/chunk-6gzanxfz.js.map +18 -0
- package/dist/shared/chunk-81xh5hbk.js +5 -0
- package/dist/shared/chunk-81xh5hbk.js.map +21 -0
- package/dist/shared/chunk-8q6vs955.js +5 -0
- package/dist/shared/chunk-8q6vs955.js.map +10 -0
- package/dist/shared/chunk-bdyby4d8.js +5 -0
- package/dist/shared/chunk-bdyby4d8.js.map +10 -0
- package/dist/shared/chunk-fjtw26pp.js +5 -0
- package/dist/shared/{chunk-j7nprmyh.js.map → chunk-fjtw26pp.js.map} +2 -2
- package/dist/shared/chunk-gcch857j.js +5 -0
- package/dist/shared/chunk-gcch857j.js.map +11 -0
- package/dist/shared/chunk-h5mdrgqp.js +5 -0
- package/dist/shared/chunk-h5mdrgqp.js.map +21 -0
- package/dist/shared/chunk-mwb9mvew.js +42 -0
- package/dist/shared/chunk-mwb9mvew.js.map +10 -0
- package/dist/shared/chunk-n5dqa3qy.js +36 -0
- package/dist/shared/chunk-n5dqa3qy.js.map +10 -0
- package/dist/shared/chunk-qqvx08b4.js +5 -0
- package/dist/shared/{chunk-2e7zbxcq.js.map → chunk-qqvx08b4.js.map} +2 -2
- package/dist/shared/chunk-r7q1mkar.js +82 -0
- package/dist/shared/chunk-r7q1mkar.js.map +10 -0
- package/dist/shared/chunk-s1yxjjz5.js +5 -0
- package/dist/shared/chunk-s1yxjjz5.js.map +21 -0
- package/dist/shared/chunk-sm3brprk.js +51 -0
- package/dist/shared/chunk-sm3brprk.js.map +10 -0
- package/dist/shared/chunk-wp8mt34q.js +5 -0
- package/dist/shared/chunk-wp8mt34q.js.map +12 -0
- package/dist/shared/chunk-x9h6vngs.js +5 -0
- package/dist/shared/chunk-x9h6vngs.js.map +9 -0
- package/dist/shared/chunk-xyq6sfz0.js +5 -0
- package/dist/shared/{chunk-zmzz7hqq.js.map → chunk-xyq6sfz0.js.map} +2 -2
- package/dist/shared/chunk-yq9g4gac.js +5 -0
- package/dist/shared/{chunk-wawk30n1.js.map → chunk-yq9g4gac.js.map} +9 -4
- package/dist/src/entities/book/index.d.ts +80 -3
- package/dist/src/entities/book/index.js +2 -2
- package/dist/src/entities/book/index.js.map +1 -1
- package/dist/src/entities/common/index.d.ts +21 -28
- package/dist/src/entities/common/index.js +2 -2
- package/dist/src/entities/common/index.js.map +1 -1
- package/dist/src/entities/country/index.d.ts +21 -0
- package/dist/src/entities/country/index.js +4 -0
- package/dist/src/entities/country/index.js.map +9 -0
- package/dist/src/entities/currency/index.d.ts +23 -0
- package/dist/src/entities/currency/index.js +4 -0
- package/dist/src/entities/currency/index.js.map +9 -0
- package/dist/src/entities/folder/index.d.ts +104 -0
- package/dist/src/entities/folder/index.js +4 -0
- package/dist/src/entities/folder/index.js.map +19 -0
- package/dist/src/entities/gamification/flashcard/index.js +2 -2
- package/dist/src/entities/gamification/flashcard/index.js.map +1 -1
- package/dist/src/entities/gamification/index.js +2 -2
- package/dist/src/entities/gamification/index.js.map +1 -1
- package/dist/src/entities/gamification/mcq/index.d.ts +76 -7
- package/dist/src/entities/gamification/mcq/index.js +2 -2
- package/dist/src/entities/gamification/mcq/index.js.map +1 -1
- package/dist/src/entities/image/index.d.ts +83 -6
- package/dist/src/entities/image/index.js +2 -2
- package/dist/src/entities/image/index.js.map +1 -1
- package/dist/src/entities/medecine/index.d.ts +36 -0
- package/dist/src/entities/medecine/index.js +4 -0
- package/dist/src/entities/medecine/index.js.map +9 -0
- package/dist/src/entities/payment/index.js +2 -2
- package/dist/src/entities/payment/index.js.map +1 -1
- package/dist/src/entities/user/index.d.ts +48 -7
- package/dist/src/entities/user/index.js +2 -2
- package/dist/src/entities/user/index.js.map +1 -1
- package/dist/src/entities/video/index.d.ts +88 -10
- package/dist/src/entities/video/index.js +2 -2
- package/dist/src/entities/video/index.js.map +1 -1
- package/dist/src/migrations/book/index.d.ts +97 -0
- package/dist/src/migrations/book/index.js +516 -0
- package/dist/src/migrations/book/index.js.map +21 -0
- package/dist/src/migrations/common/index.d.ts +41 -0
- package/dist/src/migrations/common/index.js +57 -0
- package/dist/src/migrations/common/index.js.map +10 -0
- package/dist/src/migrations/country/index.d.ts +9 -0
- package/dist/src/migrations/country/index.js +40 -0
- package/dist/src/migrations/country/index.js.map +10 -0
- package/dist/src/migrations/currency/index.d.ts +9 -0
- package/dist/src/migrations/currency/index.js +44 -0
- package/dist/src/migrations/currency/index.js.map +10 -0
- package/dist/src/migrations/folder/index.d.ts +81 -0
- package/dist/src/migrations/folder/index.js +387 -0
- package/dist/src/migrations/folder/index.js.map +19 -0
- package/dist/src/migrations/gamification/flashcard/index.d.ts +57 -0
- package/dist/src/migrations/gamification/flashcard/index.js +420 -0
- package/dist/src/migrations/gamification/flashcard/index.js.map +16 -0
- package/dist/src/migrations/gamification/index.d.ts +9 -0
- package/dist/src/migrations/gamification/index.js +4 -0
- package/dist/src/migrations/gamification/index.js.map +9 -0
- package/dist/src/migrations/gamification/mcq/index.d.ts +97 -0
- package/dist/src/migrations/gamification/mcq/index.js +526 -0
- package/dist/src/migrations/gamification/mcq/index.js.map +21 -0
- package/dist/src/migrations/image/index.d.ts +81 -0
- package/dist/src/migrations/image/index.js +328 -0
- package/dist/src/migrations/image/index.js.map +18 -0
- package/dist/src/migrations/medecine/index.d.ts +25 -0
- package/dist/src/migrations/medecine/index.js +119 -0
- package/dist/src/migrations/medecine/index.js.map +12 -0
- package/dist/src/migrations/payment/index.d.ts +49 -0
- package/dist/src/migrations/payment/index.js +352 -0
- package/dist/src/migrations/payment/index.js.map +15 -0
- package/dist/src/migrations/user/index.d.ts +81 -0
- package/dist/src/migrations/user/index.js +309 -0
- package/dist/src/migrations/user/index.js.map +19 -0
- package/dist/src/migrations/video/index.d.ts +97 -0
- package/dist/src/migrations/video/index.js +289 -0
- package/dist/src/migrations/video/index.js.map +21 -0
- package/dist/src/repositories/book/index.d.ts +310 -35
- package/dist/src/repositories/book/index.js +2 -2
- package/dist/src/repositories/book/index.js.map +15 -6
- package/dist/src/repositories/common/index.d.ts +65 -94
- package/dist/src/repositories/common/index.js +2 -2
- package/dist/src/repositories/common/index.js.map +8 -9
- package/dist/src/repositories/country/index.d.ts +42 -0
- package/dist/src/repositories/country/index.js +4 -0
- package/dist/src/repositories/country/index.js.map +10 -0
- package/dist/src/repositories/currency/index.d.ts +44 -0
- package/dist/src/repositories/currency/index.js +4 -0
- package/dist/src/repositories/currency/index.js.map +10 -0
- package/dist/src/repositories/gamification/flashcard/index.d.ts +14 -14
- package/dist/src/repositories/gamification/flashcard/index.js +2 -2
- package/dist/src/repositories/gamification/flashcard/index.js.map +9 -9
- package/dist/src/repositories/gamification/index.d.ts +328 -83
- package/dist/src/repositories/gamification/index.js +2 -2
- package/dist/src/repositories/gamification/index.js.map +3 -3
- package/dist/src/repositories/gamification/mcq/index.d.ts +299 -54
- package/dist/src/repositories/gamification/mcq/index.js +2 -2
- package/dist/src/repositories/gamification/mcq/index.js.map +15 -7
- package/dist/src/repositories/image/index.d.ts +295 -20
- package/dist/src/repositories/image/index.js +2 -2
- package/dist/src/repositories/image/index.js.map +13 -4
- package/dist/src/repositories/medecine/index.d.ts +99 -0
- package/dist/src/repositories/medecine/index.js +4 -0
- package/dist/src/repositories/medecine/index.js.map +12 -0
- package/dist/src/repositories/payment/index.d.ts +12 -12
- package/dist/src/repositories/payment/index.js +2 -2
- package/dist/src/repositories/payment/index.js.map +8 -8
- package/dist/src/repositories/user/index.d.ts +210 -59
- package/dist/src/repositories/user/index.js +2 -2
- package/dist/src/repositories/user/index.js.map +13 -8
- package/dist/src/repositories/video/index.d.ts +330 -54
- package/dist/src/repositories/video/index.js +2 -2
- package/dist/src/repositories/video/index.js.map +15 -6
- package/package.json +188 -58
- package/dist/ooneex-typeorm-0.0.1.tgz +0 -0
- package/dist/shared/chunk-2e7zbxcq.js +0 -5
- package/dist/shared/chunk-764bzjhz.js +0 -5
- package/dist/shared/chunk-764bzjhz.js.map +0 -12
- package/dist/shared/chunk-eh420jqn.js +0 -5
- package/dist/shared/chunk-gjsgnzaq.js +0 -5
- package/dist/shared/chunk-gjsgnzaq.js.map +0 -10
- package/dist/shared/chunk-hw4vdg6q.js +0 -5
- package/dist/shared/chunk-hw4vdg6q.js.map +0 -10
- package/dist/shared/chunk-j7nprmyh.js +0 -5
- package/dist/shared/chunk-kgxsdeye.js +0 -5
- package/dist/shared/chunk-kgxsdeye.js.map +0 -13
- package/dist/shared/chunk-ntrrrvwt.js +0 -5
- package/dist/shared/chunk-ntrrrvwt.js.map +0 -12
- package/dist/shared/chunk-pwhygf44.js +0 -5
- package/dist/shared/chunk-sd6mmec6.js +0 -5
- package/dist/shared/chunk-sd6mmec6.js.map +0 -12
- package/dist/shared/chunk-wawk30n1.js +0 -5
- package/dist/shared/chunk-wmftwzcs.js +0 -5
- package/dist/shared/chunk-zmzz7hqq.js +0 -5
|
@@ -0,0 +1,526 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
import{c as N}from"../../../../shared/chunk-mwb9mvew.js";import{e as B}from"../../../../shared/chunk-63wp98dt.js";import{f as O}from"../../../../shared/chunk-n5dqa3qy.js";import{_a as v}from"../../../../shared/chunk-x9h6vngs.js";import{decorator as P}from"@ooneex/migrations";class p{async up(h){await h`
|
|
3
|
+
CREATE TABLE IF NOT EXISTS mcq_questions (
|
|
4
|
+
id VARCHAR(25) PRIMARY KEY,
|
|
5
|
+
question_number INT NOT NULL,
|
|
6
|
+
text TEXT NOT NULL,
|
|
7
|
+
context VARCHAR(255),
|
|
8
|
+
context_id VARCHAR(25),
|
|
9
|
+
stat_id VARCHAR(25),
|
|
10
|
+
status_id VARCHAR(25),
|
|
11
|
+
image_id VARCHAR(25),
|
|
12
|
+
is_locked BOOLEAN DEFAULT false,
|
|
13
|
+
locked_at TIMESTAMPTZ,
|
|
14
|
+
is_blocked BOOLEAN DEFAULT false,
|
|
15
|
+
blocked_at TIMESTAMPTZ,
|
|
16
|
+
block_reason TEXT,
|
|
17
|
+
is_public BOOLEAN DEFAULT true,
|
|
18
|
+
language VARCHAR(10),
|
|
19
|
+
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
20
|
+
updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
21
|
+
deleted_at TIMESTAMPTZ,
|
|
22
|
+
CONSTRAINT fk_mcq_questions_status FOREIGN KEY (status_id) REFERENCES statuses(id) ON DELETE SET NULL
|
|
23
|
+
)
|
|
24
|
+
`,await h`
|
|
25
|
+
CREATE TABLE IF NOT EXISTS mcq_questions_tags (
|
|
26
|
+
question_id VARCHAR(25) NOT NULL,
|
|
27
|
+
tag_id VARCHAR(25) NOT NULL,
|
|
28
|
+
PRIMARY KEY (question_id, tag_id),
|
|
29
|
+
CONSTRAINT fk_mcq_questions_tags_question FOREIGN KEY (question_id) REFERENCES mcq_questions(id) ON DELETE CASCADE,
|
|
30
|
+
CONSTRAINT fk_mcq_questions_tags_tag FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE
|
|
31
|
+
)
|
|
32
|
+
`,await h`
|
|
33
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_question_number ON mcq_questions(question_number)
|
|
34
|
+
`,await h`
|
|
35
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_context ON mcq_questions(context, context_id)
|
|
36
|
+
`,await h`
|
|
37
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_stat_id ON mcq_questions(stat_id)
|
|
38
|
+
`,await h`
|
|
39
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_status_id ON mcq_questions(status_id)
|
|
40
|
+
`,await h`
|
|
41
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_image_id ON mcq_questions(image_id)
|
|
42
|
+
`,await h`
|
|
43
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_language ON mcq_questions(language)
|
|
44
|
+
`,await h`
|
|
45
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_deleted_at ON mcq_questions(deleted_at)
|
|
46
|
+
`,await h`
|
|
47
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_is_public ON mcq_questions(is_public) WHERE deleted_at IS NULL
|
|
48
|
+
`,await h`
|
|
49
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_created_at ON mcq_questions(created_at DESC)
|
|
50
|
+
`,await h`
|
|
51
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_updated_at ON mcq_questions(updated_at DESC)
|
|
52
|
+
`,await h`
|
|
53
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_active ON mcq_questions(is_blocked, is_locked) WHERE deleted_at IS NULL AND is_blocked = false
|
|
54
|
+
`,await h`
|
|
55
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_tags_question_id ON mcq_questions_tags(question_id)
|
|
56
|
+
`,await h`
|
|
57
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_tags_tag_id ON mcq_questions_tags(tag_id)
|
|
58
|
+
`}async down(h){await h`DROP TABLE IF EXISTS mcq_questions_tags CASCADE`,await h`DROP TABLE IF EXISTS mcq_questions CASCADE`}getVersion(){return"20251225180910446"}getDependencies(){return[B,N]}}p=v([P.migration()],p);import{decorator as R}from"@ooneex/migrations";class z{async up(h){await h`
|
|
59
|
+
CREATE TYPE mcq_choice_letter AS ENUM ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J')
|
|
60
|
+
`,await h`
|
|
61
|
+
CREATE TABLE IF NOT EXISTS mcq_question_choices (
|
|
62
|
+
id VARCHAR(25) PRIMARY KEY,
|
|
63
|
+
letter mcq_choice_letter NOT NULL,
|
|
64
|
+
text TEXT NOT NULL,
|
|
65
|
+
is_correct BOOLEAN DEFAULT false,
|
|
66
|
+
explanation TEXT,
|
|
67
|
+
question_id VARCHAR(25) NOT NULL,
|
|
68
|
+
is_locked BOOLEAN DEFAULT false,
|
|
69
|
+
locked_at TIMESTAMPTZ,
|
|
70
|
+
is_blocked BOOLEAN DEFAULT false,
|
|
71
|
+
blocked_at TIMESTAMPTZ,
|
|
72
|
+
block_reason TEXT,
|
|
73
|
+
is_public BOOLEAN DEFAULT true,
|
|
74
|
+
language VARCHAR(10),
|
|
75
|
+
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
76
|
+
updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
77
|
+
deleted_at TIMESTAMPTZ,
|
|
78
|
+
CONSTRAINT fk_mcq_question_choices_question FOREIGN KEY (question_id) REFERENCES mcq_questions(id) ON DELETE CASCADE
|
|
79
|
+
)
|
|
80
|
+
`,await h`
|
|
81
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_question_choices_question_id ON mcq_question_choices(question_id)
|
|
82
|
+
`,await h`
|
|
83
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_question_choices_letter ON mcq_question_choices(letter)
|
|
84
|
+
`,await h`
|
|
85
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_question_choices_is_correct ON mcq_question_choices(is_correct)
|
|
86
|
+
`,await h`
|
|
87
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_question_choices_language ON mcq_question_choices(language)
|
|
88
|
+
`,await h`
|
|
89
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_question_choices_deleted_at ON mcq_question_choices(deleted_at)
|
|
90
|
+
`,await h`
|
|
91
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_question_choices_is_public ON mcq_question_choices(is_public) WHERE deleted_at IS NULL
|
|
92
|
+
`,await h`
|
|
93
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_question_choices_created_at ON mcq_question_choices(created_at DESC)
|
|
94
|
+
`,await h`
|
|
95
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_question_choices_active ON mcq_question_choices(is_blocked, is_locked) WHERE deleted_at IS NULL AND is_blocked = false
|
|
96
|
+
`,await h`
|
|
97
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_question_choices_question_letter ON mcq_question_choices(question_id, letter)
|
|
98
|
+
`}async down(h){await h`DROP TABLE IF EXISTS mcq_question_choices CASCADE`,await h`DROP TYPE IF EXISTS mcq_choice_letter CASCADE`}getVersion(){return"20251225180910449"}getDependencies(){return[p]}}z=v([R.migration()],z);import{decorator as S}from"@ooneex/migrations";class A{async up(h){await h`
|
|
99
|
+
CREATE TYPE mcq_session_status AS ENUM ('DRAFT', 'IN_PROGRESS', 'PAUSED', 'COMPLETED', 'CANCELLED')
|
|
100
|
+
`,await h`
|
|
101
|
+
CREATE TYPE session_type AS ENUM (
|
|
102
|
+
'TRAINING', 'PRACTICE', 'SIMULATION', 'QUIZ',
|
|
103
|
+
'CHALLENGE', 'TOURNAMENT', 'REVIEW', 'DIAGNOSTIC', 'SPEED_TEST'
|
|
104
|
+
)
|
|
105
|
+
`,await h`
|
|
106
|
+
CREATE TABLE IF NOT EXISTS mcq_sessions (
|
|
107
|
+
id VARCHAR(25) PRIMARY KEY,
|
|
108
|
+
name VARCHAR(500) NOT NULL,
|
|
109
|
+
total_questions INT DEFAULT 0,
|
|
110
|
+
answered_count INT DEFAULT 0,
|
|
111
|
+
correct_count INT DEFAULT 0,
|
|
112
|
+
incorrect_count INT DEFAULT 0,
|
|
113
|
+
timing INT DEFAULT 0,
|
|
114
|
+
status mcq_session_status DEFAULT 'DRAFT',
|
|
115
|
+
score DECIMAL(5, 2) DEFAULT 0,
|
|
116
|
+
started_at TIMESTAMPTZ,
|
|
117
|
+
paused_at TIMESTAMPTZ,
|
|
118
|
+
resumed_at TIMESTAMPTZ,
|
|
119
|
+
completed_at TIMESTAMPTZ,
|
|
120
|
+
type session_type NOT NULL,
|
|
121
|
+
level_id VARCHAR(25) NOT NULL,
|
|
122
|
+
is_locked BOOLEAN DEFAULT false,
|
|
123
|
+
locked_at TIMESTAMPTZ,
|
|
124
|
+
is_blocked BOOLEAN DEFAULT false,
|
|
125
|
+
blocked_at TIMESTAMPTZ,
|
|
126
|
+
block_reason TEXT,
|
|
127
|
+
is_public BOOLEAN DEFAULT true,
|
|
128
|
+
language VARCHAR(10),
|
|
129
|
+
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
130
|
+
updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
131
|
+
deleted_at TIMESTAMPTZ,
|
|
132
|
+
CONSTRAINT fk_mcq_sessions_level FOREIGN KEY (level_id) REFERENCES levels(id) ON DELETE RESTRICT
|
|
133
|
+
)
|
|
134
|
+
`,await h`
|
|
135
|
+
CREATE TABLE IF NOT EXISTS mcq_sessions_questions (
|
|
136
|
+
session_id VARCHAR(25) NOT NULL,
|
|
137
|
+
question_id VARCHAR(25) NOT NULL,
|
|
138
|
+
PRIMARY KEY (session_id, question_id),
|
|
139
|
+
CONSTRAINT fk_mcq_sessions_questions_session FOREIGN KEY (session_id) REFERENCES mcq_sessions(id) ON DELETE CASCADE,
|
|
140
|
+
CONSTRAINT fk_mcq_sessions_questions_question FOREIGN KEY (question_id) REFERENCES mcq_questions(id) ON DELETE CASCADE
|
|
141
|
+
)
|
|
142
|
+
`,await h`
|
|
143
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_sessions_name ON mcq_sessions(name)
|
|
144
|
+
`,await h`
|
|
145
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_sessions_status ON mcq_sessions(status)
|
|
146
|
+
`,await h`
|
|
147
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_sessions_type ON mcq_sessions(type)
|
|
148
|
+
`,await h`
|
|
149
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_sessions_level_id ON mcq_sessions(level_id)
|
|
150
|
+
`,await h`
|
|
151
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_sessions_score ON mcq_sessions(score DESC)
|
|
152
|
+
`,await h`
|
|
153
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_sessions_started_at ON mcq_sessions(started_at DESC)
|
|
154
|
+
`,await h`
|
|
155
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_sessions_completed_at ON mcq_sessions(completed_at DESC)
|
|
156
|
+
`,await h`
|
|
157
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_sessions_language ON mcq_sessions(language)
|
|
158
|
+
`,await h`
|
|
159
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_sessions_deleted_at ON mcq_sessions(deleted_at)
|
|
160
|
+
`,await h`
|
|
161
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_sessions_is_public ON mcq_sessions(is_public) WHERE deleted_at IS NULL
|
|
162
|
+
`,await h`
|
|
163
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_sessions_created_at ON mcq_sessions(created_at DESC)
|
|
164
|
+
`,await h`
|
|
165
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_sessions_updated_at ON mcq_sessions(updated_at DESC)
|
|
166
|
+
`,await h`
|
|
167
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_sessions_active ON mcq_sessions(is_blocked, is_locked) WHERE deleted_at IS NULL AND is_blocked = false
|
|
168
|
+
`,await h`
|
|
169
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_sessions_performance ON mcq_sessions(type, score DESC, completed_at DESC) WHERE status = 'COMPLETED' AND deleted_at IS NULL
|
|
170
|
+
`,await h`
|
|
171
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_sessions_questions_session_id ON mcq_sessions_questions(session_id)
|
|
172
|
+
`,await h`
|
|
173
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_sessions_questions_question_id ON mcq_sessions_questions(question_id)
|
|
174
|
+
`}async down(h){await h`DROP TABLE IF EXISTS mcq_sessions_questions CASCADE`,await h`DROP TABLE IF EXISTS mcq_sessions CASCADE`,await h`DROP TYPE IF EXISTS session_type CASCADE`,await h`DROP TYPE IF EXISTS mcq_session_status CASCADE`}getVersion(){return"20251225180910451"}getDependencies(){return[O,p]}}A=v([S.migration()],A);import{decorator as T}from"@ooneex/migrations";class D{async up(h){await h`
|
|
175
|
+
CREATE TYPE answer_state AS ENUM ('UNANSWERED', 'CORRECT', 'INCORRECT', 'PARTIAL', 'SKIPPED')
|
|
176
|
+
`,await h`
|
|
177
|
+
CREATE TABLE IF NOT EXISTS mcq_session_questions (
|
|
178
|
+
id VARCHAR(25) PRIMARY KEY,
|
|
179
|
+
session_id VARCHAR(25) NOT NULL,
|
|
180
|
+
question_id VARCHAR(25) NOT NULL,
|
|
181
|
+
question_number INT NOT NULL,
|
|
182
|
+
context VARCHAR(255),
|
|
183
|
+
context_id VARCHAR(25),
|
|
184
|
+
state answer_state NOT NULL,
|
|
185
|
+
score DECIMAL(5, 2) DEFAULT 0,
|
|
186
|
+
is_locked BOOLEAN DEFAULT false,
|
|
187
|
+
locked_at TIMESTAMPTZ,
|
|
188
|
+
is_blocked BOOLEAN DEFAULT false,
|
|
189
|
+
blocked_at TIMESTAMPTZ,
|
|
190
|
+
block_reason TEXT,
|
|
191
|
+
is_public BOOLEAN DEFAULT true,
|
|
192
|
+
language VARCHAR(10),
|
|
193
|
+
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
194
|
+
updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
195
|
+
deleted_at TIMESTAMPTZ,
|
|
196
|
+
CONSTRAINT fk_mcq_session_questions_session FOREIGN KEY (session_id) REFERENCES mcq_sessions(id) ON DELETE CASCADE,
|
|
197
|
+
CONSTRAINT fk_mcq_session_questions_question FOREIGN KEY (question_id) REFERENCES mcq_questions(id) ON DELETE RESTRICT
|
|
198
|
+
)
|
|
199
|
+
`,await h`
|
|
200
|
+
CREATE TABLE IF NOT EXISTS mcq_session_questions_selected_choices (
|
|
201
|
+
session_question_id VARCHAR(25) NOT NULL,
|
|
202
|
+
choice_id VARCHAR(25) NOT NULL,
|
|
203
|
+
PRIMARY KEY (session_question_id, choice_id),
|
|
204
|
+
CONSTRAINT fk_mcq_session_questions_selected_choices_session_question FOREIGN KEY (session_question_id) REFERENCES mcq_session_questions(id) ON DELETE CASCADE,
|
|
205
|
+
CONSTRAINT fk_mcq_session_questions_selected_choices_choice FOREIGN KEY (choice_id) REFERENCES mcq_question_choices(id) ON DELETE CASCADE
|
|
206
|
+
)
|
|
207
|
+
`,await h`
|
|
208
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_session_questions_session_id ON mcq_session_questions(session_id)
|
|
209
|
+
`,await h`
|
|
210
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_session_questions_question_id ON mcq_session_questions(question_id)
|
|
211
|
+
`,await h`
|
|
212
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_session_questions_question_number ON mcq_session_questions(question_number)
|
|
213
|
+
`,await h`
|
|
214
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_session_questions_state ON mcq_session_questions(state)
|
|
215
|
+
`,await h`
|
|
216
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_session_questions_context ON mcq_session_questions(context, context_id)
|
|
217
|
+
`,await h`
|
|
218
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_session_questions_score ON mcq_session_questions(score DESC)
|
|
219
|
+
`,await h`
|
|
220
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_session_questions_language ON mcq_session_questions(language)
|
|
221
|
+
`,await h`
|
|
222
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_session_questions_deleted_at ON mcq_session_questions(deleted_at)
|
|
223
|
+
`,await h`
|
|
224
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_session_questions_is_public ON mcq_session_questions(is_public) WHERE deleted_at IS NULL
|
|
225
|
+
`,await h`
|
|
226
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_session_questions_created_at ON mcq_session_questions(created_at DESC)
|
|
227
|
+
`,await h`
|
|
228
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_session_questions_active ON mcq_session_questions(is_blocked, is_locked) WHERE deleted_at IS NULL AND is_blocked = false
|
|
229
|
+
`,await h`
|
|
230
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_session_questions_session_question ON mcq_session_questions(session_id, question_number)
|
|
231
|
+
`,await h`
|
|
232
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_session_questions_selected_choices_session_question_id ON mcq_session_questions_selected_choices(session_question_id)
|
|
233
|
+
`,await h`
|
|
234
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_session_questions_selected_choices_choice_id ON mcq_session_questions_selected_choices(choice_id)
|
|
235
|
+
`}async down(h){await h`DROP TABLE IF EXISTS mcq_session_questions_selected_choices CASCADE`,await h`DROP TABLE IF EXISTS mcq_session_questions CASCADE`,await h`DROP TYPE IF EXISTS answer_state CASCADE`}getVersion(){return"20251225180910453"}getDependencies(){return[z,A]}}D=v([T.migration()],D);import{decorator as U}from"@ooneex/migrations";class E{async up(h){await h`
|
|
236
|
+
CREATE TABLE IF NOT EXISTS mcq_questions_stats (
|
|
237
|
+
id VARCHAR(25) PRIMARY KEY,
|
|
238
|
+
question_id VARCHAR(25),
|
|
239
|
+
likes_count INT DEFAULT 0,
|
|
240
|
+
dislikes_count INT DEFAULT 0,
|
|
241
|
+
comments_count INT DEFAULT 0,
|
|
242
|
+
shares_count INT DEFAULT 0,
|
|
243
|
+
saves_count INT DEFAULT 0,
|
|
244
|
+
views_count INT DEFAULT 0,
|
|
245
|
+
reports_count INT DEFAULT 0,
|
|
246
|
+
is_locked BOOLEAN DEFAULT false,
|
|
247
|
+
locked_at TIMESTAMPTZ,
|
|
248
|
+
is_blocked BOOLEAN DEFAULT false,
|
|
249
|
+
blocked_at TIMESTAMPTZ,
|
|
250
|
+
block_reason TEXT,
|
|
251
|
+
is_public BOOLEAN DEFAULT true,
|
|
252
|
+
language VARCHAR(10),
|
|
253
|
+
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
254
|
+
updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
255
|
+
deleted_at TIMESTAMPTZ,
|
|
256
|
+
CONSTRAINT fk_mcq_questions_stats_question FOREIGN KEY (question_id) REFERENCES mcq_questions(id) ON DELETE CASCADE
|
|
257
|
+
)
|
|
258
|
+
`,await h`
|
|
259
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_stats_question_id ON mcq_questions_stats(question_id)
|
|
260
|
+
`,await h`
|
|
261
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_stats_likes_count ON mcq_questions_stats(likes_count DESC)
|
|
262
|
+
`,await h`
|
|
263
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_stats_views_count ON mcq_questions_stats(views_count DESC)
|
|
264
|
+
`,await h`
|
|
265
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_stats_language ON mcq_questions_stats(language)
|
|
266
|
+
`,await h`
|
|
267
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_stats_deleted_at ON mcq_questions_stats(deleted_at)
|
|
268
|
+
`,await h`
|
|
269
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_stats_is_public ON mcq_questions_stats(is_public) WHERE deleted_at IS NULL
|
|
270
|
+
`,await h`
|
|
271
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_stats_popular ON mcq_questions_stats(is_public, likes_count DESC, views_count DESC) WHERE deleted_at IS NULL
|
|
272
|
+
`,await h`
|
|
273
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_stats_created_at ON mcq_questions_stats(created_at DESC)
|
|
274
|
+
`,await h`
|
|
275
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_stats_active ON mcq_questions_stats(is_blocked, is_locked) WHERE deleted_at IS NULL AND is_blocked = false
|
|
276
|
+
`}async down(h){await h`DROP TABLE IF EXISTS mcq_questions_stats CASCADE`}getVersion(){return"20251225180910455"}getDependencies(){return[p]}}E=v([U.migration()],E);import{decorator as V}from"@ooneex/migrations";class F{async up(h){await h`
|
|
277
|
+
CREATE TABLE IF NOT EXISTS mcq_questions_comments (
|
|
278
|
+
id VARCHAR(25) PRIMARY KEY,
|
|
279
|
+
question_id VARCHAR(25),
|
|
280
|
+
comment TEXT NOT NULL,
|
|
281
|
+
commented_by VARCHAR(255),
|
|
282
|
+
commented_by_id VARCHAR(25),
|
|
283
|
+
parent_comment_id VARCHAR(25),
|
|
284
|
+
is_locked BOOLEAN DEFAULT false,
|
|
285
|
+
locked_at TIMESTAMPTZ,
|
|
286
|
+
is_blocked BOOLEAN DEFAULT false,
|
|
287
|
+
blocked_at TIMESTAMPTZ,
|
|
288
|
+
block_reason TEXT,
|
|
289
|
+
is_public BOOLEAN DEFAULT true,
|
|
290
|
+
language VARCHAR(10),
|
|
291
|
+
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
292
|
+
updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
293
|
+
deleted_at TIMESTAMPTZ,
|
|
294
|
+
CONSTRAINT fk_mcq_questions_comments_question FOREIGN KEY (question_id) REFERENCES mcq_questions(id) ON DELETE CASCADE
|
|
295
|
+
)
|
|
296
|
+
`,await h`
|
|
297
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_comments_question_id ON mcq_questions_comments(question_id)
|
|
298
|
+
`,await h`
|
|
299
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_comments_commented_by_id ON mcq_questions_comments(commented_by_id)
|
|
300
|
+
`,await h`
|
|
301
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_comments_parent_comment_id ON mcq_questions_comments(parent_comment_id)
|
|
302
|
+
`,await h`
|
|
303
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_comments_language ON mcq_questions_comments(language)
|
|
304
|
+
`,await h`
|
|
305
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_comments_deleted_at ON mcq_questions_comments(deleted_at)
|
|
306
|
+
`,await h`
|
|
307
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_comments_is_public ON mcq_questions_comments(is_public) WHERE deleted_at IS NULL
|
|
308
|
+
`,await h`
|
|
309
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_comments_created_at ON mcq_questions_comments(created_at DESC)
|
|
310
|
+
`,await h`
|
|
311
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_comments_active ON mcq_questions_comments(is_blocked, is_locked) WHERE deleted_at IS NULL AND is_blocked = false
|
|
312
|
+
`}async down(h){await h`DROP TABLE IF EXISTS mcq_questions_comments CASCADE`}getVersion(){return"20251225180910458"}getDependencies(){return[p]}}F=v([V.migration()],F);import{decorator as W}from"@ooneex/migrations";class G{async up(h){await h`
|
|
313
|
+
CREATE TABLE IF NOT EXISTS mcq_questions_liked (
|
|
314
|
+
id VARCHAR(25) PRIMARY KEY,
|
|
315
|
+
question_id VARCHAR(25),
|
|
316
|
+
liked_by VARCHAR(255),
|
|
317
|
+
liked_by_id VARCHAR(25),
|
|
318
|
+
is_locked BOOLEAN DEFAULT false,
|
|
319
|
+
locked_at TIMESTAMPTZ,
|
|
320
|
+
is_blocked BOOLEAN DEFAULT false,
|
|
321
|
+
blocked_at TIMESTAMPTZ,
|
|
322
|
+
block_reason TEXT,
|
|
323
|
+
is_public BOOLEAN DEFAULT true,
|
|
324
|
+
language VARCHAR(10),
|
|
325
|
+
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
326
|
+
updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
327
|
+
deleted_at TIMESTAMPTZ,
|
|
328
|
+
CONSTRAINT fk_mcq_questions_liked_question FOREIGN KEY (question_id) REFERENCES mcq_questions(id) ON DELETE CASCADE
|
|
329
|
+
)
|
|
330
|
+
`,await h`
|
|
331
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_liked_question_id ON mcq_questions_liked(question_id)
|
|
332
|
+
`,await h`
|
|
333
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_liked_liked_by_id ON mcq_questions_liked(liked_by_id)
|
|
334
|
+
`,await h`
|
|
335
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_liked_language ON mcq_questions_liked(language)
|
|
336
|
+
`,await h`
|
|
337
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_liked_deleted_at ON mcq_questions_liked(deleted_at)
|
|
338
|
+
`,await h`
|
|
339
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_liked_is_public ON mcq_questions_liked(is_public) WHERE deleted_at IS NULL
|
|
340
|
+
`,await h`
|
|
341
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_liked_created_at ON mcq_questions_liked(created_at DESC)
|
|
342
|
+
`,await h`
|
|
343
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_liked_active ON mcq_questions_liked(is_blocked, is_locked) WHERE deleted_at IS NULL AND is_blocked = false
|
|
344
|
+
`,await h`
|
|
345
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_mcq_questions_liked_unique ON mcq_questions_liked(question_id, liked_by_id) WHERE deleted_at IS NULL
|
|
346
|
+
`}async down(h){await h`DROP TABLE IF EXISTS mcq_questions_liked CASCADE`}getVersion(){return"20251225180910460"}getDependencies(){return[p]}}G=v([W.migration()],G);import{decorator as X}from"@ooneex/migrations";class H{async up(h){await h`
|
|
347
|
+
CREATE TABLE IF NOT EXISTS mcq_questions_disliked (
|
|
348
|
+
id VARCHAR(25) PRIMARY KEY,
|
|
349
|
+
question_id VARCHAR(25),
|
|
350
|
+
disliked_by VARCHAR(255),
|
|
351
|
+
disliked_by_id VARCHAR(25),
|
|
352
|
+
is_locked BOOLEAN DEFAULT false,
|
|
353
|
+
locked_at TIMESTAMPTZ,
|
|
354
|
+
is_blocked BOOLEAN DEFAULT false,
|
|
355
|
+
blocked_at TIMESTAMPTZ,
|
|
356
|
+
block_reason TEXT,
|
|
357
|
+
is_public BOOLEAN DEFAULT true,
|
|
358
|
+
language VARCHAR(10),
|
|
359
|
+
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
360
|
+
updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
361
|
+
deleted_at TIMESTAMPTZ,
|
|
362
|
+
CONSTRAINT fk_mcq_questions_disliked_question FOREIGN KEY (question_id) REFERENCES mcq_questions(id) ON DELETE CASCADE
|
|
363
|
+
)
|
|
364
|
+
`,await h`
|
|
365
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_disliked_question_id ON mcq_questions_disliked(question_id)
|
|
366
|
+
`,await h`
|
|
367
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_disliked_disliked_by_id ON mcq_questions_disliked(disliked_by_id)
|
|
368
|
+
`,await h`
|
|
369
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_disliked_language ON mcq_questions_disliked(language)
|
|
370
|
+
`,await h`
|
|
371
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_disliked_deleted_at ON mcq_questions_disliked(deleted_at)
|
|
372
|
+
`,await h`
|
|
373
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_disliked_is_public ON mcq_questions_disliked(is_public) WHERE deleted_at IS NULL
|
|
374
|
+
`,await h`
|
|
375
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_disliked_created_at ON mcq_questions_disliked(created_at DESC)
|
|
376
|
+
`,await h`
|
|
377
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_disliked_active ON mcq_questions_disliked(is_blocked, is_locked) WHERE deleted_at IS NULL AND is_blocked = false
|
|
378
|
+
`,await h`
|
|
379
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_mcq_questions_disliked_unique ON mcq_questions_disliked(question_id, disliked_by_id) WHERE deleted_at IS NULL
|
|
380
|
+
`}async down(h){await h`DROP TABLE IF EXISTS mcq_questions_disliked CASCADE`}getVersion(){return"20251225180910462"}getDependencies(){return[p]}}H=v([X.migration()],H);import{decorator as Y}from"@ooneex/migrations";class I{async up(h){await h`
|
|
381
|
+
CREATE TABLE IF NOT EXISTS mcq_questions_viewed (
|
|
382
|
+
id VARCHAR(25) PRIMARY KEY,
|
|
383
|
+
question_id VARCHAR(25),
|
|
384
|
+
viewed_by VARCHAR(255),
|
|
385
|
+
viewed_by_id VARCHAR(25),
|
|
386
|
+
is_locked BOOLEAN DEFAULT false,
|
|
387
|
+
locked_at TIMESTAMPTZ,
|
|
388
|
+
is_blocked BOOLEAN DEFAULT false,
|
|
389
|
+
blocked_at TIMESTAMPTZ,
|
|
390
|
+
block_reason TEXT,
|
|
391
|
+
is_public BOOLEAN DEFAULT true,
|
|
392
|
+
language VARCHAR(10),
|
|
393
|
+
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
394
|
+
updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
395
|
+
deleted_at TIMESTAMPTZ,
|
|
396
|
+
CONSTRAINT fk_mcq_questions_viewed_question FOREIGN KEY (question_id) REFERENCES mcq_questions(id) ON DELETE CASCADE
|
|
397
|
+
)
|
|
398
|
+
`,await h`
|
|
399
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_viewed_question_id ON mcq_questions_viewed(question_id)
|
|
400
|
+
`,await h`
|
|
401
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_viewed_viewed_by_id ON mcq_questions_viewed(viewed_by_id)
|
|
402
|
+
`,await h`
|
|
403
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_viewed_language ON mcq_questions_viewed(language)
|
|
404
|
+
`,await h`
|
|
405
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_viewed_deleted_at ON mcq_questions_viewed(deleted_at)
|
|
406
|
+
`,await h`
|
|
407
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_viewed_is_public ON mcq_questions_viewed(is_public) WHERE deleted_at IS NULL
|
|
408
|
+
`,await h`
|
|
409
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_viewed_created_at ON mcq_questions_viewed(created_at DESC)
|
|
410
|
+
`,await h`
|
|
411
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_viewed_active ON mcq_questions_viewed(is_blocked, is_locked) WHERE deleted_at IS NULL AND is_blocked = false
|
|
412
|
+
`}async down(h){await h`DROP TABLE IF EXISTS mcq_questions_viewed CASCADE`}getVersion(){return"20251225180910465"}getDependencies(){return[p]}}I=v([Y.migration()],I);import{decorator as Z}from"@ooneex/migrations";class J{async up(h){await h`
|
|
413
|
+
CREATE TABLE IF NOT EXISTS mcq_questions_saved (
|
|
414
|
+
id VARCHAR(25) PRIMARY KEY,
|
|
415
|
+
question_id VARCHAR(25),
|
|
416
|
+
saved_by VARCHAR(255),
|
|
417
|
+
saved_by_id VARCHAR(25),
|
|
418
|
+
is_locked BOOLEAN DEFAULT false,
|
|
419
|
+
locked_at TIMESTAMPTZ,
|
|
420
|
+
is_blocked BOOLEAN DEFAULT false,
|
|
421
|
+
blocked_at TIMESTAMPTZ,
|
|
422
|
+
block_reason TEXT,
|
|
423
|
+
is_public BOOLEAN DEFAULT true,
|
|
424
|
+
language VARCHAR(10),
|
|
425
|
+
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
426
|
+
updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
427
|
+
deleted_at TIMESTAMPTZ,
|
|
428
|
+
CONSTRAINT fk_mcq_questions_saved_question FOREIGN KEY (question_id) REFERENCES mcq_questions(id) ON DELETE CASCADE
|
|
429
|
+
)
|
|
430
|
+
`,await h`
|
|
431
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_saved_question_id ON mcq_questions_saved(question_id)
|
|
432
|
+
`,await h`
|
|
433
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_saved_saved_by_id ON mcq_questions_saved(saved_by_id)
|
|
434
|
+
`,await h`
|
|
435
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_saved_language ON mcq_questions_saved(language)
|
|
436
|
+
`,await h`
|
|
437
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_saved_deleted_at ON mcq_questions_saved(deleted_at)
|
|
438
|
+
`,await h`
|
|
439
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_saved_is_public ON mcq_questions_saved(is_public) WHERE deleted_at IS NULL
|
|
440
|
+
`,await h`
|
|
441
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_saved_created_at ON mcq_questions_saved(created_at DESC)
|
|
442
|
+
`,await h`
|
|
443
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_saved_active ON mcq_questions_saved(is_blocked, is_locked) WHERE deleted_at IS NULL AND is_blocked = false
|
|
444
|
+
`,await h`
|
|
445
|
+
CREATE UNIQUE INDEX IF NOT EXISTS idx_mcq_questions_saved_unique ON mcq_questions_saved(question_id, saved_by_id) WHERE deleted_at IS NULL
|
|
446
|
+
`}async down(h){await h`DROP TABLE IF EXISTS mcq_questions_saved CASCADE`}getVersion(){return"20251225180910467"}getDependencies(){return[p]}}J=v([Z.migration()],J);import{decorator as $}from"@ooneex/migrations";class K{async up(h){await h`
|
|
447
|
+
CREATE TABLE IF NOT EXISTS mcq_questions_shared (
|
|
448
|
+
id VARCHAR(25) PRIMARY KEY,
|
|
449
|
+
question_id VARCHAR(25),
|
|
450
|
+
shared_with VARCHAR(255),
|
|
451
|
+
shared_by_id VARCHAR(25),
|
|
452
|
+
permission VARCHAR(50),
|
|
453
|
+
expires_at TIMESTAMPTZ,
|
|
454
|
+
is_locked BOOLEAN DEFAULT false,
|
|
455
|
+
locked_at TIMESTAMPTZ,
|
|
456
|
+
is_blocked BOOLEAN DEFAULT false,
|
|
457
|
+
blocked_at TIMESTAMPTZ,
|
|
458
|
+
block_reason TEXT,
|
|
459
|
+
is_public BOOLEAN DEFAULT true,
|
|
460
|
+
language VARCHAR(10),
|
|
461
|
+
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
462
|
+
updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
463
|
+
deleted_at TIMESTAMPTZ,
|
|
464
|
+
CONSTRAINT fk_mcq_questions_shared_question FOREIGN KEY (question_id) REFERENCES mcq_questions(id) ON DELETE CASCADE
|
|
465
|
+
)
|
|
466
|
+
`,await h`
|
|
467
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_shared_question_id ON mcq_questions_shared(question_id)
|
|
468
|
+
`,await h`
|
|
469
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_shared_shared_by_id ON mcq_questions_shared(shared_by_id)
|
|
470
|
+
`,await h`
|
|
471
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_shared_expires_at ON mcq_questions_shared(expires_at)
|
|
472
|
+
`,await h`
|
|
473
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_shared_language ON mcq_questions_shared(language)
|
|
474
|
+
`,await h`
|
|
475
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_shared_deleted_at ON mcq_questions_shared(deleted_at)
|
|
476
|
+
`,await h`
|
|
477
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_shared_is_public ON mcq_questions_shared(is_public) WHERE deleted_at IS NULL
|
|
478
|
+
`,await h`
|
|
479
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_shared_created_at ON mcq_questions_shared(created_at DESC)
|
|
480
|
+
`,await h`
|
|
481
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_shared_active ON mcq_questions_shared(is_blocked, is_locked) WHERE deleted_at IS NULL AND is_blocked = false
|
|
482
|
+
`,await h`
|
|
483
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_shared_active_shares ON mcq_questions_shared(expires_at) WHERE deleted_at IS NULL AND (expires_at IS NULL OR expires_at > CURRENT_TIMESTAMP)
|
|
484
|
+
`}async down(h){await h`DROP TABLE IF EXISTS mcq_questions_shared CASCADE`}getVersion(){return"20251225180910469"}getDependencies(){return[p]}}K=v([$.migration()],K);import{decorator as j}from"@ooneex/migrations";class L{async up(h){await h`
|
|
485
|
+
CREATE TABLE IF NOT EXISTS mcq_questions_reports (
|
|
486
|
+
id VARCHAR(25) PRIMARY KEY,
|
|
487
|
+
question_id VARCHAR(25),
|
|
488
|
+
reason VARCHAR(255) NOT NULL,
|
|
489
|
+
description TEXT,
|
|
490
|
+
reported_by VARCHAR(255),
|
|
491
|
+
reported_by_id VARCHAR(25),
|
|
492
|
+
status_id VARCHAR(25),
|
|
493
|
+
is_locked BOOLEAN DEFAULT false,
|
|
494
|
+
locked_at TIMESTAMPTZ,
|
|
495
|
+
is_blocked BOOLEAN DEFAULT false,
|
|
496
|
+
blocked_at TIMESTAMPTZ,
|
|
497
|
+
block_reason TEXT,
|
|
498
|
+
is_public BOOLEAN DEFAULT true,
|
|
499
|
+
language VARCHAR(10),
|
|
500
|
+
created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
501
|
+
updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,
|
|
502
|
+
deleted_at TIMESTAMPTZ,
|
|
503
|
+
CONSTRAINT fk_mcq_questions_reports_question FOREIGN KEY (question_id) REFERENCES mcq_questions(id) ON DELETE CASCADE,
|
|
504
|
+
CONSTRAINT fk_mcq_questions_reports_status FOREIGN KEY (status_id) REFERENCES statuses(id) ON DELETE SET NULL
|
|
505
|
+
)
|
|
506
|
+
`,await h`
|
|
507
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_reports_question_id ON mcq_questions_reports(question_id)
|
|
508
|
+
`,await h`
|
|
509
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_reports_reported_by_id ON mcq_questions_reports(reported_by_id)
|
|
510
|
+
`,await h`
|
|
511
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_reports_status_id ON mcq_questions_reports(status_id)
|
|
512
|
+
`,await h`
|
|
513
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_reports_reason ON mcq_questions_reports(reason)
|
|
514
|
+
`,await h`
|
|
515
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_reports_language ON mcq_questions_reports(language)
|
|
516
|
+
`,await h`
|
|
517
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_reports_deleted_at ON mcq_questions_reports(deleted_at)
|
|
518
|
+
`,await h`
|
|
519
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_reports_is_public ON mcq_questions_reports(is_public) WHERE deleted_at IS NULL
|
|
520
|
+
`,await h`
|
|
521
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_reports_created_at ON mcq_questions_reports(created_at DESC)
|
|
522
|
+
`,await h`
|
|
523
|
+
CREATE INDEX IF NOT EXISTS idx_mcq_questions_reports_active ON mcq_questions_reports(is_blocked, is_locked) WHERE deleted_at IS NULL AND is_blocked = false
|
|
524
|
+
`}async down(h){await h`DROP TABLE IF EXISTS mcq_questions_reports CASCADE`}getVersion(){return"20251225180910472"}getDependencies(){return[p,B]}}L=v([j.migration()],L);export{L as Migration20251225180910472,K as Migration20251225180910469,J as Migration20251225180910467,I as Migration20251225180910465,H as Migration20251225180910462,G as Migration20251225180910460,F as Migration20251225180910458,E as Migration20251225180910455,D as Migration20251225180910453,A as Migration20251225180910451,z as Migration20251225180910449,p as Migration20251225180910446};
|
|
525
|
+
|
|
526
|
+
//# debugId=E6812AD6347C7FA564756E2164756E21
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["src/migrations/gamification/mcq/Migration20251225180910446.ts", "src/migrations/gamification/mcq/Migration20251225180910449.ts", "src/migrations/gamification/mcq/Migration20251225180910451.ts", "src/migrations/gamification/mcq/Migration20251225180910453.ts", "src/migrations/gamification/mcq/Migration20251225180910455.ts", "src/migrations/gamification/mcq/Migration20251225180910458.ts", "src/migrations/gamification/mcq/Migration20251225180910460.ts", "src/migrations/gamification/mcq/Migration20251225180910462.ts", "src/migrations/gamification/mcq/Migration20251225180910465.ts", "src/migrations/gamification/mcq/Migration20251225180910467.ts", "src/migrations/gamification/mcq/Migration20251225180910469.ts", "src/migrations/gamification/mcq/Migration20251225180910472.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { decorator, type IMigration, type MigrationClassType } from \"@ooneex/migrations\";\nimport type { TransactionSQL } from \"bun\";\nimport { Migration20251225173350644 } from \"../../common/Migration20251225173350644\";\nimport { Migration20251225173351645 } from \"../../common/Migration20251225173351645\";\n\n@decorator.migration()\nexport class Migration20251225180910446 implements IMigration {\n public async up(tx: TransactionSQL): Promise<void> {\n await tx`\n CREATE TABLE IF NOT EXISTS mcq_questions (\n id VARCHAR(25) PRIMARY KEY,\n question_number INT NOT NULL,\n text TEXT NOT NULL,\n context VARCHAR(255),\n context_id VARCHAR(25),\n stat_id VARCHAR(25),\n status_id VARCHAR(25),\n image_id VARCHAR(25),\n is_locked BOOLEAN DEFAULT false,\n locked_at TIMESTAMPTZ,\n is_blocked BOOLEAN DEFAULT false,\n blocked_at TIMESTAMPTZ,\n block_reason TEXT,\n is_public BOOLEAN DEFAULT true,\n language VARCHAR(10),\n created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,\n updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,\n deleted_at TIMESTAMPTZ,\n CONSTRAINT fk_mcq_questions_status FOREIGN KEY (status_id) REFERENCES statuses(id) ON DELETE SET NULL\n )\n `;\n\n await tx`\n CREATE TABLE IF NOT EXISTS mcq_questions_tags (\n question_id VARCHAR(25) NOT NULL,\n tag_id VARCHAR(25) NOT NULL,\n PRIMARY KEY (question_id, tag_id),\n CONSTRAINT fk_mcq_questions_tags_question FOREIGN KEY (question_id) REFERENCES mcq_questions(id) ON DELETE CASCADE,\n CONSTRAINT fk_mcq_questions_tags_tag FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE\n )\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_question_number ON mcq_questions(question_number)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_context ON mcq_questions(context, context_id)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_stat_id ON mcq_questions(stat_id)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_status_id ON mcq_questions(status_id)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_image_id ON mcq_questions(image_id)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_language ON mcq_questions(language)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_deleted_at ON mcq_questions(deleted_at)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_is_public ON mcq_questions(is_public) WHERE deleted_at IS NULL\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_created_at ON mcq_questions(created_at DESC)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_updated_at ON mcq_questions(updated_at DESC)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_active ON mcq_questions(is_blocked, is_locked) WHERE deleted_at IS NULL AND is_blocked = false\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_tags_question_id ON mcq_questions_tags(question_id)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_tags_tag_id ON mcq_questions_tags(tag_id)\n `;\n }\n\n public async down(tx: TransactionSQL): Promise<void> {\n await tx`DROP TABLE IF EXISTS mcq_questions_tags CASCADE`;\n await tx`DROP TABLE IF EXISTS mcq_questions CASCADE`;\n }\n\n public getVersion(): string {\n return \"20251225180910446\";\n }\n\n public getDependencies(): MigrationClassType[] {\n return [\n Migration20251225173350644, // Statuses table (for status_id foreign key)\n Migration20251225173351645, // Tags table (for mcq_questions_tags junction table)\n ];\n }\n}\n",
|
|
6
|
+
"import { decorator, type IMigration, type MigrationClassType } from \"@ooneex/migrations\";\nimport type { TransactionSQL } from \"bun\";\nimport { Migration20251225180910446 } from \"./Migration20251225180910446\";\n\n@decorator.migration()\nexport class Migration20251225180910449 implements IMigration {\n public async up(tx: TransactionSQL): Promise<void> {\n await tx`\n CREATE TYPE mcq_choice_letter AS ENUM ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J')\n `;\n\n await tx`\n CREATE TABLE IF NOT EXISTS mcq_question_choices (\n id VARCHAR(25) PRIMARY KEY,\n letter mcq_choice_letter NOT NULL,\n text TEXT NOT NULL,\n is_correct BOOLEAN DEFAULT false,\n explanation TEXT,\n question_id VARCHAR(25) NOT NULL,\n is_locked BOOLEAN DEFAULT false,\n locked_at TIMESTAMPTZ,\n is_blocked BOOLEAN DEFAULT false,\n blocked_at TIMESTAMPTZ,\n block_reason TEXT,\n is_public BOOLEAN DEFAULT true,\n language VARCHAR(10),\n created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,\n updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,\n deleted_at TIMESTAMPTZ,\n CONSTRAINT fk_mcq_question_choices_question FOREIGN KEY (question_id) REFERENCES mcq_questions(id) ON DELETE CASCADE\n )\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_question_choices_question_id ON mcq_question_choices(question_id)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_question_choices_letter ON mcq_question_choices(letter)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_question_choices_is_correct ON mcq_question_choices(is_correct)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_question_choices_language ON mcq_question_choices(language)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_question_choices_deleted_at ON mcq_question_choices(deleted_at)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_question_choices_is_public ON mcq_question_choices(is_public) WHERE deleted_at IS NULL\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_question_choices_created_at ON mcq_question_choices(created_at DESC)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_question_choices_active ON mcq_question_choices(is_blocked, is_locked) WHERE deleted_at IS NULL AND is_blocked = false\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_question_choices_question_letter ON mcq_question_choices(question_id, letter)\n `;\n }\n\n public async down(tx: TransactionSQL): Promise<void> {\n await tx`DROP TABLE IF EXISTS mcq_question_choices CASCADE`;\n await tx`DROP TYPE IF EXISTS mcq_choice_letter CASCADE`;\n }\n\n public getVersion(): string {\n return \"20251225180910449\";\n }\n\n public getDependencies(): MigrationClassType[] {\n return [\n Migration20251225180910446, // MCQ questions table (for question_id foreign key)\n ];\n }\n}\n",
|
|
7
|
+
"import { decorator, type IMigration, type MigrationClassType } from \"@ooneex/migrations\";\nimport type { TransactionSQL } from \"bun\";\nimport { Migration20251225180910444 } from \"../Migration20251225180910444\";\nimport { Migration20251225180910446 } from \"./Migration20251225180910446\";\n\n@decorator.migration()\nexport class Migration20251225180910451 implements IMigration {\n public async up(tx: TransactionSQL): Promise<void> {\n await tx`\n CREATE TYPE mcq_session_status AS ENUM ('DRAFT', 'IN_PROGRESS', 'PAUSED', 'COMPLETED', 'CANCELLED')\n `;\n\n await tx`\n CREATE TYPE session_type AS ENUM (\n 'TRAINING', 'PRACTICE', 'SIMULATION', 'QUIZ',\n 'CHALLENGE', 'TOURNAMENT', 'REVIEW', 'DIAGNOSTIC', 'SPEED_TEST'\n )\n `;\n\n await tx`\n CREATE TABLE IF NOT EXISTS mcq_sessions (\n id VARCHAR(25) PRIMARY KEY,\n name VARCHAR(500) NOT NULL,\n total_questions INT DEFAULT 0,\n answered_count INT DEFAULT 0,\n correct_count INT DEFAULT 0,\n incorrect_count INT DEFAULT 0,\n timing INT DEFAULT 0,\n status mcq_session_status DEFAULT 'DRAFT',\n score DECIMAL(5, 2) DEFAULT 0,\n started_at TIMESTAMPTZ,\n paused_at TIMESTAMPTZ,\n resumed_at TIMESTAMPTZ,\n completed_at TIMESTAMPTZ,\n type session_type NOT NULL,\n level_id VARCHAR(25) NOT NULL,\n is_locked BOOLEAN DEFAULT false,\n locked_at TIMESTAMPTZ,\n is_blocked BOOLEAN DEFAULT false,\n blocked_at TIMESTAMPTZ,\n block_reason TEXT,\n is_public BOOLEAN DEFAULT true,\n language VARCHAR(10),\n created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,\n updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,\n deleted_at TIMESTAMPTZ,\n CONSTRAINT fk_mcq_sessions_level FOREIGN KEY (level_id) REFERENCES levels(id) ON DELETE RESTRICT\n )\n `;\n\n await tx`\n CREATE TABLE IF NOT EXISTS mcq_sessions_questions (\n session_id VARCHAR(25) NOT NULL,\n question_id VARCHAR(25) NOT NULL,\n PRIMARY KEY (session_id, question_id),\n CONSTRAINT fk_mcq_sessions_questions_session FOREIGN KEY (session_id) REFERENCES mcq_sessions(id) ON DELETE CASCADE,\n CONSTRAINT fk_mcq_sessions_questions_question FOREIGN KEY (question_id) REFERENCES mcq_questions(id) ON DELETE CASCADE\n )\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_sessions_name ON mcq_sessions(name)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_sessions_status ON mcq_sessions(status)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_sessions_type ON mcq_sessions(type)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_sessions_level_id ON mcq_sessions(level_id)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_sessions_score ON mcq_sessions(score DESC)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_sessions_started_at ON mcq_sessions(started_at DESC)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_sessions_completed_at ON mcq_sessions(completed_at DESC)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_sessions_language ON mcq_sessions(language)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_sessions_deleted_at ON mcq_sessions(deleted_at)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_sessions_is_public ON mcq_sessions(is_public) WHERE deleted_at IS NULL\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_sessions_created_at ON mcq_sessions(created_at DESC)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_sessions_updated_at ON mcq_sessions(updated_at DESC)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_sessions_active ON mcq_sessions(is_blocked, is_locked) WHERE deleted_at IS NULL AND is_blocked = false\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_sessions_performance ON mcq_sessions(type, score DESC, completed_at DESC) WHERE status = 'COMPLETED' AND deleted_at IS NULL\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_sessions_questions_session_id ON mcq_sessions_questions(session_id)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_sessions_questions_question_id ON mcq_sessions_questions(question_id)\n `;\n }\n\n public async down(tx: TransactionSQL): Promise<void> {\n await tx`DROP TABLE IF EXISTS mcq_sessions_questions CASCADE`;\n await tx`DROP TABLE IF EXISTS mcq_sessions CASCADE`;\n await tx`DROP TYPE IF EXISTS session_type CASCADE`;\n await tx`DROP TYPE IF EXISTS mcq_session_status CASCADE`;\n }\n\n public getVersion(): string {\n return \"20251225180910451\";\n }\n\n public getDependencies(): MigrationClassType[] {\n return [\n Migration20251225180910444, // Levels table (for level_id foreign key)\n Migration20251225180910446, // MCQ questions table (for mcq_sessions_questions junction table)\n ];\n }\n}\n",
|
|
8
|
+
"import { decorator, type IMigration, type MigrationClassType } from \"@ooneex/migrations\";\nimport type { TransactionSQL } from \"bun\";\nimport { Migration20251225180910449 } from \"./Migration20251225180910449\";\nimport { Migration20251225180910451 } from \"./Migration20251225180910451\";\n\n@decorator.migration()\nexport class Migration20251225180910453 implements IMigration {\n public async up(tx: TransactionSQL): Promise<void> {\n await tx`\n CREATE TYPE answer_state AS ENUM ('UNANSWERED', 'CORRECT', 'INCORRECT', 'PARTIAL', 'SKIPPED')\n `;\n\n await tx`\n CREATE TABLE IF NOT EXISTS mcq_session_questions (\n id VARCHAR(25) PRIMARY KEY,\n session_id VARCHAR(25) NOT NULL,\n question_id VARCHAR(25) NOT NULL,\n question_number INT NOT NULL,\n context VARCHAR(255),\n context_id VARCHAR(25),\n state answer_state NOT NULL,\n score DECIMAL(5, 2) DEFAULT 0,\n is_locked BOOLEAN DEFAULT false,\n locked_at TIMESTAMPTZ,\n is_blocked BOOLEAN DEFAULT false,\n blocked_at TIMESTAMPTZ,\n block_reason TEXT,\n is_public BOOLEAN DEFAULT true,\n language VARCHAR(10),\n created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,\n updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,\n deleted_at TIMESTAMPTZ,\n CONSTRAINT fk_mcq_session_questions_session FOREIGN KEY (session_id) REFERENCES mcq_sessions(id) ON DELETE CASCADE,\n CONSTRAINT fk_mcq_session_questions_question FOREIGN KEY (question_id) REFERENCES mcq_questions(id) ON DELETE RESTRICT\n )\n `;\n\n await tx`\n CREATE TABLE IF NOT EXISTS mcq_session_questions_selected_choices (\n session_question_id VARCHAR(25) NOT NULL,\n choice_id VARCHAR(25) NOT NULL,\n PRIMARY KEY (session_question_id, choice_id),\n CONSTRAINT fk_mcq_session_questions_selected_choices_session_question FOREIGN KEY (session_question_id) REFERENCES mcq_session_questions(id) ON DELETE CASCADE,\n CONSTRAINT fk_mcq_session_questions_selected_choices_choice FOREIGN KEY (choice_id) REFERENCES mcq_question_choices(id) ON DELETE CASCADE\n )\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_session_questions_session_id ON mcq_session_questions(session_id)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_session_questions_question_id ON mcq_session_questions(question_id)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_session_questions_question_number ON mcq_session_questions(question_number)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_session_questions_state ON mcq_session_questions(state)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_session_questions_context ON mcq_session_questions(context, context_id)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_session_questions_score ON mcq_session_questions(score DESC)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_session_questions_language ON mcq_session_questions(language)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_session_questions_deleted_at ON mcq_session_questions(deleted_at)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_session_questions_is_public ON mcq_session_questions(is_public) WHERE deleted_at IS NULL\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_session_questions_created_at ON mcq_session_questions(created_at DESC)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_session_questions_active ON mcq_session_questions(is_blocked, is_locked) WHERE deleted_at IS NULL AND is_blocked = false\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_session_questions_session_question ON mcq_session_questions(session_id, question_number)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_session_questions_selected_choices_session_question_id ON mcq_session_questions_selected_choices(session_question_id)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_session_questions_selected_choices_choice_id ON mcq_session_questions_selected_choices(choice_id)\n `;\n }\n\n public async down(tx: TransactionSQL): Promise<void> {\n await tx`DROP TABLE IF EXISTS mcq_session_questions_selected_choices CASCADE`;\n await tx`DROP TABLE IF EXISTS mcq_session_questions CASCADE`;\n await tx`DROP TYPE IF EXISTS answer_state CASCADE`;\n }\n\n public getVersion(): string {\n return \"20251225180910453\";\n }\n\n public getDependencies(): MigrationClassType[] {\n return [\n Migration20251225180910449, // MCQ question choices table (for mcq_session_questions_selected_choices junction table)\n Migration20251225180910451, // MCQ sessions table (for session_id foreign key)\n ];\n }\n}\n",
|
|
9
|
+
"import { decorator, type IMigration, type MigrationClassType } from \"@ooneex/migrations\";\nimport type { TransactionSQL } from \"bun\";\nimport { Migration20251225180910446 } from \"./Migration20251225180910446\";\n\n@decorator.migration()\nexport class Migration20251225180910455 implements IMigration {\n public async up(tx: TransactionSQL): Promise<void> {\n await tx`\n CREATE TABLE IF NOT EXISTS mcq_questions_stats (\n id VARCHAR(25) PRIMARY KEY,\n question_id VARCHAR(25),\n likes_count INT DEFAULT 0,\n dislikes_count INT DEFAULT 0,\n comments_count INT DEFAULT 0,\n shares_count INT DEFAULT 0,\n saves_count INT DEFAULT 0,\n views_count INT DEFAULT 0,\n reports_count INT DEFAULT 0,\n is_locked BOOLEAN DEFAULT false,\n locked_at TIMESTAMPTZ,\n is_blocked BOOLEAN DEFAULT false,\n blocked_at TIMESTAMPTZ,\n block_reason TEXT,\n is_public BOOLEAN DEFAULT true,\n language VARCHAR(10),\n created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,\n updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,\n deleted_at TIMESTAMPTZ,\n CONSTRAINT fk_mcq_questions_stats_question FOREIGN KEY (question_id) REFERENCES mcq_questions(id) ON DELETE CASCADE\n )\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_stats_question_id ON mcq_questions_stats(question_id)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_stats_likes_count ON mcq_questions_stats(likes_count DESC)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_stats_views_count ON mcq_questions_stats(views_count DESC)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_stats_language ON mcq_questions_stats(language)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_stats_deleted_at ON mcq_questions_stats(deleted_at)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_stats_is_public ON mcq_questions_stats(is_public) WHERE deleted_at IS NULL\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_stats_popular ON mcq_questions_stats(is_public, likes_count DESC, views_count DESC) WHERE deleted_at IS NULL\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_stats_created_at ON mcq_questions_stats(created_at DESC)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_stats_active ON mcq_questions_stats(is_blocked, is_locked) WHERE deleted_at IS NULL AND is_blocked = false\n `;\n }\n\n public async down(tx: TransactionSQL): Promise<void> {\n await tx`DROP TABLE IF EXISTS mcq_questions_stats CASCADE`;\n }\n\n public getVersion(): string {\n return \"20251225180910455\";\n }\n\n public getDependencies(): MigrationClassType[] {\n return [\n Migration20251225180910446, // MCQ questions table (for question_id foreign key)\n ];\n }\n}\n",
|
|
10
|
+
"import { decorator, type IMigration, type MigrationClassType } from \"@ooneex/migrations\";\nimport type { TransactionSQL } from \"bun\";\nimport { Migration20251225180910446 } from \"./Migration20251225180910446\";\n\n@decorator.migration()\nexport class Migration20251225180910458 implements IMigration {\n public async up(tx: TransactionSQL): Promise<void> {\n await tx`\n CREATE TABLE IF NOT EXISTS mcq_questions_comments (\n id VARCHAR(25) PRIMARY KEY,\n question_id VARCHAR(25),\n comment TEXT NOT NULL,\n commented_by VARCHAR(255),\n commented_by_id VARCHAR(25),\n parent_comment_id VARCHAR(25),\n is_locked BOOLEAN DEFAULT false,\n locked_at TIMESTAMPTZ,\n is_blocked BOOLEAN DEFAULT false,\n blocked_at TIMESTAMPTZ,\n block_reason TEXT,\n is_public BOOLEAN DEFAULT true,\n language VARCHAR(10),\n created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,\n updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,\n deleted_at TIMESTAMPTZ,\n CONSTRAINT fk_mcq_questions_comments_question FOREIGN KEY (question_id) REFERENCES mcq_questions(id) ON DELETE CASCADE\n )\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_comments_question_id ON mcq_questions_comments(question_id)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_comments_commented_by_id ON mcq_questions_comments(commented_by_id)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_comments_parent_comment_id ON mcq_questions_comments(parent_comment_id)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_comments_language ON mcq_questions_comments(language)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_comments_deleted_at ON mcq_questions_comments(deleted_at)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_comments_is_public ON mcq_questions_comments(is_public) WHERE deleted_at IS NULL\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_comments_created_at ON mcq_questions_comments(created_at DESC)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_comments_active ON mcq_questions_comments(is_blocked, is_locked) WHERE deleted_at IS NULL AND is_blocked = false\n `;\n }\n\n public async down(tx: TransactionSQL): Promise<void> {\n await tx`DROP TABLE IF EXISTS mcq_questions_comments CASCADE`;\n }\n\n public getVersion(): string {\n return \"20251225180910458\";\n }\n\n public getDependencies(): MigrationClassType[] {\n return [\n Migration20251225180910446, // MCQ questions table (for question_id foreign key)\n ];\n }\n}\n",
|
|
11
|
+
"import { decorator, type IMigration, type MigrationClassType } from \"@ooneex/migrations\";\nimport type { TransactionSQL } from \"bun\";\nimport { Migration20251225180910446 } from \"./Migration20251225180910446\";\n\n@decorator.migration()\nexport class Migration20251225180910460 implements IMigration {\n public async up(tx: TransactionSQL): Promise<void> {\n await tx`\n CREATE TABLE IF NOT EXISTS mcq_questions_liked (\n id VARCHAR(25) PRIMARY KEY,\n question_id VARCHAR(25),\n liked_by VARCHAR(255),\n liked_by_id VARCHAR(25),\n is_locked BOOLEAN DEFAULT false,\n locked_at TIMESTAMPTZ,\n is_blocked BOOLEAN DEFAULT false,\n blocked_at TIMESTAMPTZ,\n block_reason TEXT,\n is_public BOOLEAN DEFAULT true,\n language VARCHAR(10),\n created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,\n updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,\n deleted_at TIMESTAMPTZ,\n CONSTRAINT fk_mcq_questions_liked_question FOREIGN KEY (question_id) REFERENCES mcq_questions(id) ON DELETE CASCADE\n )\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_liked_question_id ON mcq_questions_liked(question_id)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_liked_liked_by_id ON mcq_questions_liked(liked_by_id)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_liked_language ON mcq_questions_liked(language)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_liked_deleted_at ON mcq_questions_liked(deleted_at)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_liked_is_public ON mcq_questions_liked(is_public) WHERE deleted_at IS NULL\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_liked_created_at ON mcq_questions_liked(created_at DESC)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_liked_active ON mcq_questions_liked(is_blocked, is_locked) WHERE deleted_at IS NULL AND is_blocked = false\n `;\n\n await tx`\n CREATE UNIQUE INDEX IF NOT EXISTS idx_mcq_questions_liked_unique ON mcq_questions_liked(question_id, liked_by_id) WHERE deleted_at IS NULL\n `;\n }\n\n public async down(tx: TransactionSQL): Promise<void> {\n await tx`DROP TABLE IF EXISTS mcq_questions_liked CASCADE`;\n }\n\n public getVersion(): string {\n return \"20251225180910460\";\n }\n\n public getDependencies(): MigrationClassType[] {\n return [\n Migration20251225180910446, // MCQ questions table (for question_id foreign key)\n ];\n }\n}\n",
|
|
12
|
+
"import { decorator, type IMigration, type MigrationClassType } from \"@ooneex/migrations\";\nimport type { TransactionSQL } from \"bun\";\nimport { Migration20251225180910446 } from \"./Migration20251225180910446\";\n\n@decorator.migration()\nexport class Migration20251225180910462 implements IMigration {\n public async up(tx: TransactionSQL): Promise<void> {\n await tx`\n CREATE TABLE IF NOT EXISTS mcq_questions_disliked (\n id VARCHAR(25) PRIMARY KEY,\n question_id VARCHAR(25),\n disliked_by VARCHAR(255),\n disliked_by_id VARCHAR(25),\n is_locked BOOLEAN DEFAULT false,\n locked_at TIMESTAMPTZ,\n is_blocked BOOLEAN DEFAULT false,\n blocked_at TIMESTAMPTZ,\n block_reason TEXT,\n is_public BOOLEAN DEFAULT true,\n language VARCHAR(10),\n created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,\n updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,\n deleted_at TIMESTAMPTZ,\n CONSTRAINT fk_mcq_questions_disliked_question FOREIGN KEY (question_id) REFERENCES mcq_questions(id) ON DELETE CASCADE\n )\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_disliked_question_id ON mcq_questions_disliked(question_id)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_disliked_disliked_by_id ON mcq_questions_disliked(disliked_by_id)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_disliked_language ON mcq_questions_disliked(language)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_disliked_deleted_at ON mcq_questions_disliked(deleted_at)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_disliked_is_public ON mcq_questions_disliked(is_public) WHERE deleted_at IS NULL\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_disliked_created_at ON mcq_questions_disliked(created_at DESC)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_disliked_active ON mcq_questions_disliked(is_blocked, is_locked) WHERE deleted_at IS NULL AND is_blocked = false\n `;\n\n await tx`\n CREATE UNIQUE INDEX IF NOT EXISTS idx_mcq_questions_disliked_unique ON mcq_questions_disliked(question_id, disliked_by_id) WHERE deleted_at IS NULL\n `;\n }\n\n public async down(tx: TransactionSQL): Promise<void> {\n await tx`DROP TABLE IF EXISTS mcq_questions_disliked CASCADE`;\n }\n\n public getVersion(): string {\n return \"20251225180910462\";\n }\n\n public getDependencies(): MigrationClassType[] {\n return [\n Migration20251225180910446, // MCQ questions table (for question_id foreign key)\n ];\n }\n}\n",
|
|
13
|
+
"import { decorator, type IMigration, type MigrationClassType } from \"@ooneex/migrations\";\nimport type { TransactionSQL } from \"bun\";\nimport { Migration20251225180910446 } from \"./Migration20251225180910446\";\n\n@decorator.migration()\nexport class Migration20251225180910465 implements IMigration {\n public async up(tx: TransactionSQL): Promise<void> {\n await tx`\n CREATE TABLE IF NOT EXISTS mcq_questions_viewed (\n id VARCHAR(25) PRIMARY KEY,\n question_id VARCHAR(25),\n viewed_by VARCHAR(255),\n viewed_by_id VARCHAR(25),\n is_locked BOOLEAN DEFAULT false,\n locked_at TIMESTAMPTZ,\n is_blocked BOOLEAN DEFAULT false,\n blocked_at TIMESTAMPTZ,\n block_reason TEXT,\n is_public BOOLEAN DEFAULT true,\n language VARCHAR(10),\n created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,\n updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,\n deleted_at TIMESTAMPTZ,\n CONSTRAINT fk_mcq_questions_viewed_question FOREIGN KEY (question_id) REFERENCES mcq_questions(id) ON DELETE CASCADE\n )\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_viewed_question_id ON mcq_questions_viewed(question_id)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_viewed_viewed_by_id ON mcq_questions_viewed(viewed_by_id)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_viewed_language ON mcq_questions_viewed(language)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_viewed_deleted_at ON mcq_questions_viewed(deleted_at)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_viewed_is_public ON mcq_questions_viewed(is_public) WHERE deleted_at IS NULL\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_viewed_created_at ON mcq_questions_viewed(created_at DESC)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_viewed_active ON mcq_questions_viewed(is_blocked, is_locked) WHERE deleted_at IS NULL AND is_blocked = false\n `;\n }\n\n public async down(tx: TransactionSQL): Promise<void> {\n await tx`DROP TABLE IF EXISTS mcq_questions_viewed CASCADE`;\n }\n\n public getVersion(): string {\n return \"20251225180910465\";\n }\n\n public getDependencies(): MigrationClassType[] {\n return [\n Migration20251225180910446, // MCQ questions table (for question_id foreign key)\n ];\n }\n}\n",
|
|
14
|
+
"import { decorator, type IMigration, type MigrationClassType } from \"@ooneex/migrations\";\nimport type { TransactionSQL } from \"bun\";\nimport { Migration20251225180910446 } from \"./Migration20251225180910446\";\n\n@decorator.migration()\nexport class Migration20251225180910467 implements IMigration {\n public async up(tx: TransactionSQL): Promise<void> {\n await tx`\n CREATE TABLE IF NOT EXISTS mcq_questions_saved (\n id VARCHAR(25) PRIMARY KEY,\n question_id VARCHAR(25),\n saved_by VARCHAR(255),\n saved_by_id VARCHAR(25),\n is_locked BOOLEAN DEFAULT false,\n locked_at TIMESTAMPTZ,\n is_blocked BOOLEAN DEFAULT false,\n blocked_at TIMESTAMPTZ,\n block_reason TEXT,\n is_public BOOLEAN DEFAULT true,\n language VARCHAR(10),\n created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,\n updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,\n deleted_at TIMESTAMPTZ,\n CONSTRAINT fk_mcq_questions_saved_question FOREIGN KEY (question_id) REFERENCES mcq_questions(id) ON DELETE CASCADE\n )\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_saved_question_id ON mcq_questions_saved(question_id)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_saved_saved_by_id ON mcq_questions_saved(saved_by_id)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_saved_language ON mcq_questions_saved(language)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_saved_deleted_at ON mcq_questions_saved(deleted_at)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_saved_is_public ON mcq_questions_saved(is_public) WHERE deleted_at IS NULL\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_saved_created_at ON mcq_questions_saved(created_at DESC)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_saved_active ON mcq_questions_saved(is_blocked, is_locked) WHERE deleted_at IS NULL AND is_blocked = false\n `;\n\n await tx`\n CREATE UNIQUE INDEX IF NOT EXISTS idx_mcq_questions_saved_unique ON mcq_questions_saved(question_id, saved_by_id) WHERE deleted_at IS NULL\n `;\n }\n\n public async down(tx: TransactionSQL): Promise<void> {\n await tx`DROP TABLE IF EXISTS mcq_questions_saved CASCADE`;\n }\n\n public getVersion(): string {\n return \"20251225180910467\";\n }\n\n public getDependencies(): MigrationClassType[] {\n return [\n Migration20251225180910446, // MCQ questions table (for question_id foreign key)\n ];\n }\n}\n",
|
|
15
|
+
"import { decorator, type IMigration, type MigrationClassType } from \"@ooneex/migrations\";\nimport type { TransactionSQL } from \"bun\";\nimport { Migration20251225180910446 } from \"./Migration20251225180910446\";\n\n@decorator.migration()\nexport class Migration20251225180910469 implements IMigration {\n public async up(tx: TransactionSQL): Promise<void> {\n await tx`\n CREATE TABLE IF NOT EXISTS mcq_questions_shared (\n id VARCHAR(25) PRIMARY KEY,\n question_id VARCHAR(25),\n shared_with VARCHAR(255),\n shared_by_id VARCHAR(25),\n permission VARCHAR(50),\n expires_at TIMESTAMPTZ,\n is_locked BOOLEAN DEFAULT false,\n locked_at TIMESTAMPTZ,\n is_blocked BOOLEAN DEFAULT false,\n blocked_at TIMESTAMPTZ,\n block_reason TEXT,\n is_public BOOLEAN DEFAULT true,\n language VARCHAR(10),\n created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,\n updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,\n deleted_at TIMESTAMPTZ,\n CONSTRAINT fk_mcq_questions_shared_question FOREIGN KEY (question_id) REFERENCES mcq_questions(id) ON DELETE CASCADE\n )\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_shared_question_id ON mcq_questions_shared(question_id)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_shared_shared_by_id ON mcq_questions_shared(shared_by_id)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_shared_expires_at ON mcq_questions_shared(expires_at)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_shared_language ON mcq_questions_shared(language)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_shared_deleted_at ON mcq_questions_shared(deleted_at)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_shared_is_public ON mcq_questions_shared(is_public) WHERE deleted_at IS NULL\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_shared_created_at ON mcq_questions_shared(created_at DESC)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_shared_active ON mcq_questions_shared(is_blocked, is_locked) WHERE deleted_at IS NULL AND is_blocked = false\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_shared_active_shares ON mcq_questions_shared(expires_at) WHERE deleted_at IS NULL AND (expires_at IS NULL OR expires_at > CURRENT_TIMESTAMP)\n `;\n }\n\n public async down(tx: TransactionSQL): Promise<void> {\n await tx`DROP TABLE IF EXISTS mcq_questions_shared CASCADE`;\n }\n\n public getVersion(): string {\n return \"20251225180910469\";\n }\n\n public getDependencies(): MigrationClassType[] {\n return [\n Migration20251225180910446, // MCQ questions table (for question_id foreign key)\n ];\n }\n}\n",
|
|
16
|
+
"import { decorator, type IMigration, type MigrationClassType } from \"@ooneex/migrations\";\nimport type { TransactionSQL } from \"bun\";\nimport { Migration20251225173350644 } from \"../../common/Migration20251225173350644\";\nimport { Migration20251225180910446 } from \"./Migration20251225180910446\";\n\n@decorator.migration()\nexport class Migration20251225180910472 implements IMigration {\n public async up(tx: TransactionSQL): Promise<void> {\n await tx`\n CREATE TABLE IF NOT EXISTS mcq_questions_reports (\n id VARCHAR(25) PRIMARY KEY,\n question_id VARCHAR(25),\n reason VARCHAR(255) NOT NULL,\n description TEXT,\n reported_by VARCHAR(255),\n reported_by_id VARCHAR(25),\n status_id VARCHAR(25),\n is_locked BOOLEAN DEFAULT false,\n locked_at TIMESTAMPTZ,\n is_blocked BOOLEAN DEFAULT false,\n blocked_at TIMESTAMPTZ,\n block_reason TEXT,\n is_public BOOLEAN DEFAULT true,\n language VARCHAR(10),\n created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,\n updated_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP,\n deleted_at TIMESTAMPTZ,\n CONSTRAINT fk_mcq_questions_reports_question FOREIGN KEY (question_id) REFERENCES mcq_questions(id) ON DELETE CASCADE,\n CONSTRAINT fk_mcq_questions_reports_status FOREIGN KEY (status_id) REFERENCES statuses(id) ON DELETE SET NULL\n )\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_reports_question_id ON mcq_questions_reports(question_id)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_reports_reported_by_id ON mcq_questions_reports(reported_by_id)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_reports_status_id ON mcq_questions_reports(status_id)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_reports_reason ON mcq_questions_reports(reason)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_reports_language ON mcq_questions_reports(language)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_reports_deleted_at ON mcq_questions_reports(deleted_at)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_reports_is_public ON mcq_questions_reports(is_public) WHERE deleted_at IS NULL\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_reports_created_at ON mcq_questions_reports(created_at DESC)\n `;\n\n await tx`\n CREATE INDEX IF NOT EXISTS idx_mcq_questions_reports_active ON mcq_questions_reports(is_blocked, is_locked) WHERE deleted_at IS NULL AND is_blocked = false\n `;\n }\n\n public async down(tx: TransactionSQL): Promise<void> {\n await tx`DROP TABLE IF EXISTS mcq_questions_reports CASCADE`;\n }\n\n public getVersion(): string {\n return \"20251225180910472\";\n }\n\n public getDependencies(): MigrationClassType[] {\n return [\n Migration20251225180910446, // MCQ questions table (for question_id foreign key)\n Migration20251225173350644, // Statuses table (for status_id foreign key)\n ];\n }\n}\n"
|
|
17
|
+
],
|
|
18
|
+
"mappings": "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",
|
|
19
|
+
"debugId": "E6812AD6347C7FA564756E2164756E21",
|
|
20
|
+
"names": []
|
|
21
|
+
}
|