da3ff600642bf8291d37fba797269f81bcbd1c9d
[ndcode_site.git] / api / contact / send_enquiry.json.jst
1 let nodemailer = require('nodemailer')
2 let XDate = require('xdate')
3
4 return async env => {a
5   let get_globals = await _require('/_lib/get_globals.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, contact_from, contact_to
36       try {
37         // initialize env.session_key, set cookie in env.response
38         get_session(env, transaction)
39
40         nodemailer_contact = nodemailer.createTransport(
41           await (
42             await (
43               await transaction.get({})
44             ).get('nodemailer')
45           ).get_json('contact')
46         )
47         let globals = await get_globals(env, transaction)
48         contact_from = await globals.get_json('contact_from')
49         contact_to = await globals.get_json('contact_to')
50
51         await transaction.commit()
52       }
53       catch (error) {
54         transaction.rollback()
55         throw error
56       }
57
58       let name =
59         details.family_name.length ?
60           `${details.given_names} ${details.family_name}` :
61           details.given_names
62       let subject =
63         details.company.length ?
64           `Enquiry: ${details.company}` :
65           'Enquiry'
66       await nodemailer_contact.sendMail(
67         {
68           from: contact_from,
69           to: contact_to,
70           replyTo: `${name} <${details.email}>`,
71           subject,
72           text: details.message
73         }
74       )
75     }
76   )
77 }