app.get(‘/’) not being called
Im trying to get cookies to work to let multiple users be logged in at the same time. Right now, users can log in but once they are logged in and refresh the page, they all get logged in as the same user (the one who logged in last). I think this is due to app.get(‘/’) not being called.
This is my code. I’m sorry if it’s a lot, I don’t know which parts could affect the app.get function
let mysql = require("mysql2");
// Vi inkluderar express i vårt projekt
const express = require("express");
const sessions = require("express-session");
const cookieParser = require("cookie-parser");
const bodyParser = require("body-parser");
const { SourceMap } = require("module");
const { errorMonitor } = require("events");
const { receiveMessageOnPort } = require("worker_threads");
const bcrypt = require("bcrypt");
const { match } = require("assert");
const path = require("path")
// Vi skapar en instans av vår applikation
// genom att anropa express-funktionen
const app = express();
// Vi lägger till HTTP och anropar
// dess serverfunktion och skickar med
// vår express-app
const http = require("http").Server(app);
// Vi lägger till IO, skickar med socket.io
// samt refererar http
const io = require("socket.io")(http);
app.use(express.json());
app.use(express.urlencoded({extended: true}));
app.use(cookieParser());
const oneDay = 1000 * 60 * 60 * 24;
app.use(sessions({
secret: "secret key",
saveUninitialized: true,
cookie: { maxage: oneDay },
resave: false,
}))
// Vi koncentrerar datan så vi kan läsa den. Är du nyfiken
// på vad extended gör så besök body-parser på npmjs.com
// och skrolla ner till rubriken extended.
app.use(bodyParser.urlencoded({extended: false}));
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
let connection = mysql.createConnection({
host: "localhost",
user: "root",
password: "MyPassword",
database: "slutprojekt",
});
var session;
const dirname = './webbsidan'
console.log(__dirname)
// Vi talar om var du ska hamna när någon
// surfar in till vår webbserver. I detta fall
// kommer personen hamna i en mapp som heter
// webbsidan. Där jag kommer placera html-dokument,
// css, bilder etc.
app.use(express.static(path.join(__dirname, '/webbsidan')))
app.get('/', (req, res) => {
console.log('get /')
// console.log(req)
session = req.session;
var Referer = "";
if (req.rawHeaders.indexOf('Referer') != -1){
Referer = req.rawHeaders[req.rawHeaders.indexOf('Referer')+1].split('/')
Referer = Referer[Referer.length-1]
}
console.log(Referer)
if (Referer != 'login.html' && !session.user){
res.sendFile('/webbsidan/login.html', {root: __dirname})
} else if (Referer == 'login.html' && session.user){
res.sendFile('/webbsidan/index.html', {root: __dirname})
}
})
app.post('/login', (req, res) => {
console.log('login-post received');
let sql ="SELECT * FROM användare"
connection.query(sql, function (err, result, fields) {
if (err) throw err;
let loggedIn = false
for (const object of result){
if (object.AnvändarNamn == req.body.username){
if (bcrypt.compareSync(req.body.password, object.Lösenord)){
loggedIn = true;
session=req.session;
session.user=req.body.username;
session.userid=object.AnvändarID;
session.sid=req.rawHeaders[req.rawHeaders.indexOf('Cookie')+1]
// console.log(req.session)
res.redirect('/');
}
else {
// console.log("fel lösenord")
}
break;
}
else {
// console.log('användarnamnet är inte', object.AnvändarNamn);
}
}
if (loggedIn == false){
res.send('<script>alert("Login failed, try again"); window.location.replace("login.html")</script>')
}
})
})
app.post('/updateSchedule', (req, res) => {
console.log('updating schedule')
session = req.session;
let sql1 = `SELECT * FROM kalender_tillgänglig WHERE AnvändarID = ${session.userid}`
connection.query(sql1, function (err, result, fields) {
if (err) throw err;
for (const [key, value] of Object.entries(req.body)) {
if (value == 'x'){
// console.log(`${key}: ${value}`)
var dateID = key.split("_")[1]
// console.log(dateID)
let sql2 = `DELETE FROM kalender_tillgänglig WHERE AnvändarID = ${session.userid} AND dateID = ${dateID}`
connection.query(sql2, function (err, result, fields){
if (err) throw err;
})
}
else if (value != ''){
var dateID = key.split("_")[1]
let valueString = value.toString();
try {
if (err) throw err;
const found = result.some(el => el.dateID == dateID) // Check if date already exists in database
let sql2 = ""
if (found) {
sql2 = `UPDATE kalender_tillgänglig SET Tillgänglig = '${valueString}' WHERE AnvändarID = ${session.userid} AND dateID = ${dateID}`;
} else {
sql2 = `INSERT INTO kalender_tillgänglig (AnvändarID, dateID, Tillgänglig) VALUES (${session.userid}, ${dateID}, '${valueString}')`
}
connection.query(sql2, function(err, result, fields) {
if (err) throw err;
// console.log(sql2)
})
}
catch(e){
throw e;
}
}
}
})
res.redirect('back');
});
app.get('/login', (req, res) => {
res.redirect('/login.html');
})
app.get('/logout', (req, res) => {
req.session.destroy();
// console.log(req.session);
session = req.session;
res.redirect('/login');
});
// Vi lyssnar efter att någon ansluter till
// vår socket. När någon gör det så loggar vi
// ut att en användare har anslutit.
io.on("connection", (socket) => {
if (session){console.log(`${session.user} anslöt.`)} else {console.log('En användare anslöt.')}
function checkDir(){
var splitRef = socket.handshake.headers.referer.split('/');
var newSplitRef = [];
for (let i = 3; i < splitRef.length; i++){
newSplitRef.push(splitRef[i])
}
splitRef = newSplitRef
var splitRefString = ""
splitRef.forEach(element => splitRefString += `/${element}`)
return splitRefString
}
var currentDir = checkDir(); // Här kollas vilken sida användaren är på
if (currentDir == "/login.html") { // om användaren är på login sidan men redan är inloggad omdirigeras den till startsidan
if (session != undefined){
io.emit("redirect", '/')
}
}
else if (session == undefined){ // om användaren inte är inloggad omdirigeras den till login-sidan
io.emit("redirect", '/login')
}
else if ((currentDir == "/") || (currentDir == "/index.html")){ // om användaren är inloggad på startsidan visas en lista med alla användare
console.log(session)
connection.connect(function (err) {
if (err) throw err;
let sql = "SELECT * FROM användare"
connection.query(sql, function (err, result, fields) {
if (err) throw err;
io.emit("result", result);
})
});
}
else if (currentDir == "/mySchedule.html"){ // om användaren är inloggad på mySchedule sidan ritas kalendern
connection.connect(function (err) { // upp med de tiderna användaren redan fyllt i att den är tillgänglig
if (err) throw err;
let sql1 = `SELECT * FROM kalender`
connection.query(sql1, function (err, result, fields) {
if (err) throw err;
io.emit("result", result);
})
let sql2 = `SELECT * FROM kalender_tillgänglig WHERE AnvändarID = ${session.userid}`
connection.query(sql2, function (err, result, fields) {
if (err) throw err;
// console.log(result)
io.emit("availability", result);
})
});
}
else if (currentDir == "/avlblPT.html"){
connection.connect(function (err) {
if (err) throw err;
let sql0 = `SELECT * FROM kalender`
connection.query(sql0, function (err, result0, fields) {
if (err) throw err;
io.emit("result", result0);
})
let sql1 = `SELECT AnvändarID FROM användare`
connection.query(sql1, function (err, result1, fields){
if (err) throw err;
var userCount = result1.length
var dateIDList = []
let sql2 = `SELECT dateID, COUNT(dateID) FROM kalender_tillgänglig WHERE Tillgänglig <> 'x' GROUP BY dateID HAVING COUNT(dateID) > ${userCount-1}`
connection.query(sql2, function (err, result2, fields) {
if (err) throw err;
// console.log("res:",result2)
result2.forEach(element => {
dateIDList.push(element.dateID)
})
// console.log(dateIDList)
dateIDList.forEach(elem => {
let sql3 = `SELECT * FROM kalender_tillgänglig WHERE dateID = ${elem}`
connection.query(sql3, function(err, result3, fields) { //finner varje datum (ett i taget) där alla är tillgängliga
if (err) throw err;
var usersHours = []
result3.forEach(user => { // loopar igenom användare, här börjar uträkningen för att lista ut vilka timmar alla är tillgängliga
const availablePasses = user.Tillgänglig.split(', ')
var availableHours = []
availablePasses.forEach(pass => {
const startStop = pass.split("-")
const start = Number(startStop[0])
const stop = Number(startStop[1])
for (let i = start; i < stop; i++){
availableHours.push(i)
}
})
usersHours.push({'AnvändarID': user.AnvändarID, 'Tillgänglig': availableHours})
})
var intersection = usersHours[0].Tillgänglig // detta kodstycke kollar vilka timmar som finns i alla användares tillgänglighetslistor
for (let i = 1; i < usersHours.length; i++){
intersection = intersection.filter(element => usersHours[i].Tillgänglig.includes(element));
}
var passes = []
function pushTime(pass, tIndex) {
passes[pass].push(intersection[tIndex])
}
function addPass(passIndex) {
passes.push([])
passIndex += 1
return passIndex
}
var pass = 0
addPass(0)
for (let j = 0; j < intersection.length; j++){ // detta ska dela upp intersection i pass om det behövs
if (j+1 < intersection.length){
if (intersection[j]+1 == intersection[j+1]){
pushTime(pass, j)
}
else {
pushTime(pass, j)
pass = addPass(pass)
}
}
else {
pushTime(pass, j)
}
}
console.log("done calculating",passes)
let sql4 = `SELECT * FROM alla_tillgängliga`
connection.query(sql4, function(err, result4, fields) {
if (err) throw err;
// console.log(result4)
// Detta block kallas två gånger. Inte stort problem, bara onödigt
// Detta block kollar om det finns några dagar i alla_tillgängliga tabellen där inte alla är tillgängliga
result4.forEach(elem => {
// console.log(elem.dateID)
if (dateIDList.includes(elem.dateID) == false){
// console.log(`dateID ${elem.dateID} should be removed from table`)
let sql7 = `DELETE FROM alla_tillgängliga WHERE dateID = '${elem.dateID}'`
connection.query(sql7, function (err, result7, fields) {
if (err) throw err;
})
}
})
if (passes[0][0]){
// console.log("everyone is available at the same time")
var passStrings = []
passes.forEach(pass => {
var stringStart = pass[0].toString()
var stringStop = (pass[0]+pass.length).toString()
passStrings.push(`${stringStart}-${stringStop}`)
})
var availabilityString = passStrings.join(", ")
// console.log(availabilityString)
var dateID = result3[0].dateID
const found = result4.some(el => el.dateID == dateID) // Check if date already exists in database
let sql5 = ""
if (found) {
sql5 = `UPDATE alla_tillgängliga SET tider = '${availabilityString}' WHERE dateID = ${dateID}`
}
else {
sql5 = `INSERT INTO alla_tillgängliga (dateID, tider) VALUES (${dateID}, '${availabilityString}')`
}
connection.query(sql5, function(err, result5, fields) {
if (err) throw err;
let sql6 = `SELECT * FROM alla_tillgängliga`
connection.query(sql6, function(err, result6, fields) {
if (err) throw err;
io.emit("availability", result6);
})
})
} else {
// console.log("there is no time during the day where everyone is available")
}
})
})
})
})
})
})
}
})
// Istället för app.listen kör vi nu http.listen
http.listen(3000, () => {
console.log("Servern körs, besök http://localhost:3000");
});
function genDates(start, end){
var getDaysArray = function(start, end) {
for(var arr=[],dt=new Date(start); dt<=new Date(end); dt.setDate(dt.getDate()+1)){
arr.push(new Date(dt));
}
return arr;
};
var newStart = start.toISOString().replace("00:00:00", "10:10:10") // specify time so that no date is skipped or repeated when
var newEnd = end.toISOString().replace("00:00:00", "10:10:10") // time is shifted in march and october
var daylist = getDaysArray(newStart, newEnd);
var datelist= []
daylist.forEach(element => {
datelist.push(element.toISOString().split("T")[0])
})
var dowNameList = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];
let sql1 = `SELECT dateID, fullDate FROM kalender`
connection.query(sql1, function (err, result, fields) {
if (err) throw err;
for (let i = 0; i < daylist.length; i++){
var dowName = daylist[i].toString().split(" ")[0]
var dowNum = dowNameList.indexOf(dowName)
dowNum += 1
const found = result.some(el => el.fullDate == datelist[i]) // Check if date already exists in database
if (!found){
let sql2 = `INSERT INTO kalender (dateID, fullDate, dowName, dowNum) VALUES (${i+1}, '${datelist[i]}', '${dowName}', ${dowNum});`
connection.query(sql2, function (err, result, fields) {
if (err) throw err;
})
}
}
})
}
genDates(new Date("2023-01-01"),new Date("2023-12-31"));