Skip to content

Instantly share code, notes, and snippets.

@ahmadarif
Created May 13, 2018 03:39
Show Gist options
  • Save ahmadarif/c8988200c35a291a6f1e39640e7eaea1 to your computer and use it in GitHub Desktop.
Save ahmadarif/c8988200c35a291a6f1e39640e7eaea1 to your computer and use it in GitHub Desktop.
MailChimp Service for Adonis/NodeJS App
'use strict'
const Env = use('Env')
const Logger = use('Logger')
const axios = use('axios')
const Response = use('App/Class/Response')
class MailchimpService {
constructor () {
this.http = axios.create({
baseURL: 'https://us12.api.mailchimp.com/3.0',
timeout: 5000,
headers: {
'Content-Type': 'application/json',
'Authorization': `apikey ${Env.get('MAILCHIMP_API_KEY')}`
}
})
}
/**
* Get all lists
*
* @returns App/Class/Response
*/
async getLists () {
try {
const lists = (await this.http.get('/lists')).data.lists
return new Response({ data: lists })
} catch (e) {
Logger.transport('file').error('MailchimpService.getLists', e.response.data)
return new Response({ message: e.response.data.title }, e.response.status)
}
}
/**
* Get list by listId
*
* @param {String} listId
*
* @returns App/Class/Response
*/
async getList (listId) {
try {
const data = (await this.http.get(`/lists/${listId}`)).data
return new Response({ data: data })
} catch (e) {
Logger.transport('file').error('MailchimpService.getList', e.response.data)
return new Response({ message: e.response.data.title }, e.response.status)
}
}
/**
* Create list
*
* @param {Object} data
*
* @example data
* {
* "name": "New Lists",
* "contact": {
* "company": "Company name",
* "address1": "Company address",
* "city": "Company city",
* "state": "Company state",
* "zip": "Company zip",
* "country": "Company country code",
* "phone": "Company pone"
* },
* "permission_reminder": "You got this email because join our newsletter.",
* "use_archive_bar": true,
* "campaign_defaults": {
* "from_name": "Company Campaign",
* "from_email": "info@domain.com",
* "subject": "Sample subject campaign",
* "language": "Company language code"
* },
* "email_type_option": false,
* "visibility": "prv"
* }
*
* @returns App/Class/Response
*/
async createList (data) {
try {
const req = await this.http.post('/lists', data)
return new Response({ message: 'List successully created.' })
} catch (e) {
Logger.transport('file').error('MailchimpService.createList', e.response.data)
return new Response({ message: e.response.data.title }, e.response.status)
}
}
/**
* Update list data
*
* @param {String} listId
* @param {Object} data
*
* @example data
* {
* "name": "New Lists",
* "contact": {
* "company": "Company name",
* "address1": "Company address",
* "city": "Company city",
* "state": "Company state",
* "zip": "Company zip",
* "country": "Company country code",
* "phone": "Company pone"
* },
* "permission_reminder": "You got this email because join our newsletter.",
* "use_archive_bar": true,
* "campaign_defaults": {
* "from_name": "Company Campaign",
* "from_email": "info@domain.com",
* "subject": "Sample subject campaign",
* "language": "Company language code"
* },
* "email_type_option": false,
* "visibility": "prv"
* }
*
* @returns App/Class/Response
*/
async updateList (listId, data) {
try {
const req = await this.http.patch(`/lists/${listId}`, data)
return new Response({ message: 'List successully updated.' })
} catch (e) {
Logger.transport('file').error('MailchimpService.updateList', e.response.data)
return new Response({ message: e.response.data.title }, e.response.status)
}
}
/**
* Remove list
*
* @param {String} listId
*
* @returns App/Class/Response
*/
async deleteList (listId) {
try {
await this.http.delete(`/lists/${listId}`)
return new Response({ message: 'List successully deleted.' })
} catch (e) {
Logger.transport('file').error('MailchimpService.deleteList', e.response.data)
return new Response({ message: e.response.data.title }, e.response.status)
}
}
/**
* Get all members in list
*
* @param {String} listId
*
* @returns App/Class/Response
*/
async getMembers (listId) {
try {
const members = (await this.http.get(`/lists/${listId}/members`)).data.members
return new Response({ data: members })
} catch (e) {
Logger.transport('file').error('MailchimpService.getMembers', e.response.data)
return new Response({ message: e.response.data.title }, e.response.status)
}
}
/**
* Get member by ID in list
*
* @param {String} listId
* @param {String} memberId
*
* @returns App/Class/Response
*/
async getMember (listId, memberId) {
try {
const members = (await this.http.get(`/lists/${listId}/members/${memberId}`)).data
return new Response({ data: members })
} catch (e) {
Logger.transport('file').error('MailchimpService.getMember', e.response.data)
return new Response({ message: e.response.data.title }, e.response.status)
}
}
/**
* Add member to the list
*
* @param {String} listId
* @param {Object} data
*
* @example data
* {
* "email_address": "sample@domain.com",
* "status": "subscribed",
* "merge_fields": {
* "FNAME": "firstname",
* "LNAME": "lastname"
* }
* }
* // status: subscribed/unsubscribed/pending/cleaned
*
* @returns App/Class/Response
*/
async addMember (listId, data) {
try {
await this.http.post(`/lists/${listId}/members`, data)
return new Response({ message: 'Member successfully added to the list.' })
} catch (e) {
Logger.transport('file').error('MailchimpService.addMember', e.response.data)
return new Response({ message: e.response.data.title }, e.response.status)
}
}
/**
* Update member data, can perform partial updates
*
* @param {String} listId
* @param {String} memberId
* @param {Object} data
*
* @example data
* {
* "email_address": "sample@domain.com",
* "status": "subscribed",
* "merge_fields": {
* "FNAME": "firstname",
* "LNAME": "lastname"
* }
* }
* // status: subscribed/unsubscribed/pending/cleaned
*
* @returns App/Class/Response
*/
async updateMember (listId, memberId, data) {
try {
await this.http.patch(`/lists/${listId}/members/${memberId}`, data)
return new Response({ message: 'Member successfully updated.' })
} catch (e) {
Logger.transport('file').error('MailchimpService.updateMember', e.response.data)
return new Response({ message: e.response.data.title }, e.response.status)
}
}
/**
* Delete member from list
*
* @param {String} listId
* @param {String} memberId
*
* @returns App/Class/Response
*/
async deleteMember (listId, memberId) {
try {
await this.http.delete(`/lists/${listId}/members/${memberId}`)
return new Response({ message: 'Member successfully deleted.' })
} catch (e) {
Logger.transport('file').error('MailchimpService.deleteMember', e.response.data)
return new Response({ message: e.response.data.title }, e.response.status)
}
}
}
module.exports = new MailchimpService()
'use strict'
class Response {
/**
* @param {string} data Response body
* @param {boolean|number} status Status code
*/
constructor (data, status = true) {
this.data = data
if (typeof (status) === 'boolean') {
if (status === true) {
this.status = 200
} else {
this.status = 422
}
} else {
this.status = status
}
}
}
module.exports = Response
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment