in-the-database-2/src/upload.ts

54 lines
1.4 KiB
TypeScript

import { tmpdir } from 'os';
import * as fs from 'fs';
const StreamZip = require('node-stream-zip');
import { returnStatic } from './lib/util';
import { parseSM } from './lib/smparse';
import { File } from './schema';
export function run(app) {
const logger = app.get('logger');
app.post('/api/upload', async (req, res) => { // only for testing, very abusable
if (!req.files) return res.status(400).send('No files were given');
const file = req.files.file;
if (file.mimetype !== 'application/zip' && file.mimetype !== 'application/x-zip-compressed') return res.status(400).send('Invalid filetype');
const dir = tmpdir() + '/' + file.md5;
fs.writeFile(dir, file.data, (err) => {
if (err) throw err;
const zip = new StreamZip({
file: dir,
storeEntries: true
});
zip.on('ready', () => {
const smFile = Object.values(zip.entries()).find((f: any) =>
!f.isDirectory && (f.name.endsWith('.sm'))
);
if (!smFile) {
res.status(400).send('No .sm found');
} else {
const data = zip.entryDataSync((smFile as any).name);
const chart = parseSM(data.toString());
logger.info(`${chart.artist} - ${chart.title} was just uploaded`);
const file = new File(chart);
file.save();
// TODO: filter out _id and __v? possibly more
res.send(chart);
}
zip.close();
fs.unlink(dir, (err) => {
if (err) throw err;
});
});
});
});
}