b7b68e6e368818ad5c0bf1f58753607b2c996a6f
[ndcode_site.git] / feedback.html.jst
1 let querystring = require('querystring')
2 let stream_buffers = require('stream-buffers')
3 let XDate = require('xdate')
4
5 return async env => {
6   let globals = await env.site.get_json('/_config/globals.json')
7
8   let message
9   if (env.request.method === 'POST') {
10     let write_stream = new stream_buffers.WritableStreamBuffer()
11     let data = new Promise(
12       (resolve, reject) => {
13         write_stream.
14         on('finish', () => {resolve(write_stream.getContents())}).
15         on('error', () => {reject()})
16       }
17     )
18     env.request.pipe(write_stream)
19     let query = querystring.parse((await data).toString())
20     console.log('received feedback form:', query.page)
21
22     // save the form contents in a dated logfile, so that we can
23     // recover manually if the email doesn't send for some reason
24     date = new XDate()
25     query.date = date.toUTCString()
26
27     let transaction = await env.site.database.Transaction()
28     ;(
29       await (
30         await (
31           await (
32             await transaction.get({})
33           ).get('logs', {})
34         ).get(date.toUTCString('yyyyMMdd'), {})
35       ).get('feedback', [])
36     ).push(transaction.json_to_logjson(query))
37     transaction.commit()
38
39     // send email (asynchronously)
40     let emailjs_feedback = await env.site.get_emailjs(
41       '/_config/email_feedback.json'
42     )
43     emailjs_feedback.send(
44       {
45         from: globals.feedback_from,
46         to: globals.feedback_to,
47         subject: 'Page: ' + query.page,
48         text: query.message,
49       },
50       (err, message) => {
51         if (err)
52           console.error(err.stack || err.message)
53         else
54           console.log('sent feedback email:', query.page)
55       }
56     )
57
58     message = 'Thanks!'
59   }
60   else
61     message = 'Please POST.'
62
63   env.site.serve(env, 200, Buffer.from(message), 'feedback.html.jst')
64 }