Club-Management-System / routes / index.js
index.js
Raw
/* eslint-disable no-useless-return */
/* eslint-disable max-len */
/* eslint-disable no-shadow */
/* eslint-disable no-unused-vars */
/* eslint-disable consistent-return */
/* eslint-disable no-console */
var express = require('express');
var router = express.Router();
var nodemailer = require('nodemailer');
const http = require('http');
const socketIO = require('socket.io');
const { connect } = require('http2');



const app = express();
const server = http.createServer(app);
const io = socketIO(server);
/* GET home page. */
router.get('/', function (req, res, next) {
  res.render('index', { title: 'Express' });
});

/* This is merely an example and does not need to be here when all is finished */
router.get('/db_example_get_all_names', function (req, res, next) {
  // Used to retreive all the names and usernames of all users in the database
  req.pool.getConnection(function (connection_err, connection) {
    // Error check
    if (connection_err) {
      res.sendStatus(500);
      return;
    }

    // Form our query
    let query = "SELECT first_name, last_name, username FROM Users";

    // Query the database
    connection.query(query, function (query_err, rows, fields) {
      // Release the connection as we have our results
      connection.release();

      // Error check
      if (query_err) {
        res.sendStatus(500);
        return;
      }

      // Check if exists
      if (rows.length > 0) {
        // Results found
        res.send(JSON.stringify(rows));
      } else {
        // No results found
        res.sendStatus(404);
      }
    });
  });
});

router.post('/db_example_create_user', function (req, res, next) {
  // Get the user data from the request body
  const {
    first_name, last_name, username, email, password, phone_number
  } = req.body;

  // Check if everything looks correct
  // console.log(first_name, last_name, username, email, password, phone_number);
  if (first_name === "") {
    res.sendStatus(400);
    return;
  }
  if (last_name === "") {
    res.sendStatus(400);
    return;
  }
  if (username === "") {
    res.sendStatus(400);
    return;
  }
  if (email === "") {
    res.sendStatus(400);
    return;
  }
  if (password === "") {
    res.sendStatus(400);
    return;
  }
  if (phone_number === "") {
    res.sendStatus(400);
    return;
  }

  req.pool.getConnection(function (connection_err, connection) {
    // Error check
    if (connection_err) {
      res.sendStatus(500);
      return;
    }

    // Form our query to insert a new user
    let query = "INSERT INTO Users (first_name, last_name, username, email, password, phone_number) VALUES (?, ?, ?, ?, ?, ?)";

    // Query the database to insert the new user
    connection.query(
      query,
      [first_name, last_name, username, email, password, phone_number],
      function (query_err, result) {
        // Release the connection as we have our results
        connection.release();

        // Error check
        if (query_err) {
          res.sendStatus(500);
          return;
        }

        // Check if the user was added successfully
        if (result.affectedRows === 1) {
          // User was added successfully
          res.sendStatus(200);
        } else {
          // User was not added
          res.sendStatus(500);
        }
      }
    );
  });
});

/* End example code */
router.post('/login', (req, res) => {
  const { email, password } = req.body;
  req.pool.getConnection(function (connection_err, connection) {
    // Error check
    if (connection_err) {
      res.sendStatus(500);
      return;
    }

    // Form our query
    let query = "SELECT id, first_name, last_name, username, is_admin FROM Users WHERE email LIKE ? AND password LIKE ?";

    // Query the database
    connection.query(query, [email, password], function (query_err, rows, fields) {
      // Release the connection as we have our results
      connection.release();

      // Error check
      if (query_err) {
        res.sendStatus(500);
        return;
      }

      // Check if exists
      if (rows.length > 0) {
        req.cookies.logged_in = true;
        res.sendStatus(200);
      }

    });

  });
});

router.post('/login_check', (req, res, next) => {
  if (req.cookies.logged_in === true) {
  console.log(req.cookies);
  }
  if (req.cookies.logged_in) {
    res.sendStatus(200);
  } else {
    res.sendStatus(401); // Redirect to login page or any other appropriate page
  }
});





router.post('/sign_up', (req, res, next) => {
  // Get the user data from the request body
  const {
    first_name, last_name, username, email, password, phone_number
  } = req.body;

  // Check if everything looks correct
  // console.log(first_name, last_name, username, email, password, phone_number);
  if (first_name === "") {
    res.sendStatus(400);
    return;
  }
  if (last_name === "") {
    res.sendStatus(400);
    return;
  }
  if (username === "") {
    res.sendStatus(400);
    return;
  }
  if (email === "") {
    res.sendStatus(400);
    return;
  }
  if (password === "") {
    res.sendStatus(400);
    return;
  }
  if (phone_number === "") {
    res.sendStatus(400);
    return;
  }

  req.pool.getConnection(function (connection_err, connection) {
    // Error check
    if (connection_err) {
      res.sendStatus(500);
      return;
    }

    // Form our query to insert a new user
    let query = "INSERT INTO Users (first_name, last_name, username, email, password, phone_number) VALUES (?, ?, ?, ?, ?, ?)";

    // Query the database to insert the new user
    connection.query(
      query,
      [first_name, last_name, username, email, password, phone_number],
      function (query_err, result) {
        // Release the connection as we have our results
        connection.release();

        // Error check
        if (query_err) {
          res.sendStatus(500);
          return;
        }

        // Check if the user was added successfully
        if (result.affectedRows === 1) {
          // User was added successfully
          res.sendStatus(200);
        } else {
          // User was not added
          res.sendStatus(500);
        }
      }
    );
  });
});

