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