Get contact form working again with new style form and API
[ndcode_site.git] / api / contact / send_enquiry.json.jst
1 let crypto = require('crypto')
2 let logjson = (await import('@ndcode/logjson')).default
3 let XDate = require('xdate')
4
5 return async env => {
6   let globals = await env.site.get_json('/_config/globals.json')
7   let nodemailer_contact = await env.site.get_nodemailer(
8     '/_config/nodemailer_contact.json'
9   )
10   let post_request = await _require('/_lib/post_request.jst')
11   let session_cookie = await _require('/_lib/session_cookie.jst')
12   let Problem = await _require('/_lib/Problem.jst')
13
14   await post_request(
15     // env
16     env,
17     // handler
18     async details => {
19       // coerce and/or validate
20       details = {
21         given_names: details.given_names.slice(0, 256),
22         family_name: details.family_name.slice(0, 256),
23         company: details.company.slice(0, 256),
24         email: details.email.slice(0, 256).toLowerCase(),
25         message: details.message.slice(0, 65536),
26       }
27       if (
28         details.given_names.length === 0 ||
29           details.email.length === 0 ||
30           details.message.length === 0
31       )
32         throw new Problem(
33           'Bad request',
34           'Minimum length check failed',
35           400
36         )
37
38       let transaction = await env.site.database.Transaction()
39       try {
40         // initialize env.session_key, set cookie in env.response
41         session_cookie(env, transaction)
42         await transaction.commit()
43       }
44       catch (error) {
45         transaction.rollback()
46         throw error
47       }
48
49       let name =
50         details.family_name.length ?
51           `${details.given_names} ${details.family_name}` :
52           details.given_names
53       let subject =
54         details.company.length ?
55           `Enquiry: ${details.company}` :
56           'Enquiry'
57       await nodemailer_contact.sendMail(
58         {
59           from: globals.contact_from,
60           to: globals.contact_to,
61           replyTo: `${name} <${details.email}>`,
62           subject: subject,
63           text: details.message
64         }
65       )
66     }
67   )
68 }