a20e7979f59c578516f542e080e36251267caae1
[ndcode_site.git] / _lib / post_request.jst
1 let stream_buffers = require('stream-buffers')
2
3 return async (env, api, func) => {
4   let Problem = await _require('/_lib/Problem.jst')
5
6   let result
7   try {
8     if (env.request.method !== 'POST') {
9       env.response.setHeader('Allow', 'POST')
10       throw new Problem(
11         'Method not allowed',
12         `The endpoint "${env.parsed_url.path}" requires a POST request.`,
13         405
14       )
15     }
16
17     let write_stream = new stream_buffers.WritableStreamBuffer()
18     let data = new Promise(
19       (resolve, reject) => {
20         write_stream.
21         on('finish', () => {resolve(write_stream.getContents())}).
22         on('error', () => {reject()})
23       }
24     )
25     env.request.pipe(write_stream)
26     let arguments = JSON.parse((await data).toString())
27     console.log('api', api, 'arguments', arguments)
28
29     result = await func(...arguments)
30     if (result === undefined)
31       result = null
32     console.log('api', api, 'result', result)
33   }
34   catch (error) {
35     let problem =
36       error instanceof Problem ?
37         error :
38         new Problem(
39           // title
40           'Internal server error',
41           // details
42           error.message,
43           // status
44           500
45         )
46     console.log('api', api, 'problem', problem.detail)
47
48     env.mime_type = 'application/problem+json; charset=utf-8'
49     env.site.serve(
50       env,
51       problem.status,
52       Buffer.from(
53         JSON.stringify(
54           {
55             title: problem.title,
56             detail: problem.detail,
57             status: problem.status
58           },
59           null,
60           2
61         ) + '\n',
62         'utf-8'
63       ),
64       'post_request.jst'
65     )
66     return
67   }
68   
69   env.site.serve(
70     env,
71     200,
72     Buffer.from(JSON.stringify(result, null, 2) + '\n', 'utf-8'),
73     'post_request.jst'
74   )
75 }