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}`); });