Created
October 5, 2019 01:59
-
-
Save xdmorgan/3f9dc75bfe725dbfd102f14b1af383d1 to your computer and use it in GitHub Desktop.
Netlify Mailchimp subscribe Lambda function
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const Mailchimp = require('mailchimp-api-v3') | |
const validate = require('./validations') | |
const { MAILCHIMP_API_KEY } = process.env | |
exports.handler = async (event, context) => { | |
// require an API key or throw everytime | |
if (!MAILCHIMP_API_KEY) { | |
return { | |
statusCode: 500, | |
body: 'process.env.MAILCHIMP_API_KEY must be defined', | |
} | |
} | |
// badness if this throws | |
const body = JSON.parse(event.body) | |
// return forbidden if request requirements are invalid | |
try { | |
validate.is_email('body.email', body.email) | |
// i think they're usually 10? | |
validate.is_length('body.list_id', body.list_id, 4, 16) | |
} catch (e) { | |
return { statusCode: 403, body: e.message } | |
} | |
// prep request | |
const API = new Mailchimp(MAILCHIMP_API_KEY) | |
const path = `/lists/${body.list_id}/members` | |
const request = create_request_body({ | |
email: body.email, | |
interests: body.interests, | |
}) | |
// make request | |
let [statusCode, status, error] = [500, null, null] | |
try { | |
const result = await API.post({ path, body: request }) | |
statusCode = result.statusCode | |
status = result.status | |
} catch (e) { | |
statusCode = e.status | |
error = e.message | |
} | |
return { | |
statusCode, | |
body: JSON.stringify({ | |
subscribed: statusCode === 200, | |
status, | |
error, | |
}), | |
} | |
} | |
function create_request_body({ | |
email = '', | |
interests = [], | |
status = 'subscribed', | |
merge_fields = {}, | |
} = {}) { | |
return { | |
email_address: email, | |
status, | |
merge_fields, | |
interests: interests.reduce((acc, cur) => ({ ...acc, [cur]: true }), {}), | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Example POST body: