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