11-- Initial schema migration for Comprehendo D1 database
22-- This migration creates all the required tables for the application
3-
43CREATE TABLE IF NOT EXISTS quiz (
5- id INTEGER PRIMARY KEY AUTOINCREMENT,
6- language TEXT NOT NULL ,
7- level TEXT NOT NULL ,
8- content TEXT NOT NULL ,
9- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ,
10- question_language TEXT ,
11- user_id INTEGER ,
12- FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE SET NULL
4+ id INTEGER PRIMARY KEY AUTOINCREMENT,
5+ language TEXT NOT NULL ,
6+ level TEXT NOT NULL ,
7+ content TEXT NOT NULL ,
8+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ,
9+ question_language TEXT ,
10+ user_id INTEGER ,
11+ FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE
12+ SET
13+ NULL
1314);
1415
1516CREATE TABLE IF NOT EXISTS users (
16- id INTEGER PRIMARY KEY AUTOINCREMENT,
17- provider_id TEXT NOT NULL ,
18- provider TEXT NOT NULL ,
19- name TEXT ,
20- email TEXT ,
21- image TEXT ,
22- first_login TIMESTAMP DEFAULT CURRENT_TIMESTAMP ,
23- last_login TIMESTAMP DEFAULT CURRENT_TIMESTAMP ,
24- language TEXT DEFAULT ' en' ,
25- UNIQUE(provider_id, provider)
17+ id INTEGER PRIMARY KEY AUTOINCREMENT,
18+ provider_id TEXT NOT NULL ,
19+ provider TEXT NOT NULL ,
20+ name TEXT ,
21+ email TEXT ,
22+ image TEXT ,
23+ first_login TIMESTAMP DEFAULT CURRENT_TIMESTAMP ,
24+ last_login TIMESTAMP DEFAULT CURRENT_TIMESTAMP ,
25+ language TEXT DEFAULT ' en' ,
26+ UNIQUE(provider_id, provider)
2627);
2728
2829CREATE TABLE IF NOT EXISTS user_language_progress (
29- user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE ,
30- language_code TEXT NOT NULL ,
31- cefr_level TEXT NOT NULL DEFAULT ' A1' ,
32- correct_streak INTEGER NOT NULL DEFAULT 0 ,
33- last_practiced TIMESTAMP DEFAULT CURRENT_TIMESTAMP ,
34- PRIMARY KEY (user_id, language_code)
30+ user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE ,
31+ language_code TEXT NOT NULL ,
32+ cefr_level TEXT NOT NULL DEFAULT ' A1' ,
33+ correct_streak INTEGER NOT NULL DEFAULT 0 ,
34+ last_practiced TIMESTAMP DEFAULT CURRENT_TIMESTAMP ,
35+ PRIMARY KEY (user_id, language_code)
3536);
3637
3738CREATE TABLE IF NOT EXISTS question_feedback (
38- id INTEGER PRIMARY KEY AUTOINCREMENT,
39- quiz_id INTEGER NOT NULL ,
40- user_id INTEGER NOT NULL ,
41- is_good INTEGER NOT NULL ,
42- user_answer TEXT ,
43- is_correct INTEGER ,
44- submitted_at DATETIME DEFAULT CURRENT_TIMESTAMP ,
45- FOREIGN KEY (quiz_id) REFERENCES quiz (id) ON DELETE CASCADE ,
46- FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE
39+ id INTEGER PRIMARY KEY AUTOINCREMENT,
40+ quiz_id INTEGER NOT NULL ,
41+ user_id INTEGER NOT NULL ,
42+ is_good INTEGER NOT NULL ,
43+ user_answer TEXT ,
44+ is_correct INTEGER ,
45+ submitted_at DATETIME DEFAULT CURRENT_TIMESTAMP ,
46+ FOREIGN KEY (quiz_id) REFERENCES quiz (id) ON DELETE CASCADE ,
47+ FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE
4748);
4849
4950CREATE TABLE IF NOT EXISTS rate_limits (
50- ip_address TEXT PRIMARY KEY ,
51- request_count INTEGER NOT NULL DEFAULT 1 ,
52- window_start_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
51+ ip_address TEXT PRIMARY KEY ,
52+ request_count INTEGER NOT NULL DEFAULT 1 ,
53+ window_start_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
5354);
5455
5556CREATE TABLE IF NOT EXISTS translation_cache (
56- id INTEGER PRIMARY KEY AUTOINCREMENT,
57- source_word TEXT NOT NULL ,
58- source_language TEXT NOT NULL ,
59- target_language TEXT NOT NULL ,
60- translated_text TEXT NOT NULL ,
61- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ,
62- UNIQUE(source_word, source_language, target_language)
57+ id INTEGER PRIMARY KEY AUTOINCREMENT,
58+ source_word TEXT NOT NULL ,
59+ source_language TEXT NOT NULL ,
60+ target_language TEXT NOT NULL ,
61+ translated_text TEXT NOT NULL ,
62+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ,
63+ UNIQUE(source_word, source_language, target_language)
6364);
6465
6566CREATE TABLE IF NOT EXISTS ai_api_usage (
66- id INTEGER PRIMARY KEY AUTOINCREMENT,
67- date TEXT NOT NULL ,
68- request_count INTEGER NOT NULL DEFAULT 0 ,
69- created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ,
70- UNIQUE(date )
67+ id INTEGER PRIMARY KEY AUTOINCREMENT,
68+ date TEXT NOT NULL ,
69+ request_count INTEGER NOT NULL DEFAULT 0 ,
70+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ,
71+ UNIQUE(date )
7172);
7273
7374-- Create indexes for better performance
7475CREATE INDEX IF NOT EXISTS idx_quiz_created_at ON quiz(created_at DESC );
76+
7577CREATE INDEX IF NOT EXISTS idx_users_last_login ON users(last_login DESC );
78+
7679CREATE INDEX IF NOT EXISTS idx_user_language_progress_last_practiced ON user_language_progress(last_practiced DESC );
80+
7781CREATE INDEX IF NOT EXISTS idx_question_feedback_quiz_id ON question_feedback (quiz_id);
82+
7883CREATE INDEX IF NOT EXISTS idx_question_feedback_user_id ON question_feedback (user_id);
84+
7985CREATE INDEX IF NOT EXISTS idx_translation_cache_lookup ON translation_cache(source_word, source_language, target_language);
80- CREATE INDEX IF NOT EXISTS idx_ai_api_usage_date ON ai_api_usage(date );
86+
87+ CREATE INDEX IF NOT EXISTS idx_ai_api_usage_date ON ai_api_usage(date );
0 commit comments