using handlebars templating engine, refactored server code and storage code
This commit is contained in:
parent
1ad71904bc
commit
f9c2eb1ae4
7 changed files with 331 additions and 149 deletions
|
@ -1,36 +1,50 @@
|
|||
const express = require('express');
|
||||
const exphbs = require('express-handlebars');
|
||||
const busboy = require('connect-busboy');
|
||||
const path = require('path');
|
||||
const fs = require('fs-extra');
|
||||
const bodyParser = require('body-parser');
|
||||
const crypto = require('crypto');
|
||||
const conf = require('./config.js');
|
||||
const stream = require('stream');
|
||||
const fetch = require('node-fetch');
|
||||
const bytes = require('bytes');
|
||||
const conf = require('./config.js');
|
||||
const storage = require('./storage.js');
|
||||
|
||||
let isProduction =
|
||||
let notLocalHost =
|
||||
conf.env === 'production' &&
|
||||
conf.s3_bucket !== 'localhost' &&
|
||||
conf.bitly_key !== 'localhost';
|
||||
|
||||
const AWS = require('aws-sdk');
|
||||
const s3 = new AWS.S3();
|
||||
|
||||
const app = express();
|
||||
const redis = require('redis');
|
||||
const redis_client = redis.createClient();
|
||||
|
||||
redis_client.on('error', err => {
|
||||
console.log(err);
|
||||
});
|
||||
app.engine('handlebars', exphbs({ defaultLayout: 'main' }));
|
||||
app.set('view engine', 'handlebars');
|
||||
|
||||
app.use(busboy());
|
||||
app.use(bodyParser.json());
|
||||
|
||||
app.use(express.static(path.join(__dirname, '../public')));
|
||||
|
||||
app.get('/', (req, res) => {
|
||||
res.render('index');
|
||||
});
|
||||
|
||||
app.get('/download/:id', (req, res) => {
|
||||
res.sendFile(path.join(__dirname + '/../public/download.html'));
|
||||
let id = req.params.id;
|
||||
storage.filename(id).then(filename => {
|
||||
storage
|
||||
.length(id)
|
||||
.then(contentLength => {
|
||||
res.render('download', {
|
||||
filename: filename,
|
||||
filesize: bytes(contentLength)
|
||||
});
|
||||
})
|
||||
.catch(() => {
|
||||
res.render('download');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
app.get('/assets/download/:id', (req, res) => {
|
||||
|
@ -40,10 +54,9 @@ app.get('/assets/download/:id', (req, res) => {
|
|||
return;
|
||||
}
|
||||
|
||||
redis_client.hget(id, 'filename', (err, reply) => {
|
||||
if (!reply) {
|
||||
res.sendStatus(404);
|
||||
} else {
|
||||
storage
|
||||
.filename(id)
|
||||
.then(reply => {
|
||||
storage.length(id).then(contentLength => {
|
||||
res.writeHead(200, {
|
||||
'Content-Disposition': 'attachment; filename=' + reply,
|
||||
|
@ -54,8 +67,8 @@ app.get('/assets/download/:id', (req, res) => {
|
|||
|
||||
let file_stream = storage.get(id);
|
||||
|
||||
file_stream.on('close', () => {
|
||||
storage.forceDelete(id, redis_client).then(err => {
|
||||
file_stream.on(notLocalHost ? 'finish' : 'close', () => {
|
||||
storage.forceDelete(id).then(err => {
|
||||
if (!err) {
|
||||
console.log('Deleted.');
|
||||
}
|
||||
|
@ -63,8 +76,10 @@ app.get('/assets/download/:id', (req, res) => {
|
|||
});
|
||||
|
||||
file_stream.pipe(res);
|
||||
}
|
||||
});
|
||||
})
|
||||
.catch(err => {
|
||||
res.sendStatus(404);
|
||||
});
|
||||
});
|
||||
|
||||
app.post('/delete/:id', (req, res) => {
|
||||
|
@ -82,10 +97,10 @@ app.post('/delete/:id', (req, res) => {
|
|||
}
|
||||
|
||||
storage
|
||||
.delete(id, redis_client, delete_token)
|
||||
.delete(id, delete_token)
|
||||
.then(err => {
|
||||
if (!err) {
|
||||
console.log('Deleted off s3.');
|
||||
console.log('Deleted.');
|
||||
}
|
||||
})
|
||||
.catch(err => res.sendStatus(404));
|
||||
|
@ -102,11 +117,9 @@ app.post('/upload/:id', (req, res, next) => {
|
|||
console.log('Uploading: ' + filename);
|
||||
let url = `${req.protocol}://${req.get('host')}/download/${req.params.id}/`;
|
||||
|
||||
storage
|
||||
.set(req.params.id, file, filename, redis_client, url)
|
||||
.then(linkAndID => {
|
||||
res.json(linkAndID);
|
||||
});
|
||||
storage.set(req.params.id, file, filename, url).then(linkAndID => {
|
||||
res.json(linkAndID);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
|
|
@ -7,30 +7,51 @@ const path = require('path');
|
|||
const fetch = require('node-fetch');
|
||||
const crypto = require('crypto');
|
||||
|
||||
let isProduction =
|
||||
const redis = require('redis');
|
||||
const redis_client = redis.createClient();
|
||||
|
||||
redis_client.on('error', err => {
|
||||
console.log(err);
|
||||
});
|
||||
|
||||
let notLocalhost =
|
||||
conf.env === 'production' &&
|
||||
conf.s3_bucket !== 'localhost' &&
|
||||
conf.bitly_key !== 'localhost';
|
||||
|
||||
if (isProduction) {
|
||||
if (notLocalhost) {
|
||||
module.exports = {
|
||||
length: AWSLength,
|
||||
get: AWSGet,
|
||||
set: AWSSet,
|
||||
delete: AWSDelete,
|
||||
forceDelete: AWSForceDelete
|
||||
filename: filename,
|
||||
length: awsLength,
|
||||
get: awsGet,
|
||||
set: awsSet,
|
||||
delete: awsDelete,
|
||||
forceDelete: awsForceDelete
|
||||
};
|
||||
} else {
|
||||
module.exports = {
|
||||
length: LocalLength,
|
||||
get: LocalGet,
|
||||
set: LocalSet,
|
||||
delete: LocalDelete,
|
||||
forceDelete: LocalForceDelete
|
||||
filename: filename,
|
||||
length: localLength,
|
||||
get: localGet,
|
||||
set: localSet,
|
||||
delete: localDelete,
|
||||
forceDelete: localForceDelete
|
||||
};
|
||||
}
|
||||
|
||||
function LocalLength(id) {
|
||||
function filename(id) {
|
||||
return new Promise((resolve, reject) => {
|
||||
redis_client.hget(id, 'filename', (err, reply) => {
|
||||
if (!err) {
|
||||
resolve(reply);
|
||||
} else {
|
||||
reject();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function localLength(id) {
|
||||
return new Promise((resolve, reject) => {
|
||||
try {
|
||||
resolve(fs.statSync(__dirname + '/../static/' + id).size);
|
||||
|
@ -40,69 +61,67 @@ function LocalLength(id) {
|
|||
});
|
||||
}
|
||||
|
||||
function LocalGet(id) {
|
||||
function localGet(id) {
|
||||
return fs.createReadStream(__dirname + '/../static/' + id);
|
||||
}
|
||||
|
||||
function LocalSet(id, file, filename, client, url) {
|
||||
function localSet(id, file, filename, url) {
|
||||
return new Promise((resolve, reject) => {
|
||||
fstream = fs.createWriteStream(__dirname + '/../static/' + id);
|
||||
file.pipe(fstream);
|
||||
fstream.on('close', () => {
|
||||
let uuid = crypto.randomBytes(10).toString('hex');
|
||||
|
||||
client.hmset([id, 'filename', filename, 'delete', uuid]);
|
||||
client.expire(id, 86400000);
|
||||
redis_client.hmset([id, 'filename', filename, 'delete', uuid]);
|
||||
redis_client.expire(id, 86400000);
|
||||
console.log('Upload Finished of ' + filename);
|
||||
resolve({
|
||||
uuid: uuid,
|
||||
url: url
|
||||
});
|
||||
});
|
||||
|
||||
fstream.on('error', () => reject());
|
||||
});
|
||||
}
|
||||
|
||||
function LocalDelete(id, client, delete_token) {
|
||||
function localDelete(id, delete_token) {
|
||||
return new Promise((resolve, reject) => {
|
||||
client.hget(id, 'delete', (err, reply) => {
|
||||
redis_client.hget(id, 'delete', (err, reply) => {
|
||||
if (!reply || delete_token !== reply) {
|
||||
resolve(
|
||||
new Promise((resolve, reject) => {
|
||||
reject();
|
||||
})
|
||||
);
|
||||
reject();
|
||||
} else {
|
||||
resolve(
|
||||
new Promise((resolve, reject) => {
|
||||
client.del(id);
|
||||
resolve(fs.unlinkSync(__dirname + '/../static/' + id));
|
||||
})
|
||||
);
|
||||
redis_client.del(id);
|
||||
resolve(fs.unlinkSync(__dirname + '/../static/' + id));
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function LocalForceDelete(id, client) {
|
||||
function localForceDelete(id) {
|
||||
return new Promise((resolve, reject) => {
|
||||
client.del(id);
|
||||
redis_client.del(id);
|
||||
resolve(fs.unlinkSync(__dirname + '/../static/' + id));
|
||||
});
|
||||
}
|
||||
|
||||
function AWSLength(id) {
|
||||
function awsLength(id) {
|
||||
let params = {
|
||||
Bucket: conf.s3_bucket,
|
||||
Key: id
|
||||
};
|
||||
return new Promise((resolve, reject) => {
|
||||
s3.headObject(params, function(err, data) {
|
||||
resolve(data.ContentLength);
|
||||
if (!err) {
|
||||
resolve(data.ContentLength);
|
||||
} else {
|
||||
reject();
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function AWSGet(id) {
|
||||
function awsGet(id) {
|
||||
let params = {
|
||||
Bucket: conf.s3_bucket,
|
||||
Key: id
|
||||
|
@ -111,7 +130,7 @@ function AWSGet(id) {
|
|||
return s3.getObject(params).createReadStream();
|
||||
}
|
||||
|
||||
function AWSSet(id, file, filename, client, url) {
|
||||
function awsSet(id, file, filename, url) {
|
||||
let params = {
|
||||
Bucket: conf.s3_bucket,
|
||||
Key: id,
|
||||
|
@ -122,87 +141,72 @@ function AWSSet(id, file, filename, client, url) {
|
|||
s3.upload(params, function(err, data) {
|
||||
if (err) {
|
||||
console.log(err, err.stack); // an error occurred
|
||||
reject();
|
||||
} else {
|
||||
let uuid = crypto.randomBytes(10).toString('hex');
|
||||
|
||||
client.hmset([id, 'filename', filename, 'delete', uuid]);
|
||||
redis_client.hmset([id, 'filename', filename, 'delete', uuid]);
|
||||
|
||||
client.expire(id, 86400000);
|
||||
redis_client.expire(id, 86400000);
|
||||
console.log('Upload Finished of ' + filename);
|
||||
resolve(
|
||||
new Promise((resolve, reject) => {
|
||||
if (conf.bitly_key) {
|
||||
fetch(
|
||||
'https://api-ssl.bitly.com/v3/shorten?access_token=' +
|
||||
conf.bitly_key +
|
||||
'&longUrl=' +
|
||||
encodeURIComponent(url) +
|
||||
'&format=txt'
|
||||
)
|
||||
.then(res => {
|
||||
return res.text();
|
||||
})
|
||||
.then(body => {
|
||||
resolve({
|
||||
uuid: uuid,
|
||||
url: body
|
||||
});
|
||||
});
|
||||
} else {
|
||||
if (conf.bitly_key) {
|
||||
fetch(
|
||||
'https://api-ssl.bitly.com/v3/shorten?access_token=' +
|
||||
conf.bitly_key +
|
||||
'&longUrl=' +
|
||||
encodeURIComponent(url) +
|
||||
'&format=txt'
|
||||
)
|
||||
.then(res => {
|
||||
return res.text();
|
||||
})
|
||||
.then(body => {
|
||||
resolve({
|
||||
uuid: uuid,
|
||||
url: url
|
||||
url: body
|
||||
});
|
||||
}
|
||||
})
|
||||
);
|
||||
});
|
||||
} else {
|
||||
resolve({
|
||||
uuid: uuid,
|
||||
url: url
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function AWSDelete(id, client, delete_token) {
|
||||
function awsDelete(id, delete_token) {
|
||||
return new Promise((resolve, reject) => {
|
||||
client.hget(id, 'delete', (err, reply) => {
|
||||
redis_client.hget(id, 'delete', (err, reply) => {
|
||||
if (!reply || delete_token !== reply) {
|
||||
resolve(
|
||||
new Promise((resolve, reject) => {
|
||||
reject();
|
||||
})
|
||||
);
|
||||
reject();
|
||||
} else {
|
||||
client.del(id);
|
||||
redis_client.del(id);
|
||||
let params = {
|
||||
Bucket: conf.s3_bucket,
|
||||
Key: id
|
||||
};
|
||||
|
||||
resolve(
|
||||
new Promise((resolve, reject) => {
|
||||
s3.deleteObject(params, function(err, data) {
|
||||
resolve(err);
|
||||
});
|
||||
})
|
||||
);
|
||||
s3.deleteObject(params, function(err, data) {
|
||||
resolve(err);
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function AWSForceDelete(id, client) {
|
||||
function awsForceDelete(id) {
|
||||
return new Promise((resolve, reject) => {
|
||||
client.del(id);
|
||||
redis_client.del(id);
|
||||
let params = {
|
||||
Bucket: conf.s3_bucket,
|
||||
Key: id
|
||||
};
|
||||
|
||||
resolve(
|
||||
new Promise((resolve, reject) => {
|
||||
s3.deleteObject(params, function(err, data) {
|
||||
resolve(err);
|
||||
});
|
||||
})
|
||||
);
|
||||
s3.deleteObject(params, function(err, data) {
|
||||
resolve(err);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue