pwf-website-new/server/mailchimp.ts

46 lines
1.6 KiB
TypeScript

import axios from 'axios';
import crypto from 'crypto';
// Environment variables for Mailchimp
const API_KEY = process.env.MAILCHIMP_API_KEY;
const SERVER_PREFIX = process.env.MAILCHIMP_SERVER_PREFIX;
const LIST_ID = process.env.MAILCHIMP_LIST_ID;
/**
* Subscribe a new email to the Mailchimp list
*/
export async function subscribeToMailchimp(email: string) {
if (!API_KEY || !SERVER_PREFIX || !LIST_ID) {
throw new Error('Mailchimp configuration missing. Please check your environment variables.');
}
try {
// Create MD5 hash of lowercase email for Mailchimp
const emailHash = crypto.createHash('md5').update(email.toLowerCase()).digest('hex');
// Set up the request
const url = `https://${SERVER_PREFIX}.api.mailchimp.com/3.0/lists/${LIST_ID}/members`;
const data = {
email_address: email,
status: 'subscribed'
};
const response = await axios.post(url, data, {
headers: {
'Content-Type': 'application/json',
'Authorization': `Basic ${Buffer.from(`apikey:${API_KEY}`).toString('base64')}`
}
});
return response.data;
} catch (error: any) {
// Handle existing subscribers gracefully
if (error.response && error.response.status === 400 &&
error.response.data && error.response.data.title === 'Member Exists') {
return { status: 'already_subscribed', message: 'This email is already subscribed to our newsletter.' };
}
// For other errors, re-throw with more context
throw new Error(`Failed to subscribe to newsletter: ${error.message}`);
}
}