Recv/index.js

135 lines
2.8 KiB
JavaScript

'use strict'
const config = require('./config');
const Repository = require('./lib/repository');
const _ = require('lodash');
const express = require('express');
const bodyParser = require('body-parser');
const tus = require('tus-node-server');
const jwt = require('jsonwebtoken');
const path = require('path');
const webpack = require('webpack');
const webpackDevMiddleware = require('webpack-dev-middleware');
const webpackHotMiddleware = require('webpack-hot-middleware');
const webpackConfig = require('./webpack.config.js');
function checkAuthorization(req, res, onVerified)
{
if (!req.headers.authorization || req.headers.authorization.split(' ')[0] !== 'Bearer')
{
res.sendStatus(400);
return;
}
var token = req.headers.authorization.split(' ')[1];
jwt.verify(token, config.jwtSecret, (err, decoded) =>
{
if (err)
{
res.sendStatus(403);
return;
}
onVerified(decoded);
});
}
(async function()
{
const isDevelopment = process.env.NODE_ENV !== 'production';
const repository = new Repository(config.database);
const tusServer = new tus.Server();
tusServer.datastore = new tus.FileStore({
path: config.fileUpload.url,
directory: config.fileUpload.path
});
const app = express();
app.use(bodyParser.urlencoded({ extended: true }));
app.use(bodyParser.json());
// Token API
app.post('/token/upload', async (req, res) =>
{
if (!req.body.code)
{
res.sendStatus(400);
return;
}
var userId = await repository.findCodeUserId(req.body.code);
if (userId !== null)
{
jwt.sign({
code: req.body.code,
userId: userId
}, config.jwtSecret, (err, token) =>
{
if (err)
res.sendStatus(500);
else
res.send(token);
});
}
else
res.sendStatus(403);
});
// Upload API
app.post('/complete', (req, res) =>
{
if (!req.body.files)
{
res.sendStatus(400);
return;
}
checkAuthorization(req, res, async (decoded) =>
{
console.log('1');
var uploadId = await repository.addUpload(decoded.userId, req.body.files);
console.log(uploadId);
res.send({ id: uploadId });
});
});
// Tus upload
const uploadApp = express();
uploadApp.all('*', (req, res) =>
{
checkAuthorization(req, res, (decoded) =>
{
tusServer.handle(req, res);
});
});
app.use('/upload', uploadApp);
// Frontend
if (isDevelopment)
{
const compiler = webpack(webpackConfig);
app.use(webpackDevMiddleware(compiler, {
publicPath: webpackConfig.output.publicPath
}));
app.use(webpackHotMiddleware(compiler));
}
app.use(express.static(path.join(__dirname, 'public', 'dist')));
var server = app.listen(config.port, () => console.log('Recv running on port ' + server.address().port));
})();