Skip to content

Commit 9598a31

Browse files
Initial commit
0 parents  commit 9598a31

File tree

8 files changed

+6206
-0
lines changed

8 files changed

+6206
-0
lines changed

.dockerignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
node_modules
2+
.git

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
node_modules

Dockerfile

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
2+
#
3+
# Dockerfile for docker-simple-file-upload
4+
#
5+
6+
FROM node:8-alpine
7+
RUN mkdir -p /code
8+
WORKDIR /code
9+
ADD . /code
10+
RUN npm install --production
11+
ENV NODE_ENV production
12+
CMD [ "npm", "start" ]
13+
EXPOSE 3000

app.js

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
2+
/* Application server
3+
*/
4+
5+
const express = require('express')
6+
const fileUpload = require('express-fileupload')
7+
8+
const fileSize = process.env.FILESIZE || Infinity
9+
10+
const files = 1
11+
const abortOnLimit = true
12+
const safeFileNames = true
13+
const limits = { fileSize, files }
14+
const options = { safeFileNames, limits, abortOnLimit }
15+
16+
function handleUpload(req, res, next) {
17+
const notProvided = new Error('File not provided')
18+
const invalidKey = new Error('Invalid key provided')
19+
if (!req.files || !req.files.data) throw notProvided
20+
if (!req.query.key || !process.env['KEY_' + req.query.key]) throw invalidKey
21+
req.files.data.mv(process.env['KEY_' + req.query.key], next)
22+
}
23+
24+
function handleSuccess(req, res, next) {
25+
console.log(`[${req.ip}] [201] Upload successful for ${req.query.key}`)
26+
res.status(201).send('Upload successful')
27+
}
28+
29+
function handleInvalidRequests(req, res) {
30+
throw new Error('That request is not supported')
31+
}
32+
33+
function handleError(err, req, res, next) {
34+
const code =
35+
err.message == 'File not provided' ||
36+
err.message == 'Invalid key provided' ||
37+
err.message == 'That request is not supported' ? 400 : 500
38+
const response = code == 400 ? err.message : 'Could not process upload'
39+
console.log(`[${req.ip}] [${code}] Upload failed with: ${err.message}`)
40+
res.status(code).send(response)
41+
}
42+
43+
const app = express()
44+
app.use(fileUpload(options))
45+
app.post('/upload', handleUpload)
46+
app.post('/upload', handleSuccess)
47+
app.all('*', handleInvalidRequests)
48+
app.use(handleError)
49+
50+
module.exports = app

app.test.js

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
2+
/* Integration tests
3+
*/
4+
5+
const fs = require('fs')
6+
const request = require('supertest')
7+
const app = require('./app')
8+
9+
describe('/upload', () => {
10+
11+
test('it should accept a file upload', async () => {
12+
process.env['KEY_TEST'] = '/tmp/AWEJA_testfile.txt'
13+
const name = 'test.txt'
14+
const url = '/upload?key=TEST'
15+
const file = Buffer.from('This is a test file', 'utf8')
16+
const res = await request(app).post(url).attach('data', file, name)
17+
expect(res.status).toEqual(201)
18+
expect(res.text).toEqual('Upload successful')
19+
expect(fs.existsSync('/tmp/AWEJA_testfile.txt')).toEqual(true)
20+
fs.unlinkSync('/tmp/AWEJA_testfile.txt')
21+
delete process.env['KEY_TEST']
22+
})
23+
24+
test('it should error for unknown requests', async () => {
25+
const res = await request(app).get('/')
26+
expect(res.status).toEqual(400)
27+
expect(res.text).toEqual('That request is not supported')
28+
})
29+
30+
test('it should fail when no file is provided', async () => {
31+
const res = await request(app).post('/upload')
32+
expect(res.status).toEqual(400)
33+
expect(res.text).toEqual('File not provided')
34+
})
35+
36+
test('it should fail when no key is provided', async () => {
37+
const name = 'test.txt'
38+
const file = Buffer.from('This is a test file', 'utf8')
39+
const res = await request(app).post('/upload').attach('data', file, name)
40+
expect(res.status).toEqual(400)
41+
expect(res.text).toEqual('Invalid key provided')
42+
})
43+
44+
})

index.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
2+
/* Simple file upload API
3+
*/
4+
5+
const app = require('./app')
6+
const port = process.env.PORT || 3000
7+
8+
app.listen(port, () => {
9+
console.log('Application started on port', port)
10+
})

0 commit comments

Comments
 (0)