53 lines
1.6 KiB
TypeScript
53 lines
1.6 KiB
TypeScript
/* eslint-disable camelcase */
|
|
import mailchimp from '@mailchimp/mailchimp_marketing'
|
|
import { logger } from '@/logging/logging'
|
|
import { md5 } from '@/modules/shared/helpers/cryptoHelper'
|
|
import {
|
|
getMailchimpConfig,
|
|
getMailchimpStatus
|
|
} from '@/modules/shared/helpers/envHelper'
|
|
import { getUserById } from '@/modules/core/services/users'
|
|
|
|
async function addToMailchimpAudience(userId: string) {
|
|
// Do not do anything (inc. logging) if we do not explicitely enable it
|
|
if (!getMailchimpStatus()) return
|
|
|
|
// Note: fails here should not block registration at any cost
|
|
try {
|
|
const config = getMailchimpConfig() // Note: throws an error if not configured
|
|
|
|
mailchimp.setConfig({
|
|
apiKey: config.apiKey,
|
|
server: config.serverPrefix
|
|
})
|
|
|
|
const user = await getUserById({ userId })
|
|
|
|
if (!user) {
|
|
throw new Error(
|
|
'Could not register user for newsletter - no db user record found.'
|
|
)
|
|
}
|
|
|
|
const [first, second] = user.name.split(' ')
|
|
const subscriberHash = md5(user.email.toLowerCase())
|
|
|
|
// NOTE: using setListMember (NOT addListMember) to prevent errors for previously
|
|
// registered members.
|
|
await mailchimp.lists.setListMember(config.listId, subscriberHash, {
|
|
status_if_new: 'subscribed',
|
|
email_address: user.email,
|
|
merge_fields: {
|
|
EMAIL: user.email,
|
|
FNAME: first,
|
|
LNAME: second,
|
|
FULLNAME: user.name // NOTE: this field needs to be set in the audience merge fields
|
|
}
|
|
})
|
|
} catch (e) {
|
|
logger.warn(e, 'Failed to register user to newsletter.')
|
|
}
|
|
}
|
|
|
|
export { addToMailchimpAudience }
|