synclounge/webapp.js

143 lines
4.5 KiB
JavaScript
Raw Normal View History

// ABOUT
2017-12-13 12:58:15 +00:00
// Runs the SyncLounge Web App - handles serving the static web content and link shortening services
2017-06-04 07:05:30 +00:00
// Port defaults to 8088
// REQUIRED: --url argument
2018-01-01 05:55:55 +00:00
var express = require('express')
var path = require('path')
var cors = require('cors')
2017-06-09 06:08:19 +00:00
var jsonfile = require('jsonfile')
2017-12-02 01:16:41 +00:00
var bodyParser = require('body-parser')
2018-05-20 05:08:44 +00:00
var Waterline = require('waterline')
var WaterlineMysql = require('waterline-mysql')
var SailsDisk = require('sails-disk')
2018-05-20 05:08:44 +00:00
let settings = {}
var accessIp = ''
var PORT = 8088
2018-05-20 05:08:44 +00:00
const bootstrap = () => {
return new Promise(async (resolve, reject) => {
try {
settings = require('./settings.json')
} catch (e) {
console.log(e)
console.log('Creating default settings.json')
let defaults = require('./example_settings.json')
jsonfile.writeFileSync('./settings.json', defaults)
await new Promise((resolve, reject) => {
setTimeout(() => resolve(), 500)
})
settings = require('./settings.json')
2018-04-28 06:44:53 +00:00
}
2018-05-20 05:08:44 +00:00
const args = require('args-parser')(process.argv)
if (!args['url'] && !process.env.url) {
console.log('Missing required argument -url. EG. "node webapp.js --url=http://example.com/ptweb". This URL is used for redirecting invite links.')
return reject(new Error('Missing URL for invite links'))
}
2018-05-20 05:08:44 +00:00
accessIp = args['url'] || process.env.url // EG 'http://95.231.444.12:8088/ptweb' or 'http://example.com/ptweb'
if (args['port'] || process.env.port || settings.webapp_port) {
PORT = args['port'] || process.env.port || settings.webapp_port
2018-04-28 06:44:53 +00:00
} else {
2018-05-20 05:08:44 +00:00
console.log('Defaulting webapp to port 8088')
}
PORT = parseInt(PORT)
let baseSettings = require('./waterline_settings.json')
baseSettings.adapters = {
'waterline-mysql': WaterlineMysql,
'sails-disk': SailsDisk
}
baseSettings.datastores = settings.database.datastores
baseSettings.models.invite.beforeCreate = async (data, cb) => {
console.log('Creating Invite', data)
let fullUrl
let params = {
server: data.server,
room: data.room,
owner: data.owner
}
if (data.password) {
params.password = data.password
}
let query = ''
for (let key in params) {
query += encodeURIComponent(key) + '=' + encodeURIComponent(params[key]) + '&'
}
fullUrl = accessIp + '/#/join?' + query
data.fullUrl = fullUrl
data.code = (0 | Math.random() * 9e6).toString(36)
cb()
2018-04-28 06:44:53 +00:00
}
2018-05-20 05:08:44 +00:00
Waterline.start(baseSettings, (err, orm) => {
if (err) {
return reject(err)
}
resolve(orm)
})
2018-04-28 06:44:53 +00:00
})
2017-06-09 06:08:19 +00:00
}
2018-05-20 05:08:44 +00:00
const app = async (orm) => {
var 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)
let 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()
2018-04-28 06:44:53 +00:00
}
2018-05-20 05:08:44 +00:00
let data = {}
let 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()
2018-04-28 06:44:53 +00:00
}
2018-05-20 05:08:44 +00:00
data[fields[i]] = req.body[fields[i]]
2018-04-28 06:44:53 +00:00
}
2018-05-20 05:08:44 +00:00
let 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.use('/', express.static(path.join(__dirname, 'dist')))
root.get('*', (req, res) => {
console.log('Catch all')
return res.redirect('/')
2018-04-28 06:44:53 +00:00
})
2018-05-20 05:08:44 +00:00
root.use(cors())
var rootserver = require('http').createServer(root)
rootserver.listen(PORT)
console.log('SyncLounge WebApp successfully started on port ' + PORT)
2017-07-26 14:07:23 +00:00
}
2018-05-20 05:08:44 +00:00
bootstrap().then((orm) => {
app(orm)
}).catch((e) => {
console.log('Error bootstrapping webapp:', e)
2017-06-09 06:08:19 +00:00
})