Skip to content

Instantly share code, notes, and snippets.

@xdmorgan
Created October 5, 2019 01:59
Show Gist options
  • Save xdmorgan/3f9dc75bfe725dbfd102f14b1af383d1 to your computer and use it in GitHub Desktop.
Save xdmorgan/3f9dc75bfe725dbfd102f14b1af383d1 to your computer and use it in GitHub Desktop.
Netlify Mailchimp subscribe Lambda function
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 }), {}),
}
}
@xdmorgan
Copy link
Author

xdmorgan commented Oct 5, 2019

Example POST body:

{ "email": "yo@danny.dev", "list_id": "1234567890", "interests": ["asdf23414", "2342asdf"] }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment