forked from cs4241-19a/a3-persistence
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.js
More file actions
152 lines (135 loc) · 4.44 KB
/
server.js
File metadata and controls
152 lines (135 loc) · 4.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
const html = require('html'),
mime = require('mime'),
express = require('express'),
server = express(),
bodyparser = require('body-parser'),
low = require('lowdb'),
FileSync = require('lowdb/adapters/FileSync'),
adapter = new FileSync('db.json'),
db = low(adapter),
passport = require('passport'),
LocalStrategy = require('passport-local').Strategy,
session = require('express-session'),
compression = require('compression'),
morgan = require('morgan');
var jobs = [];
var users = [];
const myLocalStrategy = function(username, password, done) {
console.log('Trying to authenticate');
const user = db.get('users').find({username: username}).value();
let creds = {username: username, password: password};
if(!user) {
users.push(creds);
db.get('users')
.push(creds)
.write();
console.log('New user created: ', creds);
return done(null, creds);
}
else {
if(user.password === password) {
console.log('User authenticated: ', creds)
return done(null, creds);
}
else {
console.log('Bad login: username or password incorrect');
return done(null, false, {message: 'Bad login: username or password incorrect'});
}
}
}
// Packages to use
server.use(session({ secret: 'secret', resave: false, saveUninitialized: false }));
server.use(morgan('dev'));
server.use(express.static('public'));
server.use(bodyparser.urlencoded({extended: true}));
server.use(bodyparser.json());
passport.use(new LocalStrategy(myLocalStrategy));
server.use(passport.initialize());
server.use(passport.session());
server.use(compression());
// Setting defaults for empty JSON file
db.defaults({ jobs: [], users: [{username: 'admin', password: 'admin'}], count: 0})
.write();
// Serializing users via passport
passport.serializeUser((user, done) => done(null, user.username));
// Deserializing users via passport
passport.deserializeUser((username, done) => {
const user = db.get('users').find({username: username}).value();
console.log('Deserializing: ', username);
if(user) {
console.log('Deserializing succeeded for user: ', user);
done(null, user);
}
else {
console.log('Deserializing failed');
done(null, false, {message: 'User not found, session unable to be restored'});
}
});
// Explicity handle domain name
server.get('/', function(req, res) {
res.sendFile(__dirname + '/public/views/index.html');
});
// Explicitly handle login page
server.get('/login', function(req, res) {
res.sendFile(__dirname + '/public/views/login.html');
});
// Handling requests for job data for tables
server.get('/tables', function(req, res) {
res.writeHead(200, {'Content-Type': 'application/json'});
res.end(JSON.stringify(jobs));
});
server.get('/username', function(req, res) {
res.writeHead(200, {'Content-Type': 'application/json'});
console.log('Current user is: ', req.user);
if(typeof(req.user) === 'undefined') {
let fakeUser = {username: '!display'};
res.end(JSON.stringify(fakeUser))
}
else res.end(JSON.stringify(req.user));
})
// Alert on bad logins
server.get('/badLogin', function(req, res) {
console.log('Bad Login: something went wrong with the authentication');
});
// Handling posts from form submissions
server.post('/submit', bodyparser.json(),
function(req, res) {
req.body['owner'] = req.user.username;
let dupe = db.get('jobs').find({job: req.body.job}).value();
console.log('Dupe should be:', db.get('jobs').find({job: req.body.job}).value())
console.log('Dupe:', dupe);
if(typeof(dupe) != 'undefined') {
db.get('jobs')
.remove({job: req.body['job']})
.write();
jobs = jobs.filter(function(value, index, arr) {
return value.job != req.body['job'];
})
console.log(jobs);
}
jobs.push(req.body);
db.get('jobs')
.push(req.body)
.write();
res.writeHead(200, {'Content-Type': 'application/json'});
res.end(JSON.stringify(jobs));
});
// Passport authentication on login
server.post('/login',
passport.authenticate('local', {failureRedirect: '/badLogin'}),
function(req, res) {
res.json({status: true});
}
);
// Updating server memory from file
db.get('jobs').value().forEach(job => {
jobs.push(job);
});
db.get('users').value().forEach(user => {
users.push(user);
});
console.log('Current jobs stored are listed below');
console.log(jobs);
console.log('Current users stored are listed below');
console.log(users);
server.listen(process.env.PORT || 3000);