Skip to content

Commit f688982

Browse files
committed
added upload.js endpoint
1 parent 3a9eb39 commit f688982

File tree

1 file changed

+84
-2
lines changed

1 file changed

+84
-2
lines changed

api/upload.js

Lines changed: 84 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const express = require('express');
22
const multer = require('multer');
3+
const bencode = require('bencode');
34
const cyrpto = require('crypto');
45
const db = require('./../db.js');
56
const _ = require('lodash');
@@ -15,6 +16,87 @@ const storage = multer.diskStorage({
1516
}
1617
});
1718

18-
const hashTorrent = (torrentBuffer) => {
19+
const fileFilter = (req, file, cb) => {
20+
file.hash = hashTorrent(stripTrackers(file.buffer));
21+
cb(null, true);
22+
};
1923

20-
};
24+
const upload = multer({ storage, fileFilter });
25+
26+
const stripTrackers = torrentBuffer => {
27+
const torrent = bencode.decode(torrentBuffer);
28+
delete torrent.announce;
29+
return bencode.encode(torrent);
30+
};
31+
32+
const hashTorrent = torrentBuffer => {
33+
const hash = crypto.createHash('sha256');
34+
const code = process.env.COOKIE_SECRET + torrentBuffer.toString() + Math.floor((new Date).getTime() / 1000).toString();
35+
hash.update(code);
36+
return hash.digest('hex');
37+
};
38+
39+
const verifyAlbum = group => {
40+
const requiredFields = ['artist', 'album', 'year', 'release_type', 'format', 'bitrate', 'media'];
41+
const allowedFields = ['artist', 'album', 'year', 'release_type', 'format', 'bitrate', 'media'];
42+
43+
const verifiedGroup = new Map();
44+
45+
Object.entries(group).forEach(entry => {
46+
let key = entry[0];
47+
let value = entry[1];
48+
49+
if (allowedFields.includes(key)) {
50+
verifiedGroup.set(key, value);
51+
}
52+
});
53+
54+
requiredField.forEach(field => {
55+
if (!verifiedGroup.has(field)) {
56+
return Promise.reject(new Error('Missing required fields.'));
57+
}
58+
})
59+
60+
return Promise.resolve(verifiedGroup);
61+
};
62+
63+
const upTo = to => {
64+
let upToArray = [];
65+
for (let i = 1; i <= to; i++) {
66+
upToArray.push(`$${i}`);
67+
}
68+
return upToArray.toString();
69+
};
70+
71+
const createGroup = group => {
72+
return verifyAlbum(group).then(verifiedGroup => {
73+
const keys = verifiedGroup.keys();
74+
const values = verifiedGroup.values();
75+
const length = verifiedGroup.size();
76+
77+
return db.query(`insert into tracker.groups (${keys.toString()}) values (${upTo(length)}) return id`, values);
78+
});
79+
};
80+
81+
const store = (torrent, group) => {
82+
return db.query('insert into tracker.torrents (hash, path, group) values ($1, $2, $3)', [torrent.hash, torrent.path, group]);
83+
};
84+
85+
app.post('/upload', upload.fields([{ name: 'torrent', maxCount: 1 }]), (req, res) => {
86+
let group = req.body.group;
87+
if (typeof (group) !== 'Number') {
88+
createGroup(group).then(result => {
89+
group = result.rows[0].id;
90+
}).catch(err => {
91+
res.send(400);
92+
});
93+
}
94+
store(req.file, group).then(result => {
95+
const torrentId = result.rows[0].id;
96+
if (torrentId) {
97+
res.send(200, { id: torrentId });
98+
}
99+
});
100+
});
101+
102+
module.exports = app;

0 commit comments

Comments
 (0)