blob: 9d7fcf547f6061bd71c94f5ff596f34d781ac273 [file] [log] [blame]
import { Request, Response, Router } from 'express';
import * as request from 'request';
import { HELIX_ENDPOINTS } from '../config';
export class HelixCtrl {
static readonly ROUTE_PREFIX = '/api/helix';
constructor(router: Router) {
router.route('/helix/list').get(this.list);
router.route('/helix/*').all(this.proxy);
}
protected proxy(req: Request, res: Response) {
const url = req.originalUrl.replace(HelixCtrl.ROUTE_PREFIX, '');
const helixKey = url.split('/')[1];
const segments = helixKey.split('.');
const group = segments[0];
segments.shift();
const name = segments.join('.');
const user = req.session.username;
const method = req.method.toLowerCase();
if (method != 'get' && !req.session.isAdmin) {
res.status(403).send('Forbidden');
return;
}
let apiPrefix = null;
if (HELIX_ENDPOINTS[group]) {
HELIX_ENDPOINTS[group].forEach(section => {
if (section[name]) {
apiPrefix = section[name];
}
});
}
if (apiPrefix) {
const realUrl = apiPrefix + url.replace(`/${ helixKey }`, '');
const options = {
url: realUrl,
json: req.body,
headers: {
'Helix-User': user
}
};
request[method](options, (error, response, body) => {
if (error) {
res.status(500).send(error);
} else {
res.status(response.statusCode).send(body);
}
});
} else {
res.status(404).send('Not found');
}
}
protected list(req: Request, res: Response) {
res.json(HELIX_ENDPOINTS);
}
}