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