2020-09-02 18:30:23 +00:00
|
|
|
import { tmpdir } from 'os';
|
|
|
|
import * as fs from 'fs';
|
|
|
|
const StreamZip = require('node-stream-zip');
|
|
|
|
|
|
|
|
import { parseSM } from './lib/smparse';
|
2020-10-12 00:39:44 +00:00
|
|
|
import { File, User } from './schema';
|
2020-09-02 16:03:49 +00:00
|
|
|
|
|
|
|
export function run(app) {
|
2020-09-02 18:30:23 +00:00
|
|
|
const logger = app.get('logger');
|
2020-09-02 16:03:49 +00:00
|
|
|
|
2020-09-03 22:18:43 +00:00
|
|
|
app.post('/api/upload', async (req, res) => { // only for testing, very abusable
|
|
|
|
if (!req.files) return res.status(400).send('No files were given');
|
2020-10-12 00:39:44 +00:00
|
|
|
if (!req.session.uuid) return res.status(401).send('Not authorized, use /discordauth');
|
|
|
|
|
|
|
|
const user = (await User.find({uuid: req.session.uuid}))[0];
|
|
|
|
if (!user) return res.status(401).send('User doesn\'t exist, try re-logging in');
|
|
|
|
if (!user.get('approvedUpload')) return res.status(403).send('Your account is not allowed to upload files! Contact a moderator to verify your account');
|
2020-10-12 00:27:47 +00:00
|
|
|
|
2020-09-02 18:30:23 +00:00
|
|
|
const file = req.files.file;
|
2020-09-03 22:18:43 +00:00
|
|
|
|
|
|
|
if (file.mimetype !== 'application/zip' && file.mimetype !== 'application/x-zip-compressed') return res.status(400).send('Invalid filetype');
|
2020-09-02 18:30:23 +00:00
|
|
|
|
|
|
|
const dir = tmpdir() + '/' + file.md5;
|
|
|
|
fs.writeFile(dir, file.data, (err) => {
|
|
|
|
if (err) throw err;
|
|
|
|
|
|
|
|
const zip = new StreamZip({
|
|
|
|
file: dir,
|
|
|
|
storeEntries: true
|
|
|
|
});
|
|
|
|
|
2020-10-11 22:21:32 +00:00
|
|
|
zip.on('ready', async () => {
|
2020-09-02 18:30:23 +00:00
|
|
|
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`);
|
|
|
|
|
2020-10-11 22:21:32 +00:00
|
|
|
let id = 0;
|
|
|
|
for (const f of await File.find({})) {
|
|
|
|
id = Math.max(f.id, id);
|
|
|
|
}
|
|
|
|
chart.id = id + 1;
|
2020-09-02 18:30:23 +00:00
|
|
|
|
2020-10-12 00:27:47 +00:00
|
|
|
chart.uploader = req.session.uuid;
|
|
|
|
|
2020-10-11 22:21:32 +00:00
|
|
|
chart.createdAt = new Date();
|
|
|
|
|
|
|
|
fs.writeFile('./storage/files/' + (id + 1) + '.zip', file.data, (err) => {
|
|
|
|
if (err) throw err;
|
|
|
|
|
|
|
|
const file = new File(chart);
|
|
|
|
file.save();
|
|
|
|
|
|
|
|
// TODO: filter out _id and __v? possibly more
|
|
|
|
res.send(chart);
|
|
|
|
});
|
2020-09-02 18:30:23 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
zip.close();
|
|
|
|
fs.unlink(dir, (err) => {
|
|
|
|
if (err) throw err;
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
2020-09-02 16:03:49 +00:00
|
|
|
});
|
|
|
|
}
|