// Good code != pretty code
// Good code != pretty code
import pkg from 'pg';
import express from 'express';
import bodyParser from 'body-parser';
import url from 'url'
import { fileURLToPath } from 'url';
import path from 'path';
import ejs from 'ejs';
// Set up express app
const app = express();
const port = 3000;
const { Pool } = pkg;
const noEmail = false;
const goodPW = false;
// new Object user
const __dirname = path.dirname(fileURLToPath(import.meta.url)); // Gets the current file path/directory and defines it as dirname
app.use(express.static(path.join(__dirname, 'public'))); // Selects the directory for static files
console.log('Static directory:', path.join(__dirname));
// Set up body parser middleware to handle form data
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
//Setting up view engine
app.set('view engine', 'ejs');
// PostgreSQL database connection configuration
const pool = new Pool({
host: 'localhost', // PostgreSQL server host
user: 'postgres', // PostgreSQL username
password: 'password', // PostgreSQL password
database: 'db1', // Database name
port: 5432, // Port
});
// Function to insert data into the PostgreSQL database
async function insertData(name, pass, email) {
try {
const client = await pool.connect(); // Connects to the db
// Prepare the SQL query to insert data
const sql = 'INSERT INTO users (name, pass, email) VALUES ($1, $2, $3) RETURNING *';
const values = [name, pass, email];
// Execute the query
const res = await client.query(sql, values);
console.log('Data inserted:', res.rows[0]);
client.release(); // Release the client back to the pool
} catch (error) {
console.error('Error inserting data into the database:', error);
}
}
app.post('/submit', async (req, res) => {
const {name, pass, email} = req.body;
let enteredInfo = res.rows;
//Insert data into the db
await insertData(name, pass, email);
//Send respons back to user + debugging
console.log("Data submitted successfully")
res.render('submit.ejs');
return enteredInfo
});
// const [info]
app.post('/adminData', async (req, res) =>{
// const {name, pass, email} = req.body;
console.log("Hello")
});
async function login(email, pass, userEmail, userPass){
console.log("Login function called")
}
async function count(emailSubmit){
const client = await pool.connect();
const email = emailSubmit.email;
const pass = emailSubmit.pass;
console.log(`email submitted: ${email}`);
console.log(`password submitted: ${pass}`);
const count = `SELECT count(*) FROM users WHERE email = '${email}'`; // Need the quotes around the ${email} so it takes it as a string
const res = await client.query(count)
const resRows = res.rows;
const [dResRows] = resRows; ///Destructuring the JSON format, takes the JSON thingy and turns it into an array that allows its contents to be accessed by variables
const numRows = dResRows.count // Number of returned rows
console.log(`number of returned rows: ${numRows}`)
if(numRows < 1){ //User isn't in database
const noEmail = true;
console.log("User doesn't have an email")
return noEmail;
}
else{ //User is in database
console.log("User does have an email")
const noEmail = false;
login(email)
return noEmail;
};
};
async function pwCheck(userPass, pass){
if(userPass === pass){
console.log("passwords match")
const goodPW = true;
return goodPW;
}
else{
console.log("Passwords don't match")
const goodPW = false;
return goodPW;
}
}
// Call function in /profile to get user data, if they havent signed in it'll throw an error, catch and handle, BOSH
app.post('/middle', async (req, res) => {
const emailSubmit = req.body;
try{
const client = await pool.connect();
const noEmail = await count(emailSubmit); //Calling the count function
const email = emailSubmit.email;
const pass = emailSubmit.pass; // Entered password
res.locals.email = email;
if (noEmail == false){
const sql = `SELECT * FROM users WHERE email = '${email}'`;
const res1 = await client.query(sql);
const [user] = res1.rows;
const userEmail = user.email;
const userPass = user.pass; // Password of the user
const name = user.name;
console.log(`User email: ${userEmail}`);
console.log(`User password: ${userPass}`);
// const goodPW = await pwCheck(userPass, pass);
console.log(`Log in says, noEmail = ${noEmail}`)
console.log(user)
res.render('profile.ejs', { userEmail, userPass, name });
}
else{
console.log("No email found in the system")
console.log(`Log in says, noEmail = ${noEmail}`)
res.redirect('/signin');
}
} catch (error) {
count(emailSubmit);
console.error('Error in getting data from the database:', error);
}
});
async function getData(email){
console.log("getData called")
const client = await pool.connect();
const sql = `SELECT * FROM users where email = '${email}'`;
const res = await client.query(sql);
console.log(`Data got: ${res.rows}`);
}
// app.get('/login', (req, res) => {
// try{
// getData(email);
// res.render('profile.ejs', { email })
// }catch(error){
// console.log('Error in displaying error)
// }
// });
//Requirements for the bookings table
// ID
// email
// day
// time
//Requirements for the hotel table
// ID
// Email
// eDate (entry date)
// lDate (leave date)
// type (room type, how many beds)
//Loyalty scheme could be something along the lines of get points for booking and then store them in the users table, display them upon logging in
// Start the server
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}`);
});
// Pushes index.ejs to the res object
app.get('/', (req, res) => {
res.render('index.ejs');
});
app.get('/access', (req, res) => {
res.render('access.ejs');
});
app.get('/signup', (req, res) => {
res.render('signup.ejs');
});
app.get('/signin', (req, res) => {
res.render('signin.ejs', noEmail);
});
app.get('/admin', (req, res) => {
res.render('adminsignin.ejs');
});
app.get('/test', (req, res) => {
res.render('test.ejs');
});
//404 error handling
app.use((req, res, next) => {
res.status(404).send("404, page not found")
});
app.use((err, req, res, next) => {
res.locals.error = err;
const status = err.status || 500;
res.status(status);
res.render('error');
});
// Good code != pretty code
import express from 'express';
import pg from 'pg';
import bodyParser from 'body-parser';
import path from 'path';
import { fileURLToPath } from 'url';
const app = express(); // Defines the express app
const port = 3000; // Define port
const { Pool } = pg;
let hasEmail = false;
const __dirname = path.dirname(fileURLToPath(import.meta.url));
app.use(express.static(path.join(__dirname, 'public')));
console.log('Static directory:', path.join(__dirname));
// Set up body parser middleware to handle form data
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
//Setting up view engine
app.set('view engine', 'ejs');
const pool = new Pool({
host: 'localhost',
user: 'postgres',
password: 'password',
database: 'db1',
port: 5432
});
const foo = "Balls";
function foo1(){
console.log(balls);
}
app.get('/', (req, res) => {
res.render('index.ejs', {foo})
});
async function insertData(name,email, pass){
try{
const client = await pool.connect()
const sql = 'insert into users (name, email, pass) values ($1, $2, $3) RETURNING *';
const values = [name, email, pass];
console.log("Name is: ",name);
const res = await client.query(sql, values);
console.log('Data inserted:', res.rows[0]);
client.release();
} catch(error){
console.log(`Error inserting data into database ${error}`);
}
};
async function emailCheck(email){
try{
const client = await pool.connect()
const sql = `select count(*) from users where email = '${email}'`;
const res = await client.query(sql)
client.release();
const count = res.rows;
const [rows] = count;
const tRows = rows.count; // Total rows
console.log(`Returned rows ${tRows}`);
if(tRows < 1){
console.log("User does not have an account");
hasEmail = false;
return hasEmail
}
else if(tRows <= 1){
console.log("User has an account")
hasEmail = true;
return hasEmail;
};
}catch(error){
console.log(`Error checking email: ${error}`);
}
}
app.post('/submit', async (req, res) => {
try{
const { name, email, pass } = req.body;
let info = res.rows;
let hasEmail = await emailCheck(email);
console.log(`Has email?: ${hasEmail}`);
if (hasEmail == true){
res.redirect('no');
return;
}
else(
insertData(name, email, pass)
);
res.render('submit.ejs', {info, name})
// return info;
}catch(error){
console.log(`Error submitting data to database${error}`)
}
});
app.get('/login', (req, res) => {
res.render('logIn.ejs')
});
async function getData(email, pass){
try{
const client = await pool.connect();
const sql = `select * from users where email = '${email}'`;
const res = await client.query(sql);
const rows = res.rows;
const [user] = rows; // Destructuring
return user;
} catch(error){
console.log(`Error getting data from the database ${error}`)
}
};
app.post('/profile', async (req, res) => {
const { email, pass } = req.body;
const user = await getData(email, pass);
// console.log(`User password: ${user.pass}`);
// console.log(`Entered password: ${pass}`);
if(user.pass === pass){
console.log("Password correct")
res.render('profile.ejs', {email});
return;
}
else{
console.log("Password incorrect");
res.redirect('/');
}
});
app.get('/no', (req, res) => {
res.render('no.ejs');
});
app.listen(port, () => {
console.log(`App is running on port ${port}`)
});
//404 error handling
app.use((req, res, next) => {
res.status(404).send("404, page not found")
});