diff --git a/script.js b/script.js index 7293d9e6..ea0574ed 100644 --- a/script.js +++ b/script.js @@ -1,4 +1,3 @@ -// scripts.js document.addEventListener('DOMContentLoaded', () => { const registerForm = document.getElementById('register-form'); const loginForm = document.getElementById('login-form'); @@ -44,6 +43,7 @@ document.addEventListener('DOMContentLoaded', () => { }); if (response.ok) { alert('Login successful'); + window.location.href = '/dashboard'; } else { alert('Invalid username or password'); } @@ -60,6 +60,7 @@ document.addEventListener('DOMContentLoaded', () => { }); if (response.ok) { alert('Logout successful'); + window.location.href = '/'; } else { alert('Logout failed'); } @@ -68,31 +69,26 @@ document.addEventListener('DOMContentLoaded', () => { } }); - // Check if the current page is the course content page if (window.location.pathname === '/course-content') { - // Call the fetchCourseContent function - fetchCourseContent(); + const urlParams = new URLSearchParams(window.location.search); + const courseId = urlParams.get('id'); + if (courseId) { + fetchCourseContent(courseId); + } else { + console.error('Course ID not provided'); + } } - // Check if the current page is the course content page - if (window.location.pathname === '/leader-board') { - // Fetch course content from server + if (window.location.pathname === '/leaderboard') { fetchLeaderboardData(); } - // Check if the current page is the course content page if (window.location.pathname === '/dashboard') { - //fetch Logged in user's full name fetchFullName(); } }); -function fetchCourseContent() { - // Get course ID from URL parameter (assuming course ID is passed in the URL) - const urlParams = new URLSearchParams(window.location.search); - const courseId = urlParams.get('id'); - - // Make AJAX request to fetch course content from server +function fetchCourseContent(courseId) { fetch(`/course/${courseId}`) .then(response => { if (!response.ok) { @@ -101,7 +97,6 @@ function fetchCourseContent() { return response.json(); }) .then(data => { - // Display course content on the page displayCourseContent(data); }) .catch(error => { @@ -110,30 +105,23 @@ function fetchCourseContent() { } function displayCourseContent(courseContent) { - // Get the course name element const courseNameElement = document.getElementById('course-name'); - // Set the course name courseNameElement.textContent = courseContent.name; - // Get the course content element const courseContentElement = document.getElementById('course-content'); - // Clear previous content courseContentElement.innerHTML = ''; - // Loop through the modules and display them courseContent.modules.forEach(module => { const moduleSection = document.createElement('section'); moduleSection.innerHTML = `

${module.title}

${module.description}

