const express = require('express');
const router = express.Router();
const request = require('request');
const config = require('../config');
const { badge } = require('../lib/badge');
const sanitize = require('sanitize');
router.get('/', function(req, res) {
res.setLocale(config.locale);
res.render('index', { community: config.community,
tokenRequired: !!config.inviteToken,
recaptchaSiteKey: config.recaptchaSiteKey });
});
router.post('/invite', function(req, res) {
if (req.body.email && (!config.inviteToken || (!!config.inviteToken && req.body.token === config.inviteToken))) {
function doInvite() {
request.post({
url: 'https://'+ config.slackUrl + '/api/users.admin.invite',
form: {
email: req.body.email,
token: config.slacktoken,
set_active: true
}
}, function(err, httpResponse, body) {
// body looks like:
// {"ok":true}
// or
// {"ok":false,"error":"already_invited"}
if (err) { return res.send('Error:' + err); }
body = JSON.parse(body);
if (body.ok) {
res.render('result', {
community: config.community,
message: 'Success! Check “'+ req.body.email +'” for an invite from Slack.'
});
} else {
let error = body.error;
if (error === 'already_invited' || error === 'already_in_team') {
res.render('result', {
community: config.community,
message: 'Success! You were already invited.
' +
'Visit '+ config.community +''
});
return;
} else if (error === 'invalid_email') {
error = 'The email you entered is an invalid email.';
} else if (error === 'invalid_auth') {
error = 'Something has gone wrong. Please contact a system administrator.';
}
res.render('result', {
community: config.community,
message: 'Failed! ' + error,
isFailed: true
});
}
});
}
if (!!config.recaptchaSiteKey && !!config.recaptchaSecretKey) {
request.post({
url: 'https://www.google.com/recaptcha/api/siteverify',
form: {
response: req.body['g-recaptcha-response'],
secret: config.recaptchaSecretKey
}
}, function(err, httpResponse, body) {
if (typeof body === "string") {
body = JSON.parse(body);
}
if (body.success) {
doInvite();
} else {
error = 'Invalid captcha.';
res.render('result', {
community: config.community,
message: 'Failed! ' + error,
isFailed: true
});
}
});
} else {
doInvite();
}
} else {
const errMsg = [];
if (!req.body.email) {
errMsg.push('your email is required');
}
if (!!config.inviteToken) {
if (!req.body.token) {
errMsg.push('valid token is required');
}
if (req.body.token && req.body.token !== config.inviteToken) {
errMsg.push('the token you entered is wrong');
}
}
res.render('result', {
community: config.community,
message: 'Failed! ' + errMsg.join(' and ') + '.',
isFailed: true
});
}
});
router.get('/badge.svg', (req, res) => {
request.get({
url: 'https://'+ config.slackUrl + '/api/users.list',
qs: {
token: config.slacktoken,
presence: true
}
}, function(err, httpResponse, body) {
try {
body = JSON.parse(body);
} catch(e) {
return res.status(404).send('');
}
if (!body.members) {
return res.status(404).send('');
}
const members = body.members.filter(function(m) {
return !m.is_bot;
});
const total = members.length;
const presence = members.filter(function(m) {
return m.presence === 'active';
}).length;
const hexColor = /^([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$/;
sanitize.middleware.mixinFilters(req);
res.type('svg');
res.set('Cache-Control', 'max-age=0, no-cache');
res.set('Pragma', 'no-cache');
res.send(
badge(
presence,
total,
req.queryPattern('colorA', hexColor),
req.queryPattern('colorB', hexColor)
)
);
});
});
module.exports = router;