forked from floristic-project/hapi-swagger
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathupload-file.js
More file actions
155 lines (119 loc) · 3.44 KB
/
upload-file.js
File metadata and controls
155 lines (119 loc) · 3.44 KB
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
// `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');
const Blipp = require('blipp');
const Inert = require('inert');
const Vision = require('vision');
const Boom = require('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/',
config: {
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 () => {
try {
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;
} catch (err) {
throw err;
}
};
ser()
.then((server) => {
console.log(`Server listening on ${server.info.uri}`);
})
.catch((err) => {
console.error(err);
process.exit(1);
});