Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2019
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.09 KB | None | 0 0
  1. const Mailchimp = require("mailchimp-api-v3");
  2. const validate = require("./validations");
  3.  
  4. const { MAILCHIMP_API_KEY } = process.env;
  5.  
  6. exports.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.  
  45. function 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.  
  51. function 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.  
  58. async 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.  
  65. async 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.  
  71. async 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.  
  78. function 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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement