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