const transporter = nodemailer.createTransport({
  service: 'gmail',
  auth: {
    user: 'salihmarwan6@gmail.com',
    pass: 'ymddorcqytvygzxw'
  }
});

function generateToken(length = 20) {
  let token = '';
  const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';

  for (let i = 0; i < length; i++) {
    const randomIndex = Math.floor(Math.random() * characters.length);
    token += characters.charAt(randomIndex);
  }

  return token;
}


router.post('/reset_password', (req, res) => {
  const { email, username } = req.body;

  req.pool.getConnection(function (connection_err, connection) {
    // Error check
    if (connection_err) {
      res.sendStatus(500);
      return;
    }
    // Check if the email exists in your database
    let query = 'SELECT * FROM Users WHERE email LIKE ? AND username LIKE ?';

    connection.query(query, [email, username], function (query_err, rows) {
      // Release the connection as we have our results
      connection.release();

      // Error check
      if (query_err) {
        res.sendStatus(500);
      }

      if (rows.length === 0) {
        // Email doesn't exist in the database
        res.sendStatus(404);
      } else {
        return res.sendStatus(200);
      }
    });

    let token = generateToken();
    query = 'UPDATE Users SET reset_token = ? WHERE email = ?';

    connection.query(query, [token, email], function (query_err, rows) {
      connection.release();
      if (query_err) {
        console.error(query_err);
        return res.sendStatus(500);
      }

      const htmlContent = `
        <h1><strong> Confirmation Passowrd Reset </strong></h1>
        <h2> Your Password has been reset </h2>
        <br>
        <h3><strong>If you did not intend to reset your password, please contact us at: salihmarwan6@gmail.com </strong></h3>
        <br>
        <h3>If you did intend to reset your password, please ignore this email</h3>
        <br>
        <p>Kind regards, <br> University Of Adelaide Clubs Support Team</p>
        `;
      const mailOptions = {
        from: 'salihmarwan6@gmail.com',
        to: email,
        subject: 'Password Reset Confrimed :)',
        html: htmlContent
      };

      transporter.sendMail(mailOptions, function (query_err) {
        if (query_err) {
          console.error(query_err);
          res.sendStatus(500);
          return;
        }
        token = null;
        return res.sendStatus(200);
      });
    });
  });



});

/*
GET request for all the clubs.
*/
router.get('/get_all_clubs', function (req, res, next) {
  req.pool.getConnection(function (connection_err, connection) {
    // Error check
    if (connection_err) {
      res.sendStatus(500);
      return;
    }

    // Form our query
    let query = "SELECT id, name, description FROM Clubs";

    // Query the database
    connection.query(query, function (query_err, rows, fields) {
      // Release the connection as we have our results
      connection.release();

      // Error check
      if (query_err) {
        res.sendStatus(500);
        return;
      }

      // Send the result, I do not care if there are no results
      res.send(JSON.stringify(rows));
    });
  });
});

/*
GET request for club updates
*/
router.get('/get_updates', function (req, res, next) {
  req.pool.getConnection(function (connection_err, connection) {
    // Error check
    if (connection_err) {
      console.error(connection_err);
      res.sendStatus(500);
      return;
    }

    // Form our query
    let query = `
    SELECT name, description, posted
    FROM ClubUpdates
    ORDER BY posted DESC;
    `;

    // Query the database
    connection.query(query, function (query_err, rows, fields) {
      // Release the connection as we have our results
      connection.release();

      // Error check
      if (query_err) {
        console.error(query_err);
        res.sendStatus(500);
        return;
      }

      // Send the result, I do not care if there are no results
      res.send(JSON.stringify(rows));
    });
  });
});

/*
GET request for club events
*/
router.get('/get_events', function (req, res, next) {
  req.pool.getConnection(function (connection_err, connection) {
    // Error check
    if (connection_err) {
      console.error(connection_err);
      res.sendStatus(500);
      return;
    }

    // Form our query
    let query = `
    SELECT name, description, happening
    FROM ClubEvents
    WHERE happening > NOW()
    ORDER BY happening ASC;
    `;

    // Query the database
    connection.query(query, function (query_err, rows, fields) {
      // Release the connection as we have our results
      connection.release();

      // Error check
      if (query_err) {
        console.error(query_err);
        res.sendStatus(500);
        return;
      }

      // Send the result, I do not care if there are no results
      res.send(JSON.stringify(rows));
    });
  });
});