- `; courseContentElement.appendChild(moduleSection); }); } function fetchLeaderboardData() { - // Make AJAX request to fetch leaderboard data from server fetch('/leaderboard') .then(response => { if (!response.ok) { @@ -142,7 +130,6 @@ function fetchLeaderboardData() { return response.json(); }) .then(data => { - // Display leaderboard data on the page displayLeaderboardData(data); }) .catch(error => { @@ -151,12 +138,9 @@ function fetchLeaderboardData() { } function displayLeaderboardData(leaderboardData) { - // Get the leaderboard element const leaderboardElement = document.getElementById('leaderboard'); - // Clear previous content leaderboardElement.innerHTML = ''; - // Create a table to display leaderboard data const table = document.createElement('table'); table.innerHTML = ` @@ -166,7 +150,6 @@ function displayLeaderboardData(leaderboardData) { `; - // Loop through the leaderboard data and add rows to the table leaderboardData.forEach((entry, index) => { const row = document.createElement('tr'); row.innerHTML = ` @@ -177,12 +160,10 @@ function displayLeaderboardData(leaderboardData) { table.appendChild(row); }); - // Append the table to the leaderboard element leaderboardElement.appendChild(table); } function fetchFullName() { - // Make AJAX request to fetch the user's full name from the server fetch('/get-fullname') .then(response => { if (!response.ok) { @@ -191,7 +172,6 @@ function fetchFullName() { return response.json(); }) .then(data => { - // Display the user's full name on the dashboard displayFullName(data.fullName); }) .catch(error => { @@ -200,8 +180,6 @@ function fetchFullName() { } function displayFullName(fullName) { - // Get the element where the full name will be displayed const fullNameElement = document.getElementById('user-fullname'); - // Set the inner HTML of the element to the user's full name fullNameElement.textContent = fullName; } \ No newline at end of file diff --git a/server.js b/server.js index 2b854861..f65b7b10 100644 --- a/server.js +++ b/server.js @@ -1,4 +1,3 @@ -// server.js const express = require('express'); const session = require('express-session'); const bcrypt = require('bcryptjs'); @@ -17,9 +16,9 @@ app.use(session({ // Create MySQL connection const connection = mysql.createConnection({ host: 'localhost', - user: 'root', - password: '', - database: 'learning_management' + user: 'admin', + password: 'CHidozie12@', + database: 'LMS' }); // Connect to MySQL @@ -41,18 +40,18 @@ app.use(express.urlencoded({ extended: true })); app.use(bodyParser.urlencoded({ extended: true })); // Define routes + +// Root route app.get('/', (req, res) => { res.sendFile(__dirname + '/index.html'); }); - - // Define a User representation for clarity const User = { - tableName: 'users', + tableName: 'users', createUser: function(newUser, callback) { connection.query('INSERT INTO ' + this.tableName + ' SET ?', newUser, callback); - }, + }, getUserByEmail: function(email, callback) { connection.query('SELECT * FROM ' + this.tableName + ' WHERE email = ?', email, callback); }, @@ -63,35 +62,39 @@ const User = { // Registration route app.post('/register', [ - // Validate email and username fields check('email').isEmail(), check('username').isAlphanumeric().withMessage('Username must be alphanumeric'), - - // Custom validation to check if email and username are unique check('email').custom(async (value) => { - const user = await User.getUserByEmail(value); + const user = await new Promise((resolve, reject) => { + User.getUserByEmail(value, (err, results) => { + if (err) reject(err); + resolve(results[0]); + }); + }); if (user) { throw new Error('Email already exists'); } }), check('username').custom(async (value) => { - const user = await User.getUserByUsername(value); + const user = await new Promise((resolve, reject) => { + User.getUserByUsername(value, (err, results) => { + if (err) reject(err); + resolve(results[0]); + }); + }); if (user) { throw new Error('Username already exists'); } }), ], async (req, res) => { - // Check for validation errors const errors = validationResult(req); if (!errors.isEmpty()) { return res.status(400).json({ errors: errors.array() }); } - // Hash the password const saltRounds = 10; const hashedPassword = await bcrypt.hash(req.body.password, saltRounds); - // Create a new user object const newUser = { email: req.body.email, username: req.body.username, @@ -99,32 +102,28 @@ app.post('/register', [ full_name: req.body.full_name }; - // Insert user into MySQL User.createUser(newUser, (error, results, fields) => { if (error) { - console.error('Error inserting user: ' + error.message); - return res.status(500).json({ error: error.message }); + console.error('Error inserting user: ' + error.message); + return res.status(500).json({ error: error.message }); } console.log('Inserted a new user with id ' + results.insertId); res.status(201).json(newUser); - }); + }); }); // Login route app.post('/login', (req, res) => { const { username, password } = req.body; - // Retrieve user from database connection.query('SELECT * FROM users WHERE username = ?', [username], (err, results) => { if (err) throw err; if (results.length === 0) { res.status(401).send('Invalid username or password'); } else { const user = results[0]; - // Compare passwords bcrypt.compare(password, user.password, (err, isMatch) => { if (err) throw err; if (isMatch) { - // Store user in session req.session.user = user; res.send('Login successful'); } else { @@ -141,28 +140,100 @@ app.post('/logout', (req, res) => { res.send('Logout successful'); }); -//Dashboard route +// Route to serve the dashboard HTML file app.get('/dashboard', (req, res) => { - // Assuming you have middleware to handle user authentication and store user information in req.user - const userFullName = req.user.full_name; - res.render('dashboard', { fullName: userFullName }); + if (!req.session.user) { + return res.status(401).send('You must log in to view this page.'); + } + res.sendFile(__dirname + '/dashboard.html'); +}); + +// Route to serve the course content HTML file +app.get('/course-content', (req, res) => { + if (!req.session.user) { + return res.status(401).send('You must log in to view this page.'); + } + res.sendFile(__dirname + '/course-content.html'); }); // Route to retrieve course content app.get('/course/:id', (req, res) => { const courseId = req.params.id; const sql = 'SELECT * FROM courses WHERE id = ?'; - db.query(sql, [courseId], (err, result) => { - if (err) { - throw err; - } - // Send course content as JSON response - res.json(result); + connection.query(sql, [courseId], (err, result) => { + if (err) { + throw err; + } + res.json(result[0]); // Assuming courses table has a single row per ID }); - }); +}); + +// Route to fetch leaderboard data +app.get('/leaderboard', (req, res) => { + // Replace with actual leaderboard fetching logic + const leaderboardData = [ + { name: 'John Doe', score: 100 }, + { name: 'Jane Smith', score: 95 }, + { name: 'Michael Johnson', score: 90 } + ]; + res.json(leaderboardData); +}); + +// Route to fetch user's full name +app.get('/get-fullname', (req, res) => { + if (!req.session.user) { + return res.status(401).send('You must log in to view this page.'); + } + const fullName = req.session.user.full_name; + res.json({ fullName }); +}); + +// Route to handle user course selection +app.post('/select-course', (req, res) => { + if (!req.session.user) { + return res.status(401).send('You must log in to select a course.'); + } + + const { courseId } = req.body; + const userId = req.session.user.id; + + // Assuming a table `user_courses` with columns `user_id` and `course_id` + const sql = 'INSERT INTO user_courses (user_id, course_id) VALUES (?, ?)'; + connection.query(sql, [userId, courseId], (err, result) => { + if (err) { + console.error('Error selecting course:', err); + return res.status(500).send('Failed to select course.'); + } + res.send('Course selected successfully.'); + }); +}); + +// Route to fetch user's selected courses +app.get('/my-courses', (req, res) => { + if (!req.session.user) { + return res.status(401).send('You must log in to view your courses.'); + } + + const userId = req.session.user.id; + + // Assuming a join between `user_courses` and `courses` tables to fetch course details + const sql = ` + SELECT courses.* + FROM courses + INNER JOIN user_courses ON user_courses.course_id = courses.id + WHERE user_courses.user_id = ? + `; + connection.query(sql, [userId], (err, results) => { + if (err) { + console.error('Error fetching user courses:', err); + return res.status(500).send('Failed to fetch user courses.'); + } + res.json(results); + }); +}); // Start server -const PORT = process.env.PORT || 3000; +const PORT = process.env.PORT || 30011; app.listen(PORT, () => { console.log(`Server running on port ${PORT}`); }); \ No newline at end of file