forked from ignacioelizeche/Backend-Delta
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdatabase_manager.cpp
More file actions
173 lines (156 loc) · 7.02 KB
/
Copy pathdatabase_manager.cpp
File metadata and controls
173 lines (156 loc) · 7.02 KB
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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#include "database_manager.h"
database_manager &database_manager::instance()
{
static database_manager instance;
return instance;
}
QSqlDatabase &database_manager::database()
{
return m_db;
}
database_manager::database_manager()
{
m_db = QSqlDatabase::addDatabase("QSQLITE");
m_db.setDatabaseName("delta.db");
if (!m_db.open()) {
qDebug() << "Failed to open database:" << m_db.lastError().text();
} else {
qDebug() << "Database opened successfully.";
}
QSqlQuery query(m_db);
// Create users table
query.exec("CREATE TABLE IF NOT EXISTS users ("
"id INTEGER PRIMARY KEY AUTOINCREMENT, "
"username TEXT UNIQUE, "
"email TEXT UNIQUE, "
"password TEXT, "
"role TEXT DEFAULT 'student', "
"coinBalance INTEGER DEFAULT 0, "
"xpPoints INTEGER DEFAULT 0, "
"level INTEGER DEFAULT 1, "
"streak INTEGER DEFAULT 0, "
"totalProblemsCompleted INTEGER DEFAULT 0, "
"lastLoginDate DATETIME DEFAULT CURRENT_TIMESTAMP, "
"joinDate DATETIME DEFAULT CURRENT_TIMESTAMP"
")");
// Create calendar table
query.exec("CREATE TABLE IF NOT EXISTS calendar ("
"id INTEGER PRIMARY KEY AUTOINCREMENT,"
"title VARCHAR(200) NOT NULL,"
"description TEXT,"
"eventType VARCHAR(50) NOT NULL,"
"startTime TIMESTAMP NOT NULL,"
"endTime TIMESTAMP NOT NULL,"
"attendees TEXT DEFAULT '',"
"priority VARCHAR(20) DEFAULT 'medium',"
"color VARCHAR(7) DEFAULT '#3b82f6',"
"createdBy INTEGER REFERENCES users(id),"
"createdAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP,"
"updatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP"
")");
// Create problems table
query.exec("CREATE TABLE IF NOT EXISTS problems ("
"id INTEGER PRIMARY KEY AUTOINCREMENT,"
"title VARCHAR(50) NOT NULL,"
"description TEXT,"
"difficulty VARCHAR(20) NOT NULL,"
"topic VARCHAR(50) NOT NULL,"
"pointValue INTEGER DEFAULT 10,"
"xpValue INTEGER DEFAULT 25,"
"estimatedTime INTEGER DEFAULT 180,"
"tags TEXT DEFAULT '',"
"concepts TEXT DEFAULT '',"
"type TEXT DEFAULT '',"
"timeLimit INTEGER DEFAULT 240,"
"correctAnswer VARCHAR(200) DEFAULT '',"
"explanation VARCHAR(200) DEFAULT '',"
"createdAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP"
")");
// Create user_activity_log table
if (!query.exec("CREATE TABLE IF NOT EXISTS user_activity_log ("
"id INTEGER PRIMARY KEY AUTOINCREMENT,"
"user_id INTEGER NOT NULL,"
"activity_type VARCHAR(50) NOT NULL,"
"details TEXT DEFAULT '',"
"points_earned INTEGER DEFAULT 0,"
"xp_earned INTEGER DEFAULT 0,"
"coins_earned INTEGER DEFAULT 0,"
"created_at DATETIME DEFAULT CURRENT_TIMESTAMP,"
"FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE"
")")) {
qDebug() << "Error creating user_activity_log table:" << query.lastError().text();
} else {
qDebug() << "user_activity_log table created successfully.";
}
// Create leaderboard_history table
if (!query.exec("CREATE TABLE IF NOT EXISTS leaderboard_history ("
"id INTEGER PRIMARY KEY AUTOINCREMENT,"
"user_id INTEGER NOT NULL,"
"rank_position INTEGER NOT NULL,"
"points INTEGER DEFAULT 0,"
"xp_points INTEGER DEFAULT 0,"
"problems_completed INTEGER DEFAULT 0,"
"timeframe VARCHAR(20) NOT NULL,"
"recorded_at DATETIME DEFAULT CURRENT_TIMESTAMP,"
"FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE"
")")) {
qDebug() << "Error creating leaderboard_history table:" << query.lastError().text();
} else {
qDebug() << "leaderboard_history table created successfully.";
}
// Drop and recreate documents table
query.exec("DROP TABLE IF EXISTS documents");
query.exec("CREATE TABLE IF NOT EXISTS documents ("
"id INTEGER PRIMARY KEY AUTOINCREMENT,"
"title TEXT NOT NULL,"
"description TEXT,"
"subject TEXT,"
"category TEXT,"
"difficulty TEXT,"
"topics TEXT,"
"tags TEXT,"
"prerequisites TEXT,"
"filename TEXT NOT NULL,"
"filedata TEXT,"
"filesize INTEGER,"
"pagecount INTEGER,"
"ispublic BOOLEAN DEFAULT 0,"
"isactive BOOLEAN DEFAULT 1,"
"uploadedby INTEGER NOT NULL,"
"uploadedat DATETIME DEFAULT CURRENT_TIMESTAMP,"
"updatedat DATETIME DEFAULT CURRENT_TIMESTAMP,"
"totaldownloads INTEGER DEFAULT 0,"
"totalviews INTEGER DEFAULT 0,"
"ratingcount INTEGER DEFAULT 0,"
"averagerating REAL DEFAULT 0.0,"
"filehash TEXT UNIQUE"
")");
// Create problem_attempts table
createProblemAttemptsTable();
}
void database_manager::createProblemAttemptsTable()
{
QSqlQuery query(m_db);
bool success = query.exec("CREATE TABLE IF NOT EXISTS problem_attempts ("
"id INTEGER PRIMARY KEY AUTOINCREMENT,"
"userId INTEGER NOT NULL,"
"problemId INTEGER NOT NULL,"
"answer TEXT NOT NULL,"
"correct BOOLEAN NOT NULL,"
"xpEarned INTEGER DEFAULT 0,"
"coinsEarned INTEGER DEFAULT 0,"
"timestamp DATETIME NOT NULL,"
"createdAt DATETIME DEFAULT CURRENT_TIMESTAMP,"
"FOREIGN KEY (userId) REFERENCES users(id) ON DELETE CASCADE,"
"FOREIGN KEY (problemId) REFERENCES problems(id) ON DELETE CASCADE"
")");
if (!success) {
qDebug() << "Error creating problem_attempts table:" << query.lastError().text();
return;
}
query.exec("CREATE INDEX IF NOT EXISTS idx_attempts_userId ON problem_attempts(userId)");
query.exec("CREATE INDEX IF NOT EXISTS idx_attempts_problemId ON problem_attempts(problemId)");
query.exec("CREATE INDEX IF NOT EXISTS idx_attempts_timestamp ON problem_attempts(timestamp)");
query.exec("CREATE INDEX IF NOT EXISTS idx_attempts_correct ON problem_attempts(correct)");
qDebug() << "problem_attempts table created successfully";
}