forked from cs411-alawini/fa23-cs411-team067-Sparkling
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdb.js
More file actions
139 lines (127 loc) · 3.85 KB
/
db.js
File metadata and controls
139 lines (127 loc) · 3.85 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
if (process.env.NODE_ENV !== "production") {
require("dotenv").config();
}
const mysql = require("mysql2");
const dbConfig = {
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
};
const connection = mysql.createConnection(dbConfig);
function createProcedure() {
const storedProcedureName = "CheckIfFlightExistBeforeInsert";
const sql_checkProcedureExists = `
SELECT *
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_SCHEMA = '${dbConfig.database}'
AND ROUTINE_TYPE = 'PROCEDURE'
AND ROUTINE_NAME = '${storedProcedureName}';
`;
const sql_dropProcedure = `DROP PROCEDURE IF EXISTS ${storedProcedureName};`;
const sql_checkFlightExistsStoredProcedure = `
CREATE PROCEDURE ${storedProcedureName}(
IN p_FEEDBACKID VARCHAR(255),
IN p_USERID VARCHAR(255),
IN p_CONTENT VARCHAR(255),
IN p_YEAR INT,
IN p_MONTH INT,
IN p_DAY INT,
IN p_FLIGHT_NUMBER VARCHAR(255),
IN p_AIRLINE VARCHAR(2)
)
BEGIN
DECLARE flightExists INT DEFAULT 0;
-- check if the flight exists
SELECT COUNT(*) INTO flightExists
FROM Flights
WHERE YEAR = p_YEAR AND MONTH = p_MONTH AND DAY = p_DAY
AND FLIGHT_NUMBER = p_FLIGHT_NUMBER AND AIRLINE = p_AIRLINE
LIMIT 1;
-- if flight exists, insert the feedback
IF flightExists > 0 THEN
INSERT INTO Feedbacks(FEEDBACKID, USERID, CONTENT, YEAR, MONTH, DAY, FLIGHT_NUMBER, AIRLINE, TIMESTAMP)
VALUES (p_FEEDBACKID, p_USERID, p_CONTENT, p_YEAR, p_MONTH, p_DAY, p_FLIGHT_NUMBER, p_AIRLINE, NOW());
ELSE
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'No matching flight';
END IF;
END;
`;
// First, check if the stored procedure exists
connection.query(sql_checkProcedureExists, (err, results) => {
if (err) {
throw err;
}
if (results.length > 0) {
// If it exists, drop the procedure
connection.query(sql_dropProcedure, (err, result) => {
if (err) {
throw err;
}
console.log(
`Stored procedure ${storedProcedureName} dropped successfully`
);
});
}
connection.query(sql_checkFlightExistsStoredProcedure, (err, results) => {
if (err) {
throw err;
}
console.log(
`Stored procedure ${storedProcedureName} created successfully`
);
});
});
}
function trigger_checkFeedbackFrequency() {
const triggername = "checkFeedbackFrequency";
const sql_trigger_checkFeedbackFrequency = `
CREATE TRIGGER ${triggername}
AFTER INSERT ON Feedbacks
FOR EACH ROW
BEGIN
SET @feedbackCount=(
SELECT COUNT(*)
FROM Feedbacks
WHERE USERID = NEW.USERID
AND TIMESTAMP > NOW() - INTERVAL 2 MINUTE
);
IF @feedbackCount >= 6 THEN
DELETE FROM Users
WHERE USERID = new.USERID;
END IF;
END;
`;
const sql_checkTriggerExists = `
SELECT TRIGGER_NAME
FROM information_schema.TRIGGERS
WHERE TRIGGER_SCHEMA = '${dbConfig.database}' AND TRIGGER_NAME = '${triggername}';
`;
connection.query(sql_checkTriggerExists, (err, results) => {
// console.log(sql_checkTriggerExists);
if (err) {
throw err;
}
//if trigger exists, drop it and create a new one.
if (results.length === 1) {
const sql_dropTrigger = `DROP TRIGGER ${triggername};`;
connection.query(sql_dropTrigger, (err, result) => {
if (err) {
throw err;
}
console.log(`Trigger ${triggername} dropped successfully`);
});
}
connection.query(sql_trigger_checkFeedbackFrequency, (err, result) => {
if (err) {
throw err;
}
console.log(`Trigger ${triggername} created successfully`);
});
});
}
module.exports = {
connection,
createProcedure,
trigger_checkFeedbackFrequency,
};