forked from synclounge/synclounge
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwebapp.js
134 lines (128 loc) · 4.41 KB
/
webapp.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
// ABOUT
// Runs the SyncLounge Web App - handles serving the static web content and link shortening services
// Port defaults to 8088
// REQUIRED: --url argument
const express = require('express');
const path = require('path');
const cors = require('cors');
const bodyParser = require('body-parser');
const Waterline = require('waterline');
const WaterlineMysql = require('waterline-mysql');
const SailsDisk = require('sails-disk');
const SettingsHelper = require('./SettingsHelper');
const settings = new SettingsHelper();
console.log('Settings', settings);
let accessIp = '';
let PORT = 8088;
const bootstrap = () => new Promise(async (resolve, reject) => {
const args = require('args-parser')(process.argv);
if (!settings.accessUrl) {
console.log('Missing required argument -accessUrl. EG. "node webapp.js -accessUrl=http://sl.example.com". This URL is used for redirecting invite links.');
return reject(new Error('Missing URL for invite links'));
}
accessIp = settings.accessUrl;// EG 'http://95.231.444.12:8088/slweb' or 'http://example.com/slweb'
if (args.webapp_port || process.env.webapp_port) {
PORT = args.webapp_port || process.env.webapp_port;
} else {
console.log('Defaulting webapp to port 8088');
}
PORT = parseInt(PORT);
const baseSettings = require('./waterline_settings.json');
console.log('Basesettings', baseSettings);
baseSettings.waterline.adapters = {
'waterline-mysql': WaterlineMysql,
'sails-disk': SailsDisk,
};
baseSettings.waterline.datastores = baseSettings.database.datastores;
baseSettings.waterline.models.invite.beforeCreate = async (data, cb) => {
console.log('Creating Invite', data);
let fullUrl;
const params = {
server: data.server,
room: data.room,
owner: data.owner,
};
if (data.password) {
params.password = data.password;
}
let query = '';
for (const key in params) {
query += `${encodeURIComponent(key)}=${params[key]}&`;
}
fullUrl = `${accessIp}/#/join?${query}`;
data.fullUrl = fullUrl;
data.code = (0 | Math.random() * 9e6).toString(36);
cb();
};
Waterline.start(baseSettings.waterline, (err, orm) => {
if (err) {
return reject(err);
}
resolve(orm);
});
});
const app = async (orm) => {
const root = express();
root.use(cors());
root.use(bodyParser());
// Setup our web app
root.use(`${settings.webroot}/`, express.static(path.join(__dirname, 'dist')));
root.get(`${settings.webroot}/invite/:id`, async (req, res) => {
console.log('handling an invite', req.params.id);
const shortObj = await Waterline.getModel('invite', orm).findOne({ code: req.params.id });
console.log('Invite data', shortObj);
if (!shortObj) {
return res.redirect(accessIp + settings.webroot);
}
console.log('Redirecting an invite link', shortObj);
return res.redirect(shortObj.fullUrl);
});
root.post(`${settings.webroot}/invite`, async (req, res) => {
res.setHeader('Content-Type', 'application/json');
if (!req.body) {
return res.send({
success: false,
msg: 'ERR: You did not send any POST data',
}).end();
}
const data = {};
const fields = ['server', 'room', 'password', 'owner'];
for (let i = 0; i < fields.length; i++) {
if (req.body[fields[i]] === undefined) {
return res.send({
success: false,
msg: `ERR: You did not specify ${fields[i]}`,
field: fields[i],
}).end();
}
data[fields[i]] = req.body[fields[i]];
}
const result = await Waterline.getModel('invite', orm).create({ ...data }).fetch();
return res.send({
url: `${accessIp}/invite/${result.code}`,
success: true,
generatedAt: new Date().getTime(),
details: result,
}).end();
});
root.get('/config', (req, res) => {
res.header('Cache-Control', 'private, no-cache, no-store, must-revalidate');
res.header('Expires', '-1');
res.header('Pragma', 'no-cache');
res.send(SettingsHelper())
});
root.use('/', express.static(path.join(__dirname, 'dist')));
root.get('*', (req, res) => {
console.log('Catch all');
return res.redirect('/');
});
root.use(cors());
const rootserver = require('http').createServer(root);
rootserver.listen(PORT);
console.log(`SyncLounge WebApp successfully started on port ${PORT}`);
};
bootstrap().then((orm) => {
app(orm);
}).catch((e) => {
console.log('Error bootstrapping webapp:', e);
});