@arisan/data-api
Version:
The Universal Database API Gateway for CLIO's Modules
133 lines (111 loc) • 4.63 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = mountObservers;
var _bodyParser = require('body-parser');
var _bodyParser2 = _interopRequireDefault(_bodyParser);
var _express = require('express');
var _express2 = _interopRequireDefault(_express);
var _mongodb = require('mongodb');
var _mongodb2 = _interopRequireDefault(_mongodb);
var _checkObjectID = require('../middleware/checkObjectID');
var _checkObjectID2 = _interopRequireDefault(_checkObjectID);
var _checkPort = require('../middleware/checkPort');
var _checkPort2 = _interopRequireDefault(_checkPort);
var _checkPublicIP = require('../middleware/checkPublicIP');
var _checkPublicIP2 = _interopRequireDefault(_checkPublicIP);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/* eslint-disable import/newline-after-import, import/first */
//region 1. Platform Libraries
const ipaddr = require('ipaddr.js');
//endregion
//region 2. Project Libraries
//endregion
const context = {
router: _express2.default.Router(),
observers: null,
logger: null
};
context.router.post('/', _bodyParser2.default.json());
context.router.post('/', _checkPublicIP2.default);
context.router.post('/', _checkPort2.default);
context.router.post('/', (req, res) => {
const log = (lvl, msg) => context.logger.log(lvl, msg, { tags: 'POST /observers' });
log('debug', JSON.stringify(req.body, null, 2));
const now = new Date();
const observer = {
public_ip: req.body.publicIp,
private_ip: ipaddr.process(req.ip).toString(),
port: req.body.port,
created: now,
updated: now
};
context.observers.insertOne(observer, (insertOneErr, insertOneRes) => {
if (insertOneErr) {
log('error', insertOneErr.message);
res.status(500).send(insertOneErr.message);
return;
}
log('info', `Observer ${insertOneRes.insertedId} Created`);
res.type('text/plain');
res.status(201).send(new Buffer(`${insertOneRes.insertedId}`));
});
});
context.router.put('/:id', _bodyParser2.default.json());
context.router.put('/:id', _checkObjectID2.default);
context.router.put('/:id', (req, res) => {
const log = (lvl, msg) => context.logger.log(lvl, msg, { tags: `PUT ${req.originalUrl}` });
log('debug', JSON.stringify(req.body, null, 2));
['streamIds', 'cpuUsagePercentage', 'memoryUsagePercentage', 'hddUsageKB', 'hddTotalKB', 'netUploadBytesPerSecond', 'netDownloadBytesPerSecond'].forEach(property => {
if ({}.hasOwnProperty.call(req.body, property)) {
return;
}
const message = `Heartbeat Body Contains No ${property}`;
log('error', message);
res.status(400).send(message);
throw new Error(message);
});
const diff = {
updated: new Date(),
stream_ids: req.body.streamIds,
cpu_load: Math.ceil(req.body.cpuUsagePercentage * 100),
mem_load: Math.ceil(req.body.memoryUsagePercentage),
hdd_load: Math.ceil(req.body.hddUsageKB * 100 / req.body.hddTotalKB),
upload_kbps: Math.ceil(req.body.netUploadBytesPerSecond * 8 / 1024),
download_kbps: Math.ceil(req.body.netDownloadBytesPerSecond * 8 / 1024)
};
const _id = new _mongodb2.default.ObjectID(req.params.id);
context.observers.updateOne({ _id }, { $set: diff }, (updateOneErr, updateOneRes) => {
if (updateOneErr) {
log('error', updateOneErr.message);
res.status(500).send(updateOneErr.message);
return;
}
if (!updateOneRes.matchedCount) {
const message = 'Observer Not Found';
log('error', message);
res.status(500).send(message);
return;
}
log('info', '200 OK');
res.sendStatus(200);
});
});
//noinspection JSUnusedGlobalSymbols
/**
* Mount router for /observers
* @param {object} options Options
* @param {object} options.app Express App
* @param {MongoClient.Db} options.database Associated Database
* @param {winston.Logger} options.logger Logger
*/
function mountObservers(options) {
context.logger = options.logger;
const log = (lvl, msg) => context.logger.log(lvl, msg, { tags: 'mountObservers' });
log('debug', 'Mounting router for /observers....');
options.app.use('/observers', context.router);
context.observers = options.database.collection('observers');
log('info', 'Router for /observers Mounted');
}
//# sourceMappingURL=mountObservers.js.map