mirror of
https://github.com/chuot/rdio-scanner.git
synced 2026-08-13 16:33:01 -06:00
91 lines
3.4 KiB
TypeScript
91 lines
3.4 KiB
TypeScript
import { IncomingMessage, ServerResponse } from 'http';
|
|
import { Meteor } from 'meteor/meteor';
|
|
import { WebApp } from 'meteor/webapp';
|
|
import { Form } from 'multiparty';
|
|
import { Systems } from '../../../imports/collections/systems';
|
|
import { System } from '../../../imports/models/system';
|
|
import { Talkgroup } from '../../../imports/models/talkgroup';
|
|
|
|
if (Meteor.isServer) {
|
|
createApiHandler();
|
|
}
|
|
|
|
function createApiHandler(): void {
|
|
WebApp.connectHandlers.use('/talkgroups', (req: IncomingMessage, res: ServerResponse) => {
|
|
if (req.method === 'POST') {
|
|
const form = new Form();
|
|
|
|
let csv = '';
|
|
let key = '';
|
|
let name = '';
|
|
let system = '';
|
|
|
|
form.on('part', (part) => {
|
|
part.on('data', (data) => {
|
|
switch (part.name.toLowerCase()) {
|
|
case 'csv':
|
|
csv += data.toString('utf8');
|
|
break;
|
|
case 'key':
|
|
key += data.toString('utf8');
|
|
break;
|
|
case 'name':
|
|
name += data.toString('utf8');
|
|
break;
|
|
case 'system':
|
|
system += data.toString('utf8');
|
|
break;
|
|
}
|
|
});
|
|
part.resume();
|
|
});
|
|
|
|
form.on('close', Meteor.bindEnvironment(() => {
|
|
const apiKeys = Meteor.settings.apiKeys;
|
|
|
|
if (key && Array.isArray(apiKeys) && apiKeys.find((apiKey) => apiKey === key)) {
|
|
const sys = new System({
|
|
name,
|
|
system,
|
|
talkgroups: csv
|
|
.replace('\r', '')
|
|
.split('\n')
|
|
.filter((line: string) => line.charAt(0) !== '#')
|
|
.map((line: string) => {
|
|
const fields = line.split(',');
|
|
return ['dec', 'hex', 'mode', 'alphaTag', 'description', 'tag', 'group', 'priority']
|
|
.reduce((tg, k, i) => {
|
|
tg[k] = fields[i];
|
|
return tg;
|
|
}, {});
|
|
})
|
|
.filter((talkgroup: Talkgroup) => talkgroup.dec),
|
|
});
|
|
|
|
if (sys.talkgroups.length) {
|
|
Systems.collection.update({ system: sys.system }, { $set: sys }, { upsert: true }, (error: Meteor.Error) => {
|
|
res.writeHead(error ? 500 : 200);
|
|
res.end();
|
|
});
|
|
|
|
} else {
|
|
Systems.collection.remove({ system: sys.system }, (error: Meteor.Error) => {
|
|
res.writeHead(error ? 500 : 200);
|
|
res.end();
|
|
});
|
|
}
|
|
} else {
|
|
res.writeHead(403);
|
|
res.end('wrong or no api key provided\n');
|
|
}
|
|
}));
|
|
|
|
form.parse(req);
|
|
|
|
} else {
|
|
res.writeHead(404);
|
|
res.end();
|
|
}
|
|
});
|
|
}
|