File size: 5,623 Bytes
6bc61ad 11c79a7 6bc61ad 11c79a7 6bc61ad | 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 174 175 176 177 178 179 180 181 182 183 184 185 | const express = require("express");
const bodyParser = require("body-parser");
const sqlite3 = require("sqlite3").verbose(); // Use SQLite
const path = require("path");
const app = express();
const PORT = process.env.PORT || 7860;
app.set("view engine", "ejs");
app.use(bodyParser.urlencoded({ extended: true }));
app.use(express.json()); // Support JSON bodies for API
app.use(express.static(path.join(__dirname, 'public')));
// Connect to SQLite Database (File-based)
const db = new sqlite3.Database('./database.sqlite', (err) => {
if (err) {
console.error(err.message);
}
console.log('Connected to the SQLite database.');
});
// Helper to get common data (rules, traits, history)
const getCommonData = (callback) => {
db.all("SELECT * FROM grade_rules ORDER BY min_avg DESC", [], (err, rules) => {
if (err) rules = [];
db.all("SELECT * FROM personality_traits", [], (err, traits) => {
if (err) traits = [];
db.all("SELECT * FROM sampleStudent ORDER BY id DESC LIMIT 5", [], (err, history) => {
if (err) history = [];
callback({ rules, traits, history });
});
});
});
};
app.get("/", (req, res) => {
getCommonData((data) => {
res.render("index", { result: null, ...data });
});
});
// --- API Endpoints ---
// Get recent students
app.get("/api/students", (req, res) => {
db.all("SELECT * FROM sampleStudent ORDER BY id DESC LIMIT 10", [], (err, rows) => {
if (err) {
res.status(500).json({ error: err.message });
return;
}
res.json(rows);
});
});
// Get grading rules
app.get("/api/rules", (req, res) => {
db.all("SELECT * FROM grade_rules ORDER BY min_avg DESC", [], (err, rows) => {
if (err) {
res.status(500).json({ error: err.message });
return;
}
res.json(rows);
});
});
// Get personality traits
app.get("/api/traits", (req, res) => {
db.all("SELECT * FROM personality_traits", [], (err, rows) => {
if (err) {
res.status(500).json({ error: err.message });
return;
}
res.json(rows);
});
});
// Analyze student and save result
app.post("/api/analyze", (req, res) => {
const { name, sub1, sub2, sub3 } = req.body;
if (!name || sub1 === undefined || sub2 === undefined || sub3 === undefined) {
return res.status(400).json({ error: "Missing required fields: name, sub1, sub2, sub3" });
}
const s1 = parseInt(sub1);
const s2 = parseInt(sub2);
const s3 = parseInt(sub3);
const avg = Math.round((s1 + s2 + s3) / 3);
// 1. Insert Student
const insertQuery = `INSERT INTO sampleStudent (name, subject1, subject2, subject3) VALUES (?, ?, ?, ?)`;
db.run(insertQuery, [name, s1, s2, s3], function(err) {
if (err) {
return res.status(500).json({ error: "Error saving student data: " + err.message });
}
// 2. Find Grade
const gradeQuery = `SELECT grade FROM grade_rules WHERE ? >= min_avg AND ? <= max_avg LIMIT 1`;
db.get(gradeQuery, [avg, avg], (err, gradeRow) => {
if (err || !gradeRow) {
return res.status(404).json({ error: "Grade not found for average: " + avg });
}
const grade = gradeRow.grade;
// 3. Find Trait
const traitQuery = `SELECT trait FROM personality_traits WHERE grade = ?`;
db.get(traitQuery, [grade], (err, traitRow) => {
if (err || !traitRow) {
return res.status(404).json({ error: "Trait not found for grade: " + grade });
}
res.json({
success: true,
data: {
name,
average: avg,
grade,
trait: traitRow.trait
}
});
});
});
});
});
// --- End API Endpoints ---
app.post("/result", (req, res) => {
const { name, sub1, sub2, sub3 } = req.body;
const s1 = parseInt(sub1);
const s2 = parseInt(sub2);
const s3 = parseInt(sub3);
const avg = Math.round((s1 + s2 + s3) / 3);
// 1. Insert Student
const insertQuery = `INSERT INTO sampleStudent (name, subject1, subject2, subject3) VALUES (?, ?, ?, ?)`;
db.run(insertQuery, [name, s1, s2, s3], function(err) {
if (err) {
return res.send("Error saving student data: " + err.message);
}
// 2. Find Grade
const gradeQuery = `SELECT grade FROM grade_rules WHERE ? >= min_avg AND ? <= max_avg LIMIT 1`;
db.get(gradeQuery, [avg, avg], (err, gradeRow) => {
if (err || !gradeRow) {
console.log("No grade found for avg:", avg);
// Only rendering if valid, else simplistic error for now
return res.send("Grade not found for average: " + avg);
}
const grade = gradeRow.grade;
// 3. Find Trait
const traitQuery = `SELECT trait FROM personality_traits WHERE grade = ?`;
db.get(traitQuery, [grade], (err, traitRow) => {
if (err || !traitRow) {
return res.send("Trait not found for grade: " + grade);
}
// Fetch updated history and rules for display
getCommonData((data) => {
res.render("index", {
result: {
name,
avg,
grade,
trait: traitRow.trait
},
...data
});
});
});
});
});
});
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});
|