File size: 3,262 Bytes
6c678a9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
-- This table stores user login info and their experience points (XP).
-- MODIFIED to include an admin flag AND streak-tracking columns.
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    password_hash VARCHAR(255) NOT NULL,
    xp INT DEFAULT 0,
    is_admin BOOLEAN DEFAULT FALSE,
    created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    -- NEW: Columns for tracking daily streaks
    last_login_date DATE,
    streak_count INT DEFAULT 0
);

-- This table stores questions for the lessons.
-- (No changes here)
CREATE TABLE questions (
    id SERIAL PRIMARY KEY,
    lesson_id INT NOT NULL,
    content TEXT NOT NULL,
    difficulty_level INT NOT NULL CHECK (difficulty_level BETWEEN 1 AND 5),
    correct_answer_text VARCHAR(255) NOT NULL
);

-- This table tracks every answer a user gives.
-- (No changes here)
CREATE TABLE user_progress (
    id SERIAL PRIMARY KEY,
    user_id INT REFERENCES users(id) ON DELETE CASCADE,
    question_id INT REFERENCES questions(id) ON DELETE CASCADE,
    is_correct BOOLEAN NOT NULL,
    answered_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

-- This table stores the state of our Reinforcement Learning model.
-- (No changes here)
CREATE TABLE bandit_state (
    user_id INT REFERENCES users(id) ON DELETE CASCADE,
    lesson_id INT NOT NULL,
    difficulty_level INT NOT NULL,
    times_selected INT DEFAULT 1,
    successful_outcomes INT DEFAULT 0,
    PRIMARY KEY (user_id, lesson_id, difficulty_level)
);

-- NEW TABLE: Stores the definitions for all possible quests.
CREATE TABLE quests (
    id SERIAL PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    description TEXT,
    quest_type VARCHAR(50) NOT NULL, -- e.g., 'CORRECT_ANSWERS', 'TOTAL_ANSWERS'
    completion_target INT NOT NULL, -- e.g., 5 for "Answer 5 questions correctly"
    xp_reward INT NOT NULL
);

-- NEW TABLE: Tracks the active quest for each user for the current day.
CREATE TABLE user_quests (
    id SERIAL PRIMARY KEY,
    user_id INT REFERENCES users(id) ON DELETE CASCADE,
    quest_id INT REFERENCES quests(id) ON DELETE CASCADE,
    assigned_date DATE NOT NULL DEFAULT CURRENT_DATE,
    current_progress INT DEFAULT 0,
    is_completed BOOLEAN DEFAULT FALSE,
    UNIQUE(user_id, assigned_date) -- Ensures a user only gets one quest per day
);
-- (Keep all the existing tables: users, questions, user_progress, etc.)

-- NEW TABLE: Stores the definitions for all possible achievements.
CREATE TABLE achievements (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    description TEXT NOT NULL,
    icon_class VARCHAR(50) NOT NULL, -- e.g., 'fas fa-brain', 'fas fa-fire'
    criteria_type VARCHAR(50) NOT NULL, -- e.g., 'CORRECT_ANSWERS_TOTAL', 'STREAK'
    criteria_value INT NOT NULL,
    xp_reward INT NOT NULL
);

-- NEW TABLE: Links users to the achievements they have unlocked.
CREATE TABLE user_achievements (
    id SERIAL PRIMARY KEY,
    user_id INT REFERENCES users(id) ON DELETE CASCADE,
    achievement_id INT REFERENCES achievements(id) ON DELETE CASCADE,
    unlocked_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    UNIQUE(user_id, achievement_id) -- A user can only earn each achievement once
);