Created
May 13, 2018 03:39
-
-
Save ahmadarif/c8988200c35a291a6f1e39640e7eaea1 to your computer and use it in GitHub Desktop.
MailChimp Service for Adonis/NodeJS App
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
'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() |
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
'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