· 6 years ago · Oct 23, 2019, 02:44 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 const [is_valid_env, invalid_env_response] = check_env(process.env);
9 if (!is_valid_env) return invalid_env_response;
10 // 0. validate request body
11 const [body, is_valid_body, invalid_body_response] = check_body(event.body);
12 // 0b. Return 400 - Bad request
13 if (!is_valid_body) return invalid_body_response;
14 // 0a. Continue;
15 const { email, list_id, interests = [] } = body;
16 // 1. Create API instance
17 const mc_api = new Mailchimp(MAILCHIMP_API_KEY);
18 // 2. Already a member?
19 const check_opts = { email, list_id };
20 const [is_member, is_subscribed, exists_response] = await check_member_exists(
21 check_opts,
22 mc_api
23 );
24 // 2a. If they are, are they subscribed status?
25 // 2aa. Great! DONE 200
26 if (is_member && is_subscribed) return exists_response;
27 // 2ab. PUT to update status as 'subscribed'. DONE 200
28 if (is_member && !is_subscribed) {
29 const update_opts = { email, list_id, status: "subscribed", interests };
30 const [updated_response] = await update_member(update_opts, mc_api);
31 return updated_response;
32 }
33 // 2b. If they're not, continue;
34 // 3. Create list member
35 const create_opts = { email, list_id, interests };
36 const [created, create_succeeded, create_failed] = await create_member(
37 create_opts,
38 mc_api
39 );
40 // 3a. If succeeds, DONE 200
41 return created ? create_succeeded : create_failed;
42 // 3b. If fails, return 500
43};
44
45function check_env({ MAILCHIMP_API_KEY } = {}) {
46 const is_valid = !!MAILCHIMP_API_KEY;
47 const response = { statusCode: 500, message: "missing env vars" };
48 return [is_valid, response];
49}
50
51function check_body(request_body) {
52 const body = JSON.parse(request_body);
53 const is_valid = true; // check email, check list_id
54 const response = { statusCode: 400, message: "invalid request" };
55 return [body, is_valid, response];
56}
57
58async function check_member_exists({ email, list_id }, api) {
59 const is_member = true;
60 const is_subscribed = false;
61 const response = { statusCode: 200, message: "already subscribed" };
62 return [is_member, is_subscribed, response];
63}
64
65async function update_member({ email, list_id, status, interests }, api) {
66 const request = create_request_body({ email, list_id, status, interests });
67 const response = { statusCode: 200, message: "subscription updated" };
68 return [response];
69}
70
71async function create_member({ email, list_id, status, interests }, api) {
72 const request = create_request_body({ email, list_id, status, interests });
73 const success_response = { statusCode: 200, message: "create succeeded" };
74 const error_response = { statusCode: 500, message: "create failed" };
75 return [success_response, error_response];
76}
77
78function create_request_body({
79 email = "",
80 interests = [],
81 status = "subscribed",
82 merge_fields = {}
83} = {}) {
84 return {
85 email_address: email,
86 status,
87 merge_fields,
88 interests: interests.reduce((acc, cur) => ({ ...acc, [cur]: true }), {})
89 };
90}