rdio-scanner/server/imports/api/upload.ts
Chrystian Huot 7c2ee69151 first commit
2019-06-12 11:43:21 -04:00

71 lines
2.3 KiB
TypeScript

import { IncomingMessage, ServerResponse } from 'http';
import { Meteor } from 'meteor/meteor';
import { WebApp } from 'meteor/webapp';
import { Form } from 'multiparty';
import { Calls } from '../../../imports/collections/calls';
import { Call } from '../../../imports/models/call';
if (Meteor.isServer) {
WebApp.connectHandlers.use('/upload', (req: IncomingMessage, res: ServerResponse) => {
if (req.method === 'POST') {
const form = new Form();
let audio = 'data:audio/mpeg;base64,';
let json = '';
let key = '';
let system = '';
form.on('part', (part) => {
part.on('data', (data) => {
switch (part.name.toLowerCase()) {
case 'audio':
audio += data.toString('base64');
break;
case 'json':
json += data.toString('binary');
break;
case 'key':
key += 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)) {
try {
const call = new Call(Object.assign({}, JSON.parse(json), { audio, system }));
Calls.collection.insert(call, (error: Meteor.Error) => {
res.writeHead(error ? 500 : 200);
res.end();
});
} catch (error) {
res.writeHead(500);
res.end(error.message);
}
} else {
res.writeHead(403);
res.end('wrong or no api key provided');
}
}));
form.parse(req);
} else {
res.writeHead(404);
res.end();
}
});
}