Repository navigation
Expand file tree
/
Copy pathbackend.js
More file actions
149 lines (140 loc) · 5.31 KB
/
Copy pathbackend.js
File metadata and controls
149 lines (140 loc) · 5.31 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
const config = require("./config.json");
const pjson = require("./package.json");
const express = require("express");
const passport = require('passport');
const multer = require('multer');
const axios = require('axios');
const bodyParser = require('body-parser');
const session = require('express-session');
const flash = require('express-flash');
const utils = require('hyperz-utils');
const chalk = require('chalk');
const figlet = require('figlet');
const fs = require('node:fs');
const bcrypt = require('bcrypt');
let dbcon;
async function init(app, con) {
if (Number(process.version.slice(1).split(".")[0] < 16)) throw new Error(`Node.js v16 or higher is required, Discord.JS relies on this version, please update @ https://nodejs.org`);
var multerStorage = multer.memoryStorage();
app.use(multer({ storage: multerStorage }).any());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(express.json());
app.use(flash());
app.use(session({
secret: 'keyboard cat',
resave: false,
saveUninitialized: false,
cookie: {maxAge: 31556952000},
}));
app.use(passport.initialize());
app.use(passport.session());
app.set('views', './src/views');
app.set('view engine', 'ejs');
app.use(express.static('public'));
app.use(express.static('src/static'));
app.use('/assets', express.static(__dirname + 'public/assets'));
app.use('/static', express.static(__dirname + 'src/static/assets'));
dbcon = con;
let projectName = 'Booking System'
figlet.text(projectName, { font: "Standard", width: 700 }, function(err, data) {
if(err) throw err;
let str = `${data}\n-------------------------------------------\n${projectName} is up and running on port ${config.port}!`
console.log(chalk.bold(chalk.red(str)));
});
setTimeout(async function() {
let currver = pjson.version
let request = await axios({
method: 'get',
url: `https://raw.githubusercontent.com/Itz-Hyperz/version-pub-api/main/versions.json`,
headers: {Accept: 'application/json, text/plain, */*','User-Agent': '*' }
});
let latestver = request.data.bookingsystem
if(latestver != currver) {
console.log(`${chalk.yellow(`[Version Checker]`)} ${chalk.red(`You are not on the latest version.\nCurrent Version: ${currver}\nLatest Version: ${latestver}`)}`)
} else {
console.log(`${chalk.green(`[Version Checker]`)} You are on the latest version.`)
};
}, 3000);
markSqlConnected();
sqlLoop(con);
await refreshAppLocals(app);
};
async function markSqlConnected() {
await dbcon.query(`SELECT * FROM sitesettings`, async function(err, row) {
if(err) {
setTimeout(function() { console.log(`${chalk.yellow(`[SQL Manager]`)} MySQL connection failed...`); }, 3400);
} else {
setTimeout(function() { console.log(`${chalk.yellow(`[SQL Manager]`)} MySQL successfully connected.`); }, 3400);
};
});
};
async function sqlLoop(con) {
if(con == 0) return;
await con.ping();
setTimeout(function() { sqlLoop(con), 60000 * 30 });
};
async function checkAuth(req, res, next) {
if(req.isAuthenticated()){
dbcon.query(`SELECT * FROM users WHERE id="${req.user.id}"`, async function(err, row) {
if(err) throw err;
if(row[0]) {
next();
} else {
res.redirect('/logout');
};
});
} else {
res.redirect("/login");
};
};
async function checkNotAuth(req, res, next) {
if(req.isAuthenticated()){
res.redirect("/account");
} else{
next();
};
};
async function authenticateUserLocal(email, password, done) {
dbcon.query(`SELECT * FROM users WHERE email="${await utils.sanitize(email)}"`, async function(err, row) {
if(err) throw err;
if(!row[0]) return done(null, false, { message: 'No user with that email' });
try {
if (await bcrypt.compare(password, row[0].password)) {
return done(null, row[0]);
} else {
return done(null, false, { message: 'Password incorrect' });
};
} catch (e) {
return done(e);
};
});
};
function generateUserId(length) {
let result = '';
let characters = '0123456789';
let date = Date.now();
let charactersLength = characters.length;
for ( let i = 0; i < length; i++ ) {
result += characters.charAt(Math.floor(Math.random() * charactersLength));
}
return date + result;
};
async function refreshAppLocals(app) {
dbcon.query(`SELECT * FROM sitesettings`, async function(err, row) {
if(err) throw err;
app.locals = {
config: config,
sitesettings: row[0],
packagejson: require('./package.json'),
currentyear: await utils.fetchTime(config.timeZone.tz, 'YYYY')
};
});
};
module.exports = {
init: init,
checkAuth: checkAuth,
checkNotAuth: checkNotAuth,
authenticateUserLocal: authenticateUserLocal,
generateUserId: generateUserId,
refreshAppLocals: refreshAppLocals
};