diff --git a/package-lock.json b/package-lock.json index 9ec1de8..bbed7f8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -483,14 +483,6 @@ "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.4.tgz", "integrity": "sha512-S/yKGU1syOMzO86+dGpg2qGoDL0zvzcb262G+gqEy6TgP6rt6z6qxSFX/8X6vLC91P7G7C3nLs0+bvDzmvBA3Q==" }, - "busboy": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.3.1.tgz", - "integrity": "sha512-y7tTxhGKXcyBxRKAni+awqx8uqaJKrSFSNFSeRG5CsWNdmy2BIK+6VGWEW7TZnIO/533mtMEA4rOevQV815YJw==", - "requires": { - "dicer": "0.3.0" - } - }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", @@ -673,14 +665,6 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, - "dicer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", - "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", - "requires": { - "streamsearch": "0.1.2" - } - }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -938,14 +922,6 @@ "vary": "~1.1.2" } }, - "express-fileupload": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/express-fileupload/-/express-fileupload-1.2.0.tgz", - "integrity": "sha512-oe4WpKcSppXnl5peornawWUa6tKmIc1/kJxMNRGJR1A0v4zyLL6VsFR6wZ8P2a4Iq3aGx8xae3Vlr+MOMQhFPw==", - "requires": { - "busboy": "^0.3.1" - } - }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -1499,11 +1475,6 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, - "node-stream-zip": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.11.3.tgz", - "integrity": "sha512-GY+9LxkQuIT3O7K8BTdHVGKFcBYBy2vAVcTBtkKpu+OlBef/NSb6VuIWSyLiVDfmLMkggHeRJZN0F3W0GWU/uw==" - }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -1841,11 +1812,6 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, - "streamsearch": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", - "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" - }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", diff --git a/package.json b/package.json index b3188f9..804b78b 100644 --- a/package.json +++ b/package.json @@ -14,10 +14,8 @@ "@types/express": "github:types/express", "@types/mongoose": "^5.7.36", "express": "^4.17.1", - "express-fileupload": "^1.2.0", "mongoose": "^5.10.2", "mongoose-int32": "^0.4.1", - "node-stream-zip": "^1.11.3", "typescript": "^4.0.2", "winston": "^3.3.3" }, diff --git a/src/html/upload.html b/src/html/upload.html index e118003..8670e9e 100644 --- a/src/html/upload.html +++ b/src/html/upload.html @@ -1,23 +1,16 @@ file upload - -
-
- + +
+
+
+
+
+
+
\ No newline at end of file diff --git a/src/index.ts b/src/index.ts index cc1f8e9..0596a04 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,13 +2,10 @@ import * as express from 'express'; import * as mongoose from 'mongoose'; import * as fs from 'fs'; import * as winston from 'winston'; -import * as fileUpload from 'express-fileupload'; import * as format from './lib/format'; import { File } from './schema'; -import * as upload from './upload'; - const config = JSON.parse(fs.readFileSync('./config/config.json', {encoding: 'utf8'})); const db = mongoose.connect(`${config.dbconnectionURL}/${config.dbname}`, { @@ -40,6 +37,15 @@ const logger = winston.createLogger({ ] }); +function returnStatic(page) { + return (req, res) => { + fs.readFile(`src/html/${page}`, 'utf8', (err, data) => { + if (err) throw err; + res.send(data); + }); + }; +} + logger.info('connecting to mongodb database'); db.then(() => { logger.info('connected to database!'); @@ -48,23 +54,31 @@ db.then(() => { // @ts-ignore app.use(express.urlencoded({extended: true})); - app.use(fileUpload({limits: { fileSize: 50 * 1024 * 1024 }})); app.set('db', db); app.set('config', config); app.set('logger', logger); - upload.run(app); + app.get('/upload', returnStatic('upload.html')); + + app.post('/upload', async (req, res) => { // only for testing, very abusable + const file = new File(req.body); + await file.save(); + + res.send('uploaded file'); + }); app.get('/list', async (req, res) => { // only for testing const docs = await File.find({}); - - res.send(docs.map((doc: any) => - `${doc.artist} - ${doc.title} by ${doc.credit}
` + - doc.charts.map(ch => - `- ${ch.difficulty} ${ch.rating}: ${ch.name}` - ).join('
') - ).join('

')); + const map = docs.map(d => { + const keys = Object.keys(d.toObject()).filter(k => !k.startsWith('_')); + const obj = {}; + for (const key of keys) obj[key] = d[key]; + + return obj; + }); + + res.send(JSON.stringify(map)); }); app.get('/', (req, res) => { diff --git a/src/lib/smparse.ts b/src/lib/smparse.ts deleted file mode 100644 index 6736c6e..0000000 --- a/src/lib/smparse.ts +++ /dev/null @@ -1,57 +0,0 @@ -export function parseSM(data: string) { - data = data.replace(/[\n\r]/g,''); - - // steps - const difficulties = []; - const steps = data.split('#NOTES:'); - steps.slice(1); - - for (const step of steps) { - if (step.includes(';')) { - const diff: any = {}; - const stepsSplit = step.split(';')[0].split(':').map(seg => seg.trim()); - - if (stepsSplit.length === 6) { - diff.type = stepsSplit[0]; - diff.name = stepsSplit[1]; - diff.difficulty = stepsSplit[2]; - diff.rating = Number(stepsSplit[3]); - diff.radarvalues = stepsSplit[4].split(',').map(v => Number(v)); - - difficulties.push(diff); - } - } - } - - // metadata - const lines = data.split(';').filter(l => l.startsWith('#')); - const obj: any = {}; - - for (const l of lines) { - const key = l.split(':')[0].slice(1); - let value: any = l.split(':')[1]; - - if (value !== '' && !(key === 'FGCHANGES' || key === 'BGCHANGES' || key === 'BETTERBGCHANGES' || key === 'SPELLCARDS')) { // no - if (!isNaN(value)) value = Number(value); - if (value === 'YES') value = true; - if (value === 'NO') value = false; - if (typeof value === 'string' && value.includes('=')) { // likely a map - const keys = value.split(',').map(v => v.split('=')[0]); - const values = value.split(',').map(v => v.split('=')[1]); - const map = {}; - - for (const i in keys) { - map[Number(keys[i])] = Number(values[i]); // afaik maps are only numbers? - } - - value = map; - } - - obj[key.toLowerCase()] = value; - } - } - - obj.charts = difficulties; - - return obj; -} \ No newline at end of file diff --git a/src/lib/util.ts b/src/lib/util.ts deleted file mode 100644 index 77a0c60..0000000 --- a/src/lib/util.ts +++ /dev/null @@ -1,10 +0,0 @@ -import * as fs from 'fs'; - -export function returnStatic(page) { - return (req, res) => { - fs.readFile(`src/html/${page}`, 'utf8', (err, data) => { - if (err) throw err; - res.send(data); - }); - }; -} \ No newline at end of file diff --git a/src/schema.ts b/src/schema.ts index 2bf463c..df9bec1 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -1,18 +1,17 @@ import * as mongoose from 'mongoose'; +import * as Int32 from 'mongoose-int32'; const Schema = mongoose.Schema; const Sample = new Schema({ - start: {type: Number, default: 0}, - length: {type: Number, default: 0} + start: {type: Int32, default: new Int32(0)}, + length: {type: Int32, default: new Int32(0)} }); const Chart = new Schema({ - type: {type: String, default: 'dance-single'}, name: {type: String, default: ''}, - difficulty: {type: String, default: 'Challenge'}, - rating: {type: Number, default: 0}, - radarvalues: [Number] + rating: {type: Int32, default: new Int32(0)}, + type: {type: String, default: 'Challenge'} }); const FileSchema = new Schema({ @@ -25,7 +24,7 @@ const FileSchema = new Schema({ credit: String, uploader: {type: String, default: '00000000-0000-4000-a000-000000000000'}, sample: Sample, - bpms: {type: Object, default: {'0': 0}}, + bpms: {type: [Number], default: 0}, charts: [Chart] }); diff --git a/src/upload.ts b/src/upload.ts deleted file mode 100644 index d8b94c6..0000000 --- a/src/upload.ts +++ /dev/null @@ -1,53 +0,0 @@ -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.get('/upload', returnStatic('upload.html')); - - app.post('/upload', async (req, res) => { // only for testing, very abusable - const file = req.files.file; - if (file.mimetype !== 'application/zip') 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(); - - res.send(`your file "${chart.artist} - ${chart.title}" has been uploaded! check the listing`); // todo: change to actual url - } - - zip.close(); - fs.unlink(dir, (err) => { - if (err) throw err; - }); - }); - }); - }); -} \ No newline at end of file