forked from hapi-swagger/hapi-swagger
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathupload-file.js
130 lines (114 loc) · 2.83 KB
/
upload-file.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
// `upload-file.js` - how create documenation for a file upload
// the file `example/assets/test-upload.json` has data in the correct format for this example
const Hapi = require('@hapi/hapi');
const Blipp = require('blipp');
const Inert = require('@hapi/inert');
const Vision = require('@hapi/vision');
const Boom = require('@hapi/boom');
const Joi = require('joi');
const HapiSwagger = require('../');
const storeFile = async function(request, h) {
const payload = request.payload;
// check that required file is present
// the filepath property incorrectlty uses a string 'undefined'
if (payload.file) {
const file = payload.file;
const headers = file.hapi.headers;
// check the content-type is json
if (headers['content-type'] === 'application/json') {
try {
let data = await streamToPromise(file);
// use Joi to validate file data format
const addSumSchema = Joi.object().keys({
a: Joi.number().required(),
b: Joi.number().required(),
operator: Joi.string().required(),
equals: Joi.number().required()
});
await Joi.validate(data, addSumSchema);
return h.response(data);
} catch (err) {
return Boom.badRequest(err.message);
}
} else {
return Boom.unsupportedMediaType();
}
} else {
return Boom.badRequest('File is required');
}
};
function streamToPromise(stream) {
return new Promise(function(resolve, reject) {
let data = '';
stream.on('data', chunk => {
data += chunk;
});
stream.on('end', () => {
resolve(data);
});
stream.on('error', err => {
reject(err);
});
});
}
const swaggerOptions = {};
const routes = [
{
method: 'POST',
path: '/store/file/',
options: {
handler: storeFile,
plugins: {
'hapi-swagger': {
payloadType: 'form'
}
},
tags: ['api'],
validate: {
payload: {
file: Joi.any()
.meta({ swaggerType: 'file' })
.description('json file')
}
},
payload: {
maxBytes: 1048576,
parse: true,
output: 'stream'
}
}
}
];
const ser = async () => {
const server = Hapi.Server({
host: 'localhost',
port: 3000
});
// Blipp and Good - Needs updating for Hapi v17.x
await server.register([
Inert,
Vision,
Blipp,
{
plugin: HapiSwagger,
options: swaggerOptions
}
]);
server.route(routes);
// add templates only for testing custom.html
server.views({
path: 'bin',
engines: { html: require('handlebars') },
isCached: false
});
await server.start();
return server;
};
ser()
.then(server => {
console.log(`Server listening on ${server.info.uri}`);
})
.catch(err => {
console.error(err);
process.exit(1);
});