diff --git a/README.md b/README.md index 90e4113..b26fa40 100644 --- a/README.md +++ b/README.md @@ -173,6 +173,37 @@ Follow these steps to run the Research Nexas password varchar(120) unique, token varchar(130) not null unique ); + + Create the 'badges' table + CREATE TABLE badges ( + id INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(255) NOT NULL, + description TEXT NOT NULL, + criteria VARCHAR(255) +); + +-- Create the 'student_badges' table (stores which student earned which badge) +CREATE TABLE student_badges ( + id INT AUTO_INCREMENT PRIMARY KEY, + student_id INT NOT NULL, + badge_id INT NOT NULL, + awarded_at DATETIME DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (student_id) REFERENCES students(id) ON DELETE CASCADE, + FOREIGN KEY (badge_id) REFERENCES badges(id) ON DELETE CASCADE +); + + +-- Insert some example data into 'student' table +INSERT INTO student (name, email) VALUES ('Alice', 'alice@example.com'); + +-- Insert example badges into 'badges' table +INSERT INTO badges (name, description, criteria) VALUES +('Research Contributor', 'Awarded for submitting 5 research papers', 'Submit 5 papers'), +('Peer Reviewer', 'Awarded for completing 10 peer reviews', 'Complete 10 reviews'); + +-- Award badges to student (student_badges table) +INSERT INTO student_badges (user_id, badge_id) VALUES (1, 1), (1, 2); + ``` - Now open code editor(eg. VS Code) - Now run the following commands in your terminal diff --git a/badges_engagement/public/scripts.js b/badges_engagement/public/scripts.js new file mode 100644 index 0000000..9c2e535 --- /dev/null +++ b/badges_engagement/public/scripts.js @@ -0,0 +1,25 @@ +// Fetch user's badges +function fetchBadges(userId) { + fetch(`/badges/${userId}`) + .then(response => response.json()) + .then(badges => { + const badgeContainer = document.getElementById('badge-container'); + badgeContainer.innerHTML = ''; + + badges.forEach(badge => { + const badgeElement = document.createElement('div'); + badgeElement.classList.add('badge'); + badgeElement.innerHTML = ` +

${badge.name}

+

${badge.description}

+ Earned on: ${new Date(badge.earned_at).toLocaleDateString()} + `; + badgeContainer.appendChild(badgeElement); + }); + }) + .catch(error => console.error('Error fetching badges:', error)); + } + + // Replace with actual userId + fetchBadges(1); + \ No newline at end of file diff --git a/badges_engagement/routes/badges.js b/badges_engagement/routes/badges.js new file mode 100644 index 0000000..b6e395c --- /dev/null +++ b/badges_engagement/routes/badges.js @@ -0,0 +1,31 @@ +const express = require('express'); +const router = express.Router(); +const db = require('../db'); // Assuming db.js has your MySQL config + +// Get all badges for a user +router.get('/:userId', (req, res) => { + const { userId } = req.params; + const sql = ` + SELECT badges.name, badges.description, user_badges.earned_at + FROM badges + JOIN user_badges ON badges.id = user_badges.badge_id + WHERE user_badges.user_id = ?`; + + db.query(sql, [userId], (err, results) => { + if (err) throw err; + res.json(results); + }); +}); + +// Award a new badge to a user +router.post('/award', (req, res) => { + const { userId, badgeId } = req.body; + const sql = `INSERT INTO user_badges (user_id, badge_id) VALUES (?, ?)`; + + db.query(sql, [userId, badgeId], (err, result) => { + if (err) throw err; + res.json({ message: 'Badge awarded successfully' }); + }); +}); + +module.exports = router; diff --git a/login-system/dbServer.js b/login-system/dbServer.js index 4eda187..b904f06 100644 --- a/login-system/dbServer.js +++ b/login-system/dbServer.js @@ -14,6 +14,29 @@ const { allot, DisplayPapers } = require("../stakeholder/allotment"); const { Dis_fac_papers, fac_signup, fac_login, dis_mail, giverating } = require("../stakeholder/faculty"); const app = express(); +const mysql = require('mysql2'); +const dotenv = require('dotenv'); +dotenv.config(); + +const db = mysql.createConnection({ + host: process.env.DB_HOST, + user: process.env.DB_USER, + password: process.env.DB_PASS, + database: process.env.DB_NAME +}); + +db.connect((err) => { + if (err) throw err; + console.log('MySQL connected...'); +}); + +// Importing and setting up the badgesRouter to handle all badge-related routes +// This allows endpoints like '/badges/create' or '/badges/view' to be managed +// within the badgesRouter module, keeping route organization modular and clean +const badgesRouter = require('./routes/badges'); +app.use('/badges', badgesRouter); + + const globalLimit = rateLimiter({ windowMs: 30 * 60 * 1000, max: 100,