const express = require("express");
const { faker } = require("@faker-js/faker");
const mysql = require("mysql2");
const app = express();
const path = require("path");
const methodOverride = require("method-override");
const { v4: uuidv4 } = require("uuid");
const bcrypt = require("bcrypt"); // Import bcrypt for password hashing
let port = 3000;
app.use(methodOverride("_method"));
app.use(express.urlencoded({ extended: true }));
app.set("view engine", "ejs");
app.set("views", path.join(__dirname, "/views"));
const conn = mysql.createConnection({
host: 'localhost',
user: 'root',
database: 'myapp',
password: 'Sk@123456'
});
// Home route
app.get("/", (req, res) => {
let q = `SELECT count(*) FROM user`;
conn.query(q, (err, result) => {
if (err) throw err;
let count = result[0]["count(*)"];
res.render("home.ejs", { count });
});
});
// Show all users route
app.get("/user", (req, res) => {
let q = `SELECT * FROM user`;
conn.query(q, (err, data) => {
if (err) throw err;
res.render("users.ejs", { data });
});
});
// Edit user route
app.get("/user/:id/edit", (req, res) => {
let { id } = req.params;
let q = `SELECT * FROM user WHERE id='${id}'`;
conn.query(q, (err, result) => {
if (err) throw err;
let user = result[0];
res.render("edit.ejs", { user });
});
});
// Update user route
app.patch("/user/:id", (req, res) => {
let { id } = req.params;
let { username, password } = req.body;
let q = `SELECT * FROM user WHERE id='${id}'`;
conn.query(q, (err, result) => {
if (err) throw err;
let user = result[0];
// Check if the password entered matches the user's password
if (user.password !== password) {
res.send("WRONG Password entered!");
} else {
// Update the username
let q2 = `UPDATE user SET username='${username}' WHERE id='${id}'`;
conn.query(q2, (err) => {
if (err) throw err;
console.log("Username updated!");
res.redirect("/user");
});
}
});
});
// Add new user route
app.get("/user/new", (req, res) => {
res.render("new.ejs");
});
app.post("/user/new", (req, res) => {
let { username, email, password } = req.body;
let id = uuidv4();
// Hash the password before storing
bcrypt.hash(password, 10, (err, hash) => {
if (err) throw err;
// Query to insert new user
let q = `INSERT INTO user (id, username, email, password) VALUES ('${id}', '$
{username}', '${email}', '${hash}')`;
conn.query(q, (err) => {
if (err) throw err;
console.log("Added new user");
res.redirect("/user");
});
});
});
// Delete user route
app.delete("/user/:id", (req, res) => {
let { id } = req.params;
let { password } = req.body; // Get password from the request body
let q = `SELECT * FROM user WHERE id='${id}'`;
conn.query(q, (err, result) => {
if (err) throw err;
let user = result[0];
// Check if the password entered matches the stored hashed password
bcrypt.compare(password, user.password, (err, isMatch) => {
if (err) throw err;
if (!isMatch) {
return res.send("WRONG Password entered!");
}
let q2 = `DELETE FROM user WHERE id='${id}'`; // Query to delete user
conn.query(q2, (err) => {
if (err) throw err;
console.log("User deleted!");
res.redirect("/user");
});
});
});
});
app.listen(port, () => {
console.log('Server is running');
});