Skip to content
This repository was archived by the owner on Mar 4, 2025. It is now read-only.

Feature/mailchimp api preference api #816

Merged
merged 6 commits into from
May 25, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion app/services/api.service.js
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ import _ from 'lodash'
case 'SUBMISSIONS':
case 'USER':
return _getRestangularV3(CONSTANTS.AUTH_API_URL)
case 'MAILCHIMP':
case 'PREFERENCES':
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Shouldn't this point to API_URL (api.topcoder.com) instead?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, you are correct. Thanks.

return _getRestangularV3(CONSTANTS.INTERNAL_API_URL)
default:
return _getRestangularV3()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,24 +3,24 @@ import angular from 'angular'
(function() {
'use strict'

angular.module('tc.services').factory('MailchimpService', MailchimpService)
angular.module('tc.services').factory('UserPreferencesService', UserPreferencesService)

MailchimpService.$inject = ['$http', 'logger', 'Restangular', 'CONSTANTS', 'ApiService', '$q']
UserPreferencesService.$inject = ['$http', 'logger', 'Restangular', 'CONSTANTS', 'ApiService', '$q']

function MailchimpService($http, logger, Restangular, CONSTANTS, ApiService, $q) {
var mailchimpApi = ApiService.getApiServiceProvider('MAILCHIMP')
function UserPreferencesService($http, logger, Restangular, CONSTANTS, ApiService, $q) {
var mailchimpApi = ApiService.getApiServiceProvider('PREFERENCES')
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please rename the variable to prefService or something similar to avoid confusion.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for pointing it out.

var service = {
getMemberSubscription: getMemberSubscription,
addSubscription: addSubscription
getEmailPreferences: getEmailPreferences,
saveEmailPreferences: saveEmailPreferences
}
return service

function getMemberSubscription(user) {
function getEmailPreferences(user) {
return $q(function(resolve, reject) {
mailchimpApi.one('mailchimp/lists', CONSTANTS.MAILCHIMP_LIST_ID)
.one('members', user.userId).get()
mailchimpApi.one('users', user.userId)
.one('preferences', 'email').get()
.then(function(resp) {
resolve(resp)
resolve(resp.subscriptions)
})
.catch(function(err) {
if (err.status === 404) {
Expand All @@ -40,23 +40,22 @@ import angular from 'angular'
}


function addSubscription(user, preferences) {
var subscription = {
userId: user.userId,
function saveEmailPreferences(user, preferences) {
var settings = {
firstName: user.firstName,
lastName: user.lastName,
interests: {}
subscriptions: {}
}
if (!preferences) {
subscription.interests[CONSTANTS.MAILCHIMP_NL_GEN] = true
settings.subscriptions['TOPCODER_NL_GEN'] = true
} else {
subscription.interests = preferences
settings.subscriptions = preferences
}
return $q(function(resolve, reject) {
mailchimpApi.one('mailchimp/lists', CONSTANTS.MAILCHIMP_LIST_ID)
.customPUT(subscription, 'members')
mailchimpApi.one('users', user.userId)
.customPUT({ param: settings }, 'preferences/email')
.then(function(resp) {
resolve(resp)
resolve(resp.subscriptions)
})
.catch(function(err) {
logger.error('Error adding member to subscription list', err)
Expand Down
42 changes: 24 additions & 18 deletions app/settings/email/email.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ import angular from 'angular'

angular.module('tc.settings').controller('EmailSettingsController', EmailSettingsController)

EmailSettingsController.$inject = ['$rootScope', 'userData', 'ProfileService', 'MailchimpService', 'logger', 'CONSTANTS', 'toaster', '$q', '$scope']
EmailSettingsController.$inject = ['$rootScope', 'userData', 'ProfileService', 'UserPreferencesService', 'logger', 'CONSTANTS', 'toaster', '$q', '$scope']

function EmailSettingsController($rootScope, userData, ProfileService, MailchimpService, logger, CONSTANTS, toaster, $q, $scope) {
function EmailSettingsController($rootScope, userData, ProfileService, UserPreferencesService, logger, CONSTANTS, toaster, $q, $scope) {
var vm = this
vm.loading = false
vm.saving = false
Expand All @@ -19,42 +19,42 @@ import angular from 'angular'
function activate() {
vm.newsletters = [
{
id: CONSTANTS.MAILCHIMP_NL_GEN,
id: 'TOPCODER_NL_GEN',
name: 'General Newsletter',
desc: 'News summary from all tracks and programs',
enabled: false,
dirty: false
},
{
id: CONSTANTS.MAILCHIMP_NL_DESIGN,
id: 'TOPCODER_NL_DESIGN',
name: 'Design Newsletter',
desc: 'Website, mobile, and product design; UI and UX',
enabled: false,
dirty: false
},
{
id: CONSTANTS.MAILCHIMP_NL_DEV,
id: 'TOPCODER_NL_DEV',
name: 'Development Newsletter',
desc: 'Software architecture, component assembly, application development, and bug hunting',
enabled: false,
dirty: false
},
{
id: CONSTANTS.MAILCHIMP_NL_DATA,
id: 'TOPCODER_NL_DATA',
name: 'Data Science Newsletter',
desc: 'Algorithm and data structures, statistical analysis',
enabled: false,
dirty: false
},
{
id: CONSTANTS.MAILCHIMP_NL_IOS,
id: 'TOPCODER_NL_IOS',
name: 'iOS Community Newsletter',
desc: 'Mobile app design and development for iOS, with Swift emphasis',
enabled: false,
dirty: false
},
{
id: CONSTANTS.MAILCHIMP_NL_TCO,
id: 'TOPCODER_NL_TCO',
name: 'TCO Newsletter',
desc: 'Our annual online and onsite tournament to celebrate and reward the community',
enabled: false,
Expand All @@ -63,29 +63,35 @@ import angular from 'angular'
]

vm.loading = true
return MailchimpService.getMemberSubscription(userData).then(function(subscription) {
return UserPreferencesService.getEmailPreferences(userData).then(function(subscription) {
vm.loading = false
if (!subscription) {
// add member to the list with default preferences
MailchimpService.addSubscription(userData).then(function(resp) {
logger.debug(resp)
UserPreferencesService.saveEmailPreferences(userData).then(function(resp) {
logger.debug(JSON.stringify(resp))
validateState(resp)

}).catch(function(err) {
// no error to user
//TODO some error alert to community admin
logger.debug('error in adding user to member list')
})
} else {
if (subscription.interests) {
vm.newsletters.forEach(function(newsletter) {
if (subscription.interests[newsletter.id]) {
newsletter.enabled = true
}
})
if (subscription) {
validateState(subscription)
}
}
})
}

function validateState(subscription) {
vm.newsletters.forEach(function(newsletter) {
if (subscription[newsletter.id]) {
newsletter.enabled = true
}
})
}

function isDirty() {
var dirty = false
vm.newsletters.forEach(function(newsletter) {
Expand All @@ -102,7 +108,7 @@ import angular from 'angular'
vm.newsletters.forEach(function(newsletter) {
preferences[newsletter.id] = newsletter.enabled
})
MailchimpService.addSubscription(userData, preferences).then(function(resp) {
UserPreferencesService.saveEmailPreferences(userData, preferences).then(function(resp) {
vm.loading = false
vm.saving = false
// reset dirty state for all newsletter options
Expand Down
8 changes: 4 additions & 4 deletions app/skill-picker/skill-picker.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ import _ from 'lodash'

angular.module('tc.skill-picker').controller('SkillPickerController', SkillPickerController)

SkillPickerController.$inject = ['$scope', 'CONSTANTS', 'ProfileService', '$state', 'userProfile', 'featuredSkills', 'logger', 'toaster', 'MemberCertService', '$q', 'MailchimpService']
SkillPickerController.$inject = ['$scope', 'CONSTANTS', 'ProfileService', '$state', 'userProfile', 'featuredSkills', 'logger', 'toaster', 'MemberCertService', '$q', 'UserPreferencesService']

function SkillPickerController($scope, CONSTANTS, ProfileService, $state, userProfile, featuredSkills, logger, toaster, MemberCertService, $q, MailchimpService) {
function SkillPickerController($scope, CONSTANTS, ProfileService, $state, userProfile, featuredSkills, logger, toaster, MemberCertService, $q, UserPreferencesService) {
var vm = this
vm.ASSET_PREFIX = CONSTANTS.ASSET_PREFIX
vm.IOS_PROGRAM_ID = CONSTANTS.SWIFT_PROGRAM_ID
Expand Down Expand Up @@ -139,10 +139,10 @@ import _ from 'lodash'
}

function addToMailingList() {
return MailchimpService.getMemberSubscription(userProfile).then(function(subscription) {
return UserPreferencesService.getEmailPreferences(userProfile).then(function(subscription) {
logger.debug(subscription)
if (!subscription) {
return MailchimpService.addSubscription(userProfile).then(function(resp) {
return UserPreferencesService.saveEmailPreferences(userProfile).then(function(resp) {
logger.debug(resp)
}).catch(function(err) {
// no error to user
Expand Down
36 changes: 18 additions & 18 deletions app/skill-picker/skill-picker.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@ const mockData = require('../../tests/test-helpers/mock-data')

describe('Skill Picker Controller', function() {
var vm
var toasterSvc, memberCertService, profileService, mailchimpService, state
var toasterSvc, memberCertService, profileService, userPrefSvc, state
var mockProfile = mockData.getMockProfile()

beforeEach(function() {
bard.appModule('tc.skill-picker')
bard.inject(this, '$controller', '$rootScope', '$q', 'MemberCertService', 'ProfileService', 'MailchimpService', 'toaster', 'CONSTANTS')
bard.inject(this, '$controller', '$rootScope', '$q', 'MemberCertService', 'ProfileService', 'UserPreferencesService', 'toaster', 'CONSTANTS')

memberCertService = MemberCertService
profileService = ProfileService
Expand Down Expand Up @@ -52,8 +52,8 @@ describe('Skill Picker Controller', function() {
return deferred.promise
})

mailchimpService = MailchimpService
sinon.stub(mailchimpService, 'getMemberSubscription', function(user) {
userPrefSvc = UserPreferencesService
sinon.stub(userPrefSvc, 'getEmailPreferences', function(user) {
var deferred = $q.defer()
if (user.userId === 10336829) {
deferred.resolve()
Expand All @@ -65,7 +65,7 @@ describe('Skill Picker Controller', function() {
}
return deferred.promise
})
sinon.stub(mailchimpService, 'addSubscription', function(user) {
sinon.stub(userPrefSvc, 'saveEmailPreferences', function(user) {
var deferred = $q.defer()
if (user.userId === 10336829) {
deferred.resolve()
Expand Down Expand Up @@ -140,17 +140,17 @@ describe('Skill Picker Controller', function() {

it('should call mailchimp service to add subscription', function() {
expect(vm).to.exist
// getMemberSubscription should always be called
expect(mailchimpService.getMemberSubscription).to.be.calledOnce
// addSubscription should be called once if not subscribed
// getMemberSubscription service mock returns null for mockProfile.userId
expect(mailchimpService.addSubscription).to.be.calledOnce
// getEmailPreferences should always be called
expect(userPrefSvc.getEmailPreferences).to.be.calledOnce
// saveEmailPreferences should be called once if not subscribed
// getEmailPreferences service mock returns null for mockProfile.userId
expect(userPrefSvc.saveEmailPreferences).to.be.calledOnce
})

it('should not call mailchimp service to add subscription', function() {
// reset getMemberSubscription, addSubscription spy's called count
mailchimpService.getMemberSubscription.reset()
mailchimpService.addSubscription.reset()
// reset getEmailPreferences, saveEmailPreferences spy's called count
userPrefSvc.getEmailPreferences.reset()
userPrefSvc.saveEmailPreferences.reset()
var scope = $rootScope.$new()

var profile = angular.copy(mockProfile)
Expand All @@ -164,11 +164,11 @@ describe('Skill Picker Controller', function() {
})
$rootScope.$digest()
expect(vm).to.exist
// getMemberSubscription should always be called
expect(mailchimpService.getMemberSubscription).to.be.calledOnce
// addSubscription should not be called if already subscribed
// getMemberSubscription service mock returns valid object for userId 12345
expect(mailchimpService.addSubscription).not.to.be.called
// getEmailPreferences should always be called
expect(userPrefSvc.getEmailPreferences).to.be.calledOnce
// saveEmailPreferences should not be called if already subscribed
// getEmailPreferences service mock returns valid object for userId 12345
expect(userPrefSvc.saveEmailPreferences).not.to.be.called
})

it('should add skill ', function() {
Expand Down