@arisan/data-api
Version:
The Universal Database API Gateway for CLIO's Modules
150 lines (126 loc) • 5.22 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = mountRecorders;
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);
var _checkRecorderModule = require('../middleware/checkRecorderModule');
var _checkRecorderModule2 = _interopRequireDefault(_checkRecorderModule);
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(),
recorders: null,
logger: null
};
context.router.post('/', _bodyParser2.default.json());
context.router.post('/', _checkPublicIP2.default);
context.router.post('/', _checkPort2.default);
context.router.post('/', _checkRecorderModule2.default);
context.router.post('/', (req, res) => {
const log = (lvl, msg) => context.logger.log(lvl, msg, { tags: 'POST /recorders' });
log('debug', JSON.stringify(req.body, null, 2));
const now = new Date();
const recorder = {
public_ip: req.body.publicIp,
private_ip: ipaddr.process(req.ip).toString(),
port: req.body.port,
module: req.body.module,
service: req.body.service,
created: now,
updated: now
};
context.recorders.insertOne(recorder, (insertOneErr, insertOneRes) => {
if (insertOneErr) {
log('error', insertOneErr.message);
res.status(500).send(insertOneErr.message);
return;
}
log('info', `Recorder ${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));
['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_infos: []
};
if (req.body.streamInfos) {
req.body.streamInfos.forEach(streamInfo => {
diff.stream_infos.push({
id: streamInfo.id,
archive: streamInfo.archiveStarted,
live: streamInfo.liveStarted,
event: streamInfo.eventStarted
});
});
}
diff.cpu_load = Math.ceil(req.body.cpuUsagePercentage * 100);
diff.mem_load = Math.ceil(req.body.memoryUsagePercentage);
diff.hdd_load = Math.ceil(req.body.hddUsageKB * 100 / req.body.hddTotalKB);
diff.upload_kbps = Math.ceil(req.body.netUploadBytesPerSecond * 8 / 1024);
diff.download_kbps = Math.ceil(req.body.netDownloadBytesPerSecond * 8 / 1024);
const _id = new _mongodb2.default.ObjectID(req.params.id);
context.recorders.updateOne({ _id }, { $set: diff }, (updateOneErr, updateOneRes) => {
if (updateOneErr) {
log('error', updateOneErr.message);
res.status(500).send(updateOneErr.message);
return;
}
if (!updateOneRes.matchedCount) {
const message = 'Recorder Not Found';
log('error', message);
res.status(500).send(message);
return;
}
log('info', '200 OK');
res.sendStatus(200);
});
});
//noinspection JSUnusedGlobalSymbols
/**
* Mount router for /recorders
* @param {object} options Options
* @param {object} options.app Express App
* @param {MongoClient.Db} options.database Associated Database
* @param {winston.Logger} options.logger Logger
*/
function mountRecorders(options) {
context.logger = options.logger;
const log = (lvl, msg) => context.logger.log(lvl, msg, { tags: 'mountRecorders' });
log('debug', 'Mounting router for /recorders....');
options.app.use('/recorders', context.router);
context.recorders = options.database.collection('recorders');
log('info', 'Router for /recorders Mounted');
}
//# sourceMappingURL=mountRecorders.js.map