Repository navigation
Expand file tree
/
Copy pathwebapp.js
More file actions
140 lines (133 loc) · 4.48 KB
/
Copy pathwebapp.js
File metadata and controls
140 lines (133 loc) · 4.48 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
// ABOUT
// Runs the SyncLounge Web App - handles serving the static web content and link shortening services
// Port defaults to 8088
// REQUIRED: Access URL must be set. See documentation for how to set this.
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');
let settings = new SettingsHelper();
let PORT = 8088;
const bootstrap = () => new Promise(async (resolve, reject) => {
if (!settings.accessUrl) {
console.log('Missing required argument `accessUrl`. This URL is used for redirecting invite links. See documentation for how to set this');
return reject(new Error('Missing URL for invite links'));
}
if (!settings.webapp_port) {
console.log('Defaulting webapp to port 8088');
}
else{
PORT = settings.webapp_port;
}
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 = `${settings.accessUrl}/#/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();
// Setup our web app
root.use(cors());
root.use(bodyParser.json());
root.use(bodyParser.urlencoded({
extended: true
}));
root.use(`${settings.webroot}/`, express.static(path.join(__dirname, 'dist')));
// Invite handling
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(settings.accessUrl + 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: `${settings.accessUrl}/invite/${result.code}`,
success: true,
generatedAt: new Date().getTime(),
details: result,
}).end();
});
// Config handling
root.get(`${settings.webroot}/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(settings);
});
// Catch anything else and redirect to the base URL
root.get('*', (req, res) => {
console.log('Catch all:', req.url);
return res.redirect(`${settings.webroot}/`);
});
const rootserver = require('http').createServer(root);
rootserver.listen(PORT);
console.log(`SyncLounge WebApp successfully started on port ${PORT}`);
if (settings.webroot) {
console.log(`Running with base URL: ${settings.webroot}`);
}
console.log(`Access URL is ${settings.accessUrl}`);
};
bootstrap().then((orm) => {
app(orm);
}).catch((e) => {
console.log('Error bootstrapping webapp:', e);
});