· 4 years ago · May 23, 2021, 03:36 AM
1const express = require('express');
2const session = require('express-session');
3const app = express();
4const server = require('http').Server(app);
5const io = require('socket.io')(server);
6const morgan = require('morgan');
7const path = require('path');
8const rfs = require('rotating-file-stream');
9const fs = require("fs");
10//const mysql = require('mysql');
11const { JSDOM } = require('jsdom');
12
13
14// static path mappings
15app.use('/private/js', express.static('./private/js'));
16app.use('/private/css', express.static('./private/css'));
17app.use('/private/images', express.static('./private/images'));
18app.use('/private/html', express.static('./private/html'));
19
20app.use(session(
21 {
22 secret:'extra text that no one will guess',
23 name:'wazaSessionID',
24 resave: false,
25 saveUninitialized: true
26 }));
27
28 const accessLogStream = rfs.createStream('access.log', {
29 interval: '1d', // rotate daily
30 path: path.join(__dirname, 'log')
31 });
32
33 app.use(morgan(':referrer :url :user-agent',
34 { stream: accessLogStream }));
35
36
37app.get('/', function (req, res) {
38 let doc = fs.readFileSync('./private/html/login.html', "utf8");
39 let dom = new JSDOM(doc);
40 let $ = require("jquery")(dom.window);
41
42 initDB();
43
44 res.set('Server', 'Wazubi Engine');
45 res.set('X-Powered-By', 'Wazubi');
46 res.send(dom.serialize());
47
48});
49
50// app.get('/', function (req, res) {
51// let doc = fs.readFileSync('./private/html/landing.html', "utf8");
52// let dom = new JSDOM(doc);
53// let $ = require("jquery")(dom.window);
54
55
56// res.set('Server', 'Wazubi Engine');
57// res.set('X-Powered-By', 'Wazubi');
58// res.send(dom.serialize());
59
60// });
61
62// socket.io codes
63var userCount = 0;
64
65io.on('connect', function(socket) {
66 console.log("hi sam");
67 userCount++;
68 let str = "anonymous";
69 socket.userName = str;
70 io.emit('user_joined', { user: socket.userName, numOfUsers: userCount });
71 console.log('Connected users:', userCount);
72
73 socket.on('disconnect', function(data) {
74 userCount--;
75 io.emit('user_left', { user: socket.userName, numOfUsers: userCount });
76
77 console.log('Connected users:', userCount);
78 });
79
80 socket.on('chatting', function(data) {
81
82 console.log('User', data.name, 'Message', data.message);
83
84 // if you don't want to send to the sender
85 //socket.broadcast.emit({user: data.name, text: data.message});
86
87 if(socket.userName == "anonymous") {
88
89
90 io.emit("chatting", {user: data.name, text: data.message,
91 event: socket.userName + " is now known as " + data.name});
92 socket.userName = data.name;
93
94 } else {
95
96 io.emit("chatting", {user: socket.userName, text: data.message});
97
98 }
99
100
101 });
102
103});
104
105
106
107async function initDB() {
108
109 const mysql = require('mysql2/promise');
110 const connection = await mysql.createConnection({
111 host: 'localhost',
112 user: 'root',
113 password: '',
114 multipleStatements: true
115 });
116
117 console.log("DB connected");
118 const createDBAndTables = `CREATE DATABASE IF NOT EXISTS test;
119 use test;
120 CREATE TABLE IF NOT EXISTS user (
121 ID int NOT NULL AUTO_INCREMENT,
122 email varchar(30),
123 password varchar(30),
124 PRIMARY KEY (ID));`;
125
126 await connection.query(createDBAndTables);
127 let results = await connection.query("SELECT COUNT(*) FROM user");
128 let count = results[0][0]['COUNT(*)'];
129
130 if(count < 1) {
131 results = await connection.query("INSERT INTO user (email, password) values ('arron_ferguson@bcit.ca', 'admin')");
132 console.log("Added one user record.");
133 }
134 if(count < 2) {
135 results = await connection.query("INSERT INTO user (email, password) values ('samuel_cheon@bcit.ca', 'admin')");
136 console.log("Added one user record.");
137 }
138 connection.end();
139}
140
141
142
143app.get('/landing', function(req, res) {
144
145 if(req.session.loggedIn) {
146
147 console.log("session succesful!");
148
149 let templateFile = fs.readFileSync('./private/html/landing.html', "utf8");
150 let templateDOM = new JSDOM(templateFile);
151 let $template = require("jquery")(templateDOM.window);
152
153 $template("#user").html(req.session.email);
154
155 // let left = fs.readFileSync('./private/templates/left_comp.html', "utf8");
156 // let leftDOM = new JSDOM(left);
157 // let $left = require("jquery")(leftDOM.window);
158 // $template("#left_holder").replaceWith($left("#left-content"));
159
160 // let middle = fs.readFileSync('./private/templates/middle_comp.html', "utf8");
161 // let middleDOM = new JSDOM(middle);
162 // let $middle = require("jquery")(middleDOM.window);
163 // $template("#middle_holder").replaceWith($middle("#middle-content"));
164
165 // let right = fs.readFileSync('./private/templates/right_comp.html', "utf8");
166 // let rightDOM = new JSDOM(right);
167 // let $right = require("jquery")(rightDOM.window);
168 // $template("#right_holder").replaceWith($right("#right-content"));
169
170 res.set('Server', 'Wazubi Engine');
171 res.set('X-Powered-By', 'Wazubi');
172 res.send(templateDOM.serialize());
173
174 } else {
175 res.redirect('/');
176 console.log("failed two");
177 }
178
179
180});
181
182
183app.use(express.json());
184app.use(express.urlencoded({ extended: true }))
185
186
187app.post('/authenticate', function(req, res) {
188 res.setHeader('Content-Type', 'application/json');
189
190 let results = authenticate(req.body.email, req.body.password,
191 function(rows) {
192 if(rows == null) {
193 res.send({ status: "fail", msg: "User account not found." });
194 console.log("failed one");
195 } else {
196 req.session.loggedIn = true;
197 req.session.email = rows.email;
198 req.session.save(function(err) {
199 })
200 res.send({ status: "success", msg: "Logged in." });
201 }
202 });
203
204});
205
206
207function authenticate(email, pwd, callback) {
208
209 const mysql = require('mysql2');
210 const connection = mysql.createConnection({
211 host: 'localhost',
212 user: 'root',
213 password: '',
214 database: 'test'
215 });
216
217 connection.query(
218 "SELECT * FROM user WHERE email = ? AND password = ?", [email, pwd],
219 function (error, results) {
220 if (error) {
221 throw error;
222 }
223
224 if(results.length > 0) {
225 return callback(results[0]);
226 } else {
227 return callback(null);
228 }
229
230 });
231
232}
233
234
235app.get('/logout', function(req,res){
236 req.session.destroy(function(error){
237 if(error) {
238 console.log(error);
239 }
240 });
241 res.redirect("/landing");
242})
243
244
245// RUN SERVER
246let port = 8000;
247app.listen(port, function () {
248 console.log('Listening on port ' + port + '!');
249})
250