· 6 years ago · Oct 23, 2019, 02:10 PM
1const Mailchimp = require('mailchimp-api-v3')
2const validate = require('./validations')
3
4const { MAILCHIMP_API_KEY } = process.env
5
6exports.handler = async (event, context) => {
7 // require an API key or throw everytime
8 if (!MAILCHIMP_API_KEY) {
9 return {
10 statusCode: 500,
11 body: 'process.env.MAILCHIMP_API_KEY must be defined',
12 }
13 }
14
15 // badness if this throws
16 const body = JSON.parse(event.body)
17
18 // return forbidden if request requirements are invalid
19 try {
20 validate.is_email('body.email', body.email)
21 // i think they're usually 10?
22 validate.is_length('body.list_id', body.list_id, 4, 16)
23 } catch (e) {
24 return { statusCode: 403, body: e.message }
25 }
26
27 // prep request
28 const API = new Mailchimp(MAILCHIMP_API_KEY)
29 const path = `/lists/${body.list_id}/members`
30 const request = create_request_body({
31 email: body.email,
32 interests: body.interests,
33 })
34
35 // make request
36 let [statusCode, status, error] = [500, null, null]
37 try {
38 const result = await API.post({ path, body: request })
39 statusCode = result.statusCode
40 status = result.status
41 } catch (e) {
42 statusCode = e.status
43 error = e.message
44 }
45
46 return {
47 statusCode,
48 body: JSON.stringify({
49 subscribed: statusCode === 200,
50 status,
51 error,
52 }),
53 }
54}
55
56function create_request_body({
57 email = '',
58 interests = [],
59 status = 'subscribed',
60 merge_fields = {},
61} = {}) {
62 return {
63 email_address: email,
64 status,
65 merge_fields,
66 interests: interests.reduce((acc, cur) => ({ ...acc, [cur]: true }), {}),
67 }
68}