Make default_value be in JSON not logjson format (faster and more convenient)
[ndcode_site.git] / contact.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 navbar = await _require('/navbar.jst')
7   let contact_form = await _require('/contact_form.jst')
8
9   await navbar(
10     env,
11     async _out => {},
12     async _out => {
13       h1 {'Contact NDCODE'}
14
15       div(style="height: 15px;") {}
16
17       if (env.request.method == 'POST') {
18         let write_stream = new stream_buffers.WritableStreamBuffer()
19         let data = new Promise(
20           (resolve, reject) => {
21             write_stream.
22             on('finish', () => {resolve(write_stream.getContents())}).
23             on('error', () => {reject()})
24           }
25         )
26         env.request.pipe(write_stream)
27         let query = querystring.parse((await data).toString())
28         let full_email = `${query.first_name} ${query.last_name} <${query.email}>`
29         console.log('received contact form:', full_email)
30
31         // save the form contents in a dated logfile, so that we can
32         // recover manually if the email doesn't send for some reason
33         date = new XDate()
34         query.date = date.toUTCString()
35
36         await env.site.ensure_dir('/_logs')
37         env.site.modify_json(
38           `/_logs/contact_${date.toUTCString('yyyyMMdd')}.json`,
39           [],
40           async result => {result.value.push(query)}
41         )
42
43         // send email (asynchronously)
44         ;(await env.site.get_emailjs('/_config/email_contact.json')).send(
45           {
46             text: query.message,
47             from: 'Contact form <contact@ndcode.org>',
48             'reply-to': full_email,
49             to: 'Nick Downing <nick@ndcode.org>',
50             subject:
51               Object.prototype.hasOwnProperty.call(query, 'company') ?
52               'Enquiry: ' + query.company :
53               'Enquiry'
54           },
55           (err, message) => {
56             if (err)
57               console.error(err.stack || err.message)
58             else
59               console.log('sent contact email:', full_email)
60           }
61         )
62
63         p {'Thanks! We\'ll be in touch as soon as we can.'}
64       }
65       else {
66         p {'Do you require more information or consulting assistance with integrating the projects on this site? We\'d love to hear from you.'}
67
68         await contact_form(env, _out)
69       }
70     }
71   )
72 }