/*
GET requests for club information
*/

router.get('/get_clubinfo', function (req, res, next) {
  req.pool.getConnection(function (connection_err, connection) {
    // Error check
    if (connection_err) {
      res.sendStatus(500);
      return;
    }
    const { club_id } = req.query;
    let query = `
    SELECT
    name, description
    FROM
    Clubs
    WHERE
    id = ?;
    `;

    // Query the database
    connection.query(query, [club_id], function (query_err, rows, fields) {
      // Release the connection as we have our results
      connection.release();

      // Error check
      if (query_err) {
        res.sendStatus(500);
        return;
      }

      // Send the result, I do not care if there are no results
      res.send(JSON.stringify(rows));
    });
  });
});

router.get('/get_eventinfo', function (req, res, next) {
  req.pool.getConnection(function (connection_err, connection) {
    // Error check
    if (connection_err) {
      res.sendStatus(500);
      return;
    }
    const { club_id } = req.query;
    let query = `
    SELECT
    id, name, description, happening
    FROM
    ClubEvents
    WHERE
    club_id = ?;
    `;

    // Query the database
    connection.query(query, [club_id], function (query_err, rows, fields) {
      // Release the connection as we have our results
      connection.release();

      // Error check
      if (query_err) {
        res.sendStatus(500);
        return;
      }

      // Send the result, I do not care if there are no results
      res.send(JSON.stringify(rows));
      console.log(JSON.stringify(rows));
    });
  });
});

router.get('/get_eventupdates', function (req, res, next) {
  req.pool.getConnection(function (connection_err, connection) {
    // Error check
    if (connection_err) {
      res.sendStatus(500);
      return;
    }
    const { club_id } = req.query;
    let query = `
    SELECT
    id, name, description, posted
    FROM
    ClubUpdates
    WHERE
    club_id = ?;
    `;

    // Query the database
    connection.query(query, [club_id], function (query_err, rows, fields) {
      // Release the connection as we have our results
      connection.release();

      // Error check
      if (query_err) {
        res.sendStatus(500);
        return;
      }

      // Send the result, I do not care if there are no results
      res.send(JSON.stringify(rows));
    });
  });
});
router.post('/new_admin', (req,res,next) => {
  // Get the user data from the request body
  const {
    first_name,last_name, username, admin_id, phone,email, password
  } = req.body;

req.pool.getConnection(function (connection_err, connection) {
  // Error check
  if (connection_err) {
    res.sendStatus(500);
    return;
  }

  // Form our query to insert a new user
  let query = "INSERT INTO Users (first_name,last_name, username,email, password,phone_number, is_admin) VALUES (?, ?, ?, ?, ?, ?,?)";

  // Query the database to insert the new user
  connection.query(
    query,
    [first_name, last_name, username, email,password, phone, admin_id],
    function (query_err, result) {
      // Release the connection as we have our results
      connection.release();

      // Error check
      if (query_err) {
        res.sendStatus(500);
        return;
      }
     // Check if the user was added successfully
     if (result.affectedRows === 1) {
      // User was added successfully
      res.sendStatus(200);
    } else {
      // User was not added
      res.sendStatus(500);
    }
  }
);
});
});

// Route to check if the user is signed in
router.get('/check_signed_in', function (req, res) {
  return res.sendStatus(200);
});

router.post('/event', (req, res) => {
  const { name, description, happening } = req.body;

  req.pool.getConnection((connection_err, connection) => {
    if (connection_err) {
      console.error('Error establishing database connection:', connection_err);
      res.sendStatus(500);
      return;
    }

    const query = 'INSERT INTO ClubEvents (club_id, name, happening, description) VALUES (?, ?, ?, ?)';
    const values = [1, name, happening, description];

    connection.query(query, values, (query_err, result) => {
      connection.release();

      if (query_err) {
        console.error('Error executing database query:', query_err);
        res.sendStatus(500);
        return;
      }

      if (result.affectedRows === 1) {
        // Event was added successfully
        res.sendStatus(200);
      } else {
        // Event was not added
        res.sendStatus(500);
      }
    });
  });
});


// Handle form submission for new updates
router.post('/update', (req, res) => {
  const { updates } = req.body;

  // Perform validation on the form data
  req.pool.getConnection(function (connection_err, connection) {
    if (connection_err) {
      return res.sendStatus(500);
    }
    // Insert the new update into the database
    let query = 'INSERT INTO ClubUpdates (club_id, description) VALUES (?, ?)';
    let values = [1, updates];

    connection.query(query, values, (error, results) => {
      if (error) {
        res.sendStatus(500);
      } else {
        return res.sendStatus(200);

      }
    });
  });
});


module.exports = router;