UNPKG

@arisan/data-api

Version:

The Universal Database API Gateway for CLIO's Modules

243 lines (234 loc) 7.62 kB
'use strict'; // eslint-disable-line strict /* Platform Libraries */ const ObjectID = require('mongodb').ObjectID; /* Project Libraries */ const BaseHandler = require('./base-handler'); const isValidStreamIndex = require('../Utils').isValidStreamIndex; const valueOf = require('../Utils').valueOf; class ArchiveHandler extends BaseHandler { constructor(logger, cameras) { super(logger); this.cameras = cameras; this.debug(`${ this.constructor.name } Constructed`); } /** * @param {Object} req * @param {string} req.params.cameraId * @param {string} req.params.streamIndex * @param {Object} res */ readArchiveInfo(req, res) { const tag = 'readArchiveInfo> '; const cameraId = req.params.cameraId; const streamIndex = req.params.streamIndex; this.debug(`${ tag }Stream ${ cameraId }/${ streamIndex }`); let objectId; try { objectId = new ObjectID(cameraId); } catch (err) { this.handleError(res, 400, `${ tag }${ err.message }`); return; } if (!isValidStreamIndex(streamIndex)) { this.handleError(res, 400, `${ tag }Invalid Stream Index`); return; } this.cameras.find({ _id: objectId }).limit(1).next((findErr, findRes) => { if (findErr) { this.handleError(res, 500, `${ tag }${ findErr.message }`); return; } if (!findRes) { this.handleError(res, 404, `${ tag }Camera ${ cameraId } Not Found`); return; } const rtspUrl = valueOf(findRes, 'streams', streamIndex, 'rtsp_url'); if (!rtspUrl) { this.handleError(res, 404, `${ tag }Stream ${ cameraId }/${ streamIndex } RTSP URL Not Found`); return; } const reply = { rtspUrl, audio: 'OFF' }; this.info(`${ tag } Stream ${ cameraId }/${ streamIndex } ` + `Archive Info ${ JSON.stringify(reply, null, 2) }`); res.status(200).send(reply); }); } /** * @param {Object} req * @param {string} req.params.cameraId * @param {string} req.params.streamIndex * @param {string} req.params.videoInfoIndex; * @param {Object} res */ readVideoInfo(req, res) { const tag = 'readVideoInfo> '; const l = this.logger; const cameras = this.cameras; const cameraId = req.params.cameraId; const streamIndex = req.params.streamIndex; const videoInfoIndex = req.params.videoInfoIndex; l.debug(`${ tag }Stream ${ cameraId }/${ streamIndex }`); let objectId; try { objectId = new ObjectID(cameraId); } catch (err) { l.error(err); res.sendStatus(400); return; } if (!isValidStreamIndex(streamIndex)) { l.error(new Error('Invalid Stream Index')); res.sendStatus(400); return; } if (Number(videoInfoIndex) !== -1) { l.error(new Error(`Invalid Video Info Index ${ videoInfoIndex }`)); res.sendStatus(400); return; } cameras.find({ _id: objectId }).limit(1).next((findErr, findResult) => { if (findErr) { l.error(findErr); res.sendStatus(500); return; } if (!findResult) { l.error(`${ tag }Camera ${ cameraId } Not Found`); res.sendStatus(404); } else { if (!valueOf(findResult, 'streams', streamIndex)) { l.error(`${ tag }Stream ${ cameraId }/${ streamIndex } Not Found`); res.sendStatus(404); return; } const reply = {}; const info = valueOf(findResult, 'streams', streamIndex, 'video_info'); if (!info || info.length === 0) { reply.index = 0; } else { const cursor = info[info.length - 1]; reply.index = cursor.index; reply.startTime = cursor.start_time; reply.endTime = cursor.end_time; reply.bucketName = cursor.bucket_name; reply.objectName = cursor.object_name; } l.info(`${ tag } Stream ${ cameraId }/${ streamIndex }/${ videoInfoIndex } ` + `Video Info ${ JSON.stringify(reply, null, 2) }`); res.status(200).send(reply); } }); } /** * @param {Object} req * @param {Object} req.params.cameraId * @param {Object} req.params.streamIndex * @param {Object} res */ updateVideoInfo(req, res) { const tag = 'updateVideoInfo> '; const l = this.logger; const cameras = this.cameras; const cameraId = req.params.cameraId; const streamIndex = req.params.streamIndex; const requestBody = req.body; l.debug(`${ tag }Stream ${ cameraId }/${ streamIndex } Request Body ${ requestBody }`); let objectId; try { objectId = new ObjectID(cameraId); } catch (err) { l.error(err); res.sendStatus(400); return; } if (!isValidStreamIndex(streamIndex)) { l.error(new Error('Invalid Stream Index')); res.sendStatus(400); return; } if (requestBody.length === 0) { l.error(new Error('Update Video Info without Request or Body')); res.sendStatus(400); return; } /* * Prepare a differential document for update. */ const diff = {}; diff[`streams.${ streamIndex }.video_info`] = { index: requestBody.index, start_time: requestBody.startTime, end_time: requestBody.endTime, bucket_name: requestBody.bucketName, object_name: requestBody.objectName }; cameras.updateOne({ _id: objectId }, { $push: diff }, (updateOneErr, updateOneResult) => { if (updateOneErr) { l.error(updateOneErr); res.sendStatus(500); return; } if (updateOneResult.matchedCount === 0) { l.error(`${ tag }Stream ${ cameraId }/${ streamIndex } Not Found`); res.sendStatus(404); } else { l.info(`${ tag }Stream ${ cameraId }/${ streamIndex } Completed`); res.sendStatus(200); } }); } /** * @param {Object} req * @param {Object} res */ updateVideoInfoStatus(req, res) { const tag = 'updateVideoInfoStatus> '; const l = this.logger; const cameras = this.cameras; const cameraId = req.params.cameraId; const streamIndex = req.params.streamIndex; const videoInfoIndex = req.params.videoInfoIndex; const requestBody = req.body; l.debug(`${ tag }Video ${ cameraId }/${ streamIndex }/${ videoInfoIndex } Status ${ requestBody }`); let objectId; try { objectId = new ObjectID(cameraId); } catch (err) { l.error(err); res.sendStatus(400); return; } if (!isValidStreamIndex(streamIndex)) { l.error(new Error('Invalid Stream Index')); res.sendStatus(400); return; } if (requestBody.length === 0) { l.error(new Error('Update Video Info Status without Request or Body')); res.sendStatus(400); return; } /* * Prepare a differential document for update. */ const diff = {}; diff[`streams.${ streamIndex }.video_info.${ videoInfoIndex - 1 }.status`] = requestBody; cameras.updateOne({ _id: objectId }, { $set: diff }, (updateOneErr, updateOneResult) => { if (updateOneErr) { l.error(updateOneErr); res.sendStatus(500); return; } if (updateOneResult.matchedCount === 0) { l.error(`${ tag }Video ${ cameraId }/${ streamIndex }/${ videoInfoIndex } Not Found`); res.sendStatus(404); } else { l.info(`${ tag }Video ${ cameraId }/${ streamIndex }/${ videoInfoIndex } Completed`); res.sendStatus(200); } }); } } module.exports = ArchiveHandler; //# sourceMappingURL=archive-handler.js.map