-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.js
136 lines (121 loc) · 4.38 KB
/
server.js
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
var express = require('express');
_ = require("underscore");
fs = require("fs");
var bodyParser = require('body-parser');
var path = require("path");
var https = require('https');
var privateKey = fs.readFileSync('key.pem', 'utf8');
var certificate = fs.readFileSync('cert.cer', 'utf8');
var getDataFunction = require("./getData");
var hbs = require("hbs");
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var sql = require("sqlite3");
var cookieParser = require('cookie-parser');
var methodOverride = require("method-override");
var session = require("express-session");
// function used by passport to find user in the database by a given id
function findById(id, fn) {
var db = new sql.Database("football.db");
db.all("SELECT * FROM users WHERE id = ? ", [id], function(err, user){
db.close();
user = user[0];
if(user) return fn(null, user);
return fn(new Error('User ' + id + ' does not exist'));
});
}
// function used by passport to find user in the database by a given username
function findByUsername(username, fn) {
var db = new sql.Database("football.db");
db.all("SELECT * FROM users WHERE username = ? ", [username], function(err, user){
db.close();
user = user[0];
if(user) fn(null, user);
else fn(null, null);
});
}
function ensureAuthenticated(request, response, next) {
if (request.isAuthenticated()) { return next(); }
response.redirect('/admin');
}
// setup authentication
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
findById(id, function (err, user) {
done(err, user);
});
});
passport.use(new LocalStrategy(
function(username, password, done) {
process.nextTick(function () {
findByUsername(username, function(err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false, { message: 'Unknown user ' + username }); }
if (user.password != password) { return done(null, false, { message: 'Invalid password' }); }
return done(null, user);
})
});
}
));
// express server settings
var app = express();
app.use(bodyParser.urlencoded({ extended:false }));
app.use(express.static(__dirname + '/app'));
app.use('/node_modules', express.static(path.join(__dirname, "node_modules")));
app.set('view engine', 'hbs');
app.use(cookieParser());
app.use(methodOverride());
app.use(session({ secret: 'keyboard cat', resave:false, saveUninitialized:true }));
app.use(passport.initialize());
app.use(passport.session());
// initial data GET route
app.get("/getData", function(request, response){
getDataFunction(function(err, data) {
if(err) throw err;
response.json(data);
});
});
// admin login page GET route
app.get('/admin', function(request, response) {
response.render("login");
});
// admin login page POST route
app.post('/admin', passport.authenticate('local', { failureRedirect: '/admin' }),
function(request, response) {
response.redirect('/addData');
});
// admin logout route
app.get('/logout', function(request, response){
request.logout();
response.redirect('/');
});
// admin data handling GET route
app.get("/addData", ensureAuthenticated, function(request,response){
getDataFunction(function(err, data) {
var matches = _.where(data.results, {status:"Not started"});
matches = _.sortBy(matches, function(match){
return match.date;
});
if(err) throw err;
else response.render("addData", { user: request.user, matches:matches });
});
});
// admin data POST route
app.post("/addData", ensureAuthenticated, function(request,response){
var data = request.body;
var db = new sql.Database("football.db");
for (var i = 0; i < data.id.length; i++) {
if(data.scoreHome[i] && data.scoreAway[i]){
db.run("UPDATE results SET scoreHome = ?, scoreAway = ?, status = 'Finished' WHERE id = ?", [ parseInt(data.scoreHome[i]), parseInt(data.scoreAway[i]), parseInt(data.id[i]) ]);
}
}
db.close();
response.redirect("/addData");
});
// run server
var credentials = {key: privateKey, cert: certificate};
var httpsServer = https.createServer(credentials, app);
console.log("App listening on https://localhost:3000/");
httpsServer.listen(3000);