mirror of
https://github.com/chuot/rdio-scanner.git
synced 2026-08-13 16:33:01 -06:00
88 lines
2.6 KiB
JavaScript
88 lines
2.6 KiB
JavaScript
'use strict';
|
|
|
|
const multer = require('multer');
|
|
const upload = multer({ storage: multer.memoryStorage() });
|
|
|
|
const { callReducer, validateApiKey } = require('../helpers/rdio-scanner');
|
|
|
|
module.exports = ({ pubsub, store }) => (req, res) => upload.fields([
|
|
{ name: 'audio', maxCount: 1 },
|
|
{ name: 'key', maxCount: 1 },
|
|
{ name: 'meta', maxCount: 1 },
|
|
{ name: 'system', maxCount: 1 },
|
|
])(req, res, (err) => {
|
|
if (err instanceof multer.MulterError) {
|
|
res.send(`${err.message}: ${err.field}\n`);
|
|
|
|
} else if (err) {
|
|
res.send(`${err.message}\n`);
|
|
|
|
} else {
|
|
const key = req.body.key;
|
|
|
|
let meta = req.files.meta[0].buffer.toString();
|
|
|
|
try {
|
|
meta = JSON.parse(meta);
|
|
} catch (err) {
|
|
meta = {};
|
|
}
|
|
|
|
if (Array.isArray(meta.freqList)) {
|
|
meta.freqList = meta.freqList.map((f) => ({
|
|
errorCount: f.error_count,
|
|
freq: f.freq,
|
|
len: f.len,
|
|
pos: f.pos,
|
|
spikeCount: f.spike_count,
|
|
}));
|
|
} else {
|
|
meta.freqList = [];
|
|
}
|
|
|
|
if (Array.isArray(meta.srcList)) {
|
|
meta.srcList = meta.srcList.map((s) => ({
|
|
src: s.src,
|
|
pos: s.pos,
|
|
}));
|
|
} else {
|
|
meta.srcList = [];
|
|
}
|
|
|
|
const data = {
|
|
audio: req.files.audio[0].buffer,
|
|
emergency: !!meta.emergency,
|
|
freq: parseInt(meta.freq, 10),
|
|
freqList: JSON.stringify(Array.isArray(meta.freqList) ? meta.freqList : []),
|
|
startTime: parseDate(meta.start_time),
|
|
stopTime: parseDate(meta.stop_time),
|
|
srcList: JSON.stringify(Array.isArray(meta.srcList) ? meta.srcList : []),
|
|
system: parseInt(req.body.system, 10),
|
|
talkgroup: parseInt(meta.talkgroup, 10),
|
|
};
|
|
|
|
if (!validateApiKey(key, data.system, data.talkgroup)) {
|
|
return res.send(`Api key is invalid for system ${data.system} talkgroup ${data.talkgroup}.\n`);
|
|
}
|
|
|
|
store.rdioScannerCall.create(data)
|
|
.then((call) => {
|
|
pubsub.publish('rdioScannerCall', { rdioScannerCall: callReducer(call) });
|
|
res.send(`Call imported successfully.\n`)
|
|
})
|
|
.catch((err) => res.send(err.message));
|
|
}
|
|
});
|
|
|
|
function parseDate(value) {
|
|
if (value instanceof Date) {
|
|
return value;
|
|
} else if (typeof value === 'number') {
|
|
const date = new Date(1970, 0, 1);
|
|
date.setUTCSeconds(value - date.getTimezoneOffset() * 60);
|
|
return date;
|
|
} else {
|
|
return new Date(value);
|
|
}
|
|
}
|