-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript.sql
More file actions
154 lines (141 loc) · 4.89 KB
/
script.sql
File metadata and controls
154 lines (141 loc) · 4.89 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
USE <yourDBNAME>;
CREATE TABLE users (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
password VARCHAR(70) NOT NULL,
account_status ENUM('active', 'suspended', 'deleted') DEFAULT 'active',
role ENUM('user', 'admin') DEFAULT 'user',
last_login DATETIME,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
CREATE TABLE support_tickets (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
user_id INT UNSIGNED NOT NULL,
subject VARCHAR(100) NOT NULL,
message TEXT NOT NULL,
status ENUM('open', 'in_progress', 'resolved') DEFAULT 'open',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
CREATE TABLE profile (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
user_id INT UNSIGNED NOT NULL UNIQUE,
role ENUM('Studente', 'Insegnante', 'Genitore', 'Tutor', 'Ricercatore', 'Coordinatore', 'Bibliotecario', 'Amministrativo', 'Ospite', 'Altro') DEFAULT 'Studente',
bio TEXT,
avatar_url VARCHAR(255),
phone VARCHAR(20),
country VARCHAR(100),
date_of_birth DATE,
timezone VARCHAR(50) DEFAULT 'Europe/Rome',
language VARCHAR(5) DEFAULT 'it',
theme ENUM('light', 'dark', 'auto') DEFAULT 'light',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
CREATE TABLE document (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT UNSIGNED NOT NULL,
filename VARCHAR(255) NOT NULL,
original_name VARCHAR(255) NOT NULL,
file_type VARCHAR(50),
file_size BIGINT UNSIGNED,
hash_sha256 CHAR(64),
mime_type VARCHAR(100),
status ENUM('uploaded', 'scanned', 'safe', 'infected', 'processed', 'rejected') DEFAULT 'uploaded',
threat_info TEXT,
uploaded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
CREATE TABLE article (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
user_id INT UNSIGNED NOT NULL,
title VARCHAR(255) NOT NULL,
summary TEXT,
content LONGTEXT NOT NULL,
category ENUM('informatica', 'logica', 'matematica', 'filosofia', 'altro') DEFAULT 'altro',
visibility ENUM('public', 'private', 'draft') DEFAULT 'public',
views INT UNSIGNED DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
CREATE TABLE quiz (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT UNSIGNED NOT NULL,
document_id INT NOT NULL,
title VARCHAR(255),
num_questions INT NOT NULL,
difficulty ENUM('facile', 'medio', 'difficile') NOT NULL,
quiz_type VARCHAR(50) NOT NULL,
is_timed BOOLEAN DEFAULT FALSE,
time_limit INT,
quiz_data MEDIUMTEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (document_id) REFERENCES document(id) ON DELETE CASCADE
);
CREATE TABLE quiz_results (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT UNSIGNED NOT NULL,
quiz_id INT NOT NULL,
score DECIMAL(5,2),
time_taken INT,
answers TEXT,
completed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
FOREIGN KEY (quiz_id) REFERENCES quiz(id) ON DELETE CASCADE
);
CREATE TRIGGER update_document_status
BEFORE UPDATE ON document
FOR EACH ROW
BEGIN
IF NEW.threat_info IS NOT NULL AND NEW.status = 'scanned' THEN
SET NEW.status = CASE
WHEN NEW.threat_info = '' THEN 'safe'
ELSE 'infected'
END;
END IF;
END;
//
DELIMITER ;
DELIMITER //
CREATE TRIGGER update_article_timestamp
BEFORE UPDATE ON article
FOR EACH ROW
BEGIN
IF NEW.content <> OLD.content OR NEW.title <> OLD.title OR NEW.summary <> OLD.summary THEN
SET NEW.updated_at = NOW();
END IF;
END;
//
DELIMITER ;
DELIMITER //
CREATE PROCEDURE UpdateUserProfile(
IN p_user_id INT,
IN p_bio TEXT,
IN p_phone VARCHAR(20),
IN p_country VARCHAR(100),
IN p_timezone VARCHAR(50),
IN p_language VARCHAR(5),
IN p_theme ENUM('light','dark','auto'),
IN p_role ENUM('Studente','Insegnante','Genitore','Tutor','Ricercatore','Coordinatore','Bibliotecario','Amministrativo','Ospite','Altro'),
IN p_date_of_birth DATE
)
BEGIN
UPDATE profile
SET bio = p_bio,
phone = p_phone,
country = p_country,
timezone = p_timezone,
language = p_language,
theme = p_theme,
role = p_role,
date_of_birth = p_date_of_birth,
updated_at = CURRENT_TIMESTAMP
WHERE user_id = p_user_id;
END;
//
DELIMITER ;