@arisan/data-api
Version:
The Universal Database API Gateway for CLIO's Modules
243 lines (234 loc) • 7.62 kB
JavaScript
; // 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