From 0f29c8e79b3e037321c91b8f089f284e4303371f Mon Sep 17 00:00:00 2001 From: vikasrohit Date: Tue, 10 May 2016 18:22:37 +0530 Subject: [PATCH 1/4] AS#131482348128949, Refactor Mailchimp API wrapper to be generic user preferences service -- Adapted code to use the refactored api --- app/services/api.service.js | 2 +- ....service.js => userPreferences.service.js} | 32 +++++++++---------- app/settings/email/email.controller.js | 26 +++++++-------- app/skill-picker/skill-picker.controller.js | 8 ++--- 4 files changed, 34 insertions(+), 34 deletions(-) rename app/services/{mailchimp.service.js => userPreferences.service.js} (56%) diff --git a/app/services/api.service.js b/app/services/api.service.js index 9f7735975..36646fb26 100644 --- a/app/services/api.service.js +++ b/app/services/api.service.js @@ -74,7 +74,7 @@ import _ from 'lodash' case 'SUBMISSIONS': case 'USER': return _getRestangularV3(CONSTANTS.AUTH_API_URL) - case 'MAILCHIMP': + case 'PREFERENCES': return _getRestangularV3(CONSTANTS.INTERNAL_API_URL) default: return _getRestangularV3() diff --git a/app/services/mailchimp.service.js b/app/services/userPreferences.service.js similarity index 56% rename from app/services/mailchimp.service.js rename to app/services/userPreferences.service.js index ead0d06a1..e36d17f5e 100644 --- a/app/services/mailchimp.service.js +++ b/app/services/userPreferences.service.js @@ -3,22 +3,22 @@ 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') 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) }) @@ -40,21 +40,21 @@ import angular from 'angular' } - function addSubscription(user, preferences) { - var subscription = { + function saveEmailPreferences(user, preferences) { + var settings = { userId: user.userId, firstName: user.firstName, lastName: user.lastName, - interests: {} + subscriptions: {} } if (!preferences) { - subscription.interests[CONSTANTS.MAILCHIMP_NL_GEN] = true + settings.subscriptions[CONSTANTS.MAILCHIMP_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(settings, 'preferences/email') .then(function(resp) { resolve(resp) }) diff --git a/app/settings/email/email.controller.js b/app/settings/email/email.controller.js index 7086c4d74..37be5502b 100644 --- a/app/settings/email/email.controller.js +++ b/app/settings/email/email.controller.js @@ -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 @@ -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, @@ -63,11 +63,11 @@ 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) { + UserPreferencesService.saveEmailPreferences(userData, {}).then(function(resp) { logger.debug(resp) }).catch(function(err) { // no error to user @@ -75,9 +75,9 @@ import angular from 'angular' logger.debug('error in adding user to member list') }) } else { - if (subscription.interests) { + if (subscription) { vm.newsletters.forEach(function(newsletter) { - if (subscription.interests[newsletter.id]) { + if (subscription[newsletter.id]) { newsletter.enabled = true } }) @@ -102,7 +102,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 diff --git a/app/skill-picker/skill-picker.controller.js b/app/skill-picker/skill-picker.controller.js index a564c876c..53f2c28fc 100644 --- a/app/skill-picker/skill-picker.controller.js +++ b/app/skill-picker/skill-picker.controller.js @@ -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 @@ -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 From a6b710578d230df669ac67be1a8c45527ed26467 Mon Sep 17 00:00:00 2001 From: vikasrohit Date: Wed, 11 May 2016 12:53:35 +0530 Subject: [PATCH 2/4] AS#131482348128949, Refactor Mailchimp API wrapper to be generic user preferences service -- Fixed new service reference in tests --- app/skill-picker/skill-picker.spec.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/app/skill-picker/skill-picker.spec.js b/app/skill-picker/skill-picker.spec.js index 70dd236c1..f80233939 100644 --- a/app/skill-picker/skill-picker.spec.js +++ b/app/skill-picker/skill-picker.spec.js @@ -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 @@ -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, 'getMemberSubscription', function(user) { var deferred = $q.defer() if (user.userId === 10336829) { deferred.resolve() @@ -65,7 +65,7 @@ describe('Skill Picker Controller', function() { } return deferred.promise }) - sinon.stub(mailchimpService, 'addSubscription', function(user) { + sinon.stub(userPrefSvc, 'addSubscription', function(user) { var deferred = $q.defer() if (user.userId === 10336829) { deferred.resolve() @@ -141,16 +141,16 @@ 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 + expect(userPrefSvc.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 + expect(userPrefSvc.addSubscription).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() + userPrefSvc.getMemberSubscription.reset() + userPrefSvc.addSubscription.reset() var scope = $rootScope.$new() var profile = angular.copy(mockProfile) @@ -165,10 +165,10 @@ describe('Skill Picker Controller', function() { $rootScope.$digest() expect(vm).to.exist // getMemberSubscription should always be called - expect(mailchimpService.getMemberSubscription).to.be.calledOnce + expect(userPrefSvc.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 + expect(userPrefSvc.addSubscription).not.to.be.called }) it('should add skill ', function() { From 53bfec8334b6af37803244506fbde181a515259d Mon Sep 17 00:00:00 2001 From: vikasrohit Date: Wed, 11 May 2016 15:07:50 +0530 Subject: [PATCH 3/4] AS#131482348128949, Refactor Mailchimp API wrapper to be generic user preferences service -- Fixed new service reference in tests --- app/skill-picker/skill-picker.spec.js | 30 +++++++++++++-------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/app/skill-picker/skill-picker.spec.js b/app/skill-picker/skill-picker.spec.js index f80233939..0d361f49f 100644 --- a/app/skill-picker/skill-picker.spec.js +++ b/app/skill-picker/skill-picker.spec.js @@ -53,7 +53,7 @@ describe('Skill Picker Controller', function() { }) userPrefSvc = UserPreferencesService - sinon.stub(userPrefSvc, 'getMemberSubscription', function(user) { + sinon.stub(userPrefSvc, 'getEmailPreferences', function(user) { var deferred = $q.defer() if (user.userId === 10336829) { deferred.resolve() @@ -65,7 +65,7 @@ describe('Skill Picker Controller', function() { } return deferred.promise }) - sinon.stub(userPrefSvc, 'addSubscription', function(user) { + sinon.stub(userPrefSvc, 'saveEmailPreferences', function(user) { var deferred = $q.defer() if (user.userId === 10336829) { deferred.resolve() @@ -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(userPrefSvc.getMemberSubscription).to.be.calledOnce - // addSubscription should be called once if not subscribed - // getMemberSubscription service mock returns null for mockProfile.userId - expect(userPrefSvc.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 - userPrefSvc.getMemberSubscription.reset() - userPrefSvc.addSubscription.reset() + // reset getEmailPreferences, saveEmailPreferences spy's called count + userPrefSvc.getEmailPreferences.reset() + userPrefSvc.saveEmailPreferences.reset() var scope = $rootScope.$new() var profile = angular.copy(mockProfile) @@ -164,11 +164,11 @@ describe('Skill Picker Controller', function() { }) $rootScope.$digest() expect(vm).to.exist - // getMemberSubscription should always be called - expect(userPrefSvc.getMemberSubscription).to.be.calledOnce - // addSubscription should not be called if already subscribed - // getMemberSubscription service mock returns valid object for userId 12345 - expect(userPrefSvc.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() { From a7892a822c8cf1bbda157f8a5a5a53f23033170a Mon Sep 17 00:00:00 2001 From: vikasrohit Date: Wed, 18 May 2016 16:46:27 +0530 Subject: [PATCH 4/4] AS#131482348128949, Refactor Mailchimp API wrapper to be generic user preferences service -- Adapted calling code for express based preference API --- app/services/userPreferences.service.js | 9 ++++----- app/settings/email/email.controller.js | 18 ++++++++++++------ 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/app/services/userPreferences.service.js b/app/services/userPreferences.service.js index e36d17f5e..787e940d7 100644 --- a/app/services/userPreferences.service.js +++ b/app/services/userPreferences.service.js @@ -20,7 +20,7 @@ import angular from 'angular' mailchimpApi.one('users', user.userId) .one('preferences', 'email').get() .then(function(resp) { - resolve(resp) + resolve(resp.subscriptions) }) .catch(function(err) { if (err.status === 404) { @@ -42,21 +42,20 @@ import angular from 'angular' function saveEmailPreferences(user, preferences) { var settings = { - userId: user.userId, firstName: user.firstName, lastName: user.lastName, subscriptions: {} } if (!preferences) { - settings.subscriptions[CONSTANTS.MAILCHIMP_NL_GEN] = true + settings.subscriptions['TOPCODER_NL_GEN'] = true } else { settings.subscriptions = preferences } return $q(function(resolve, reject) { mailchimpApi.one('users', user.userId) - .customPUT(settings, 'preferences/email') + .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) diff --git a/app/settings/email/email.controller.js b/app/settings/email/email.controller.js index 7cf51ee89..d16aa2666 100644 --- a/app/settings/email/email.controller.js +++ b/app/settings/email/email.controller.js @@ -68,7 +68,9 @@ import angular from 'angular' if (!subscription) { // add member to the list with default preferences UserPreferencesService.saveEmailPreferences(userData).then(function(resp) { - logger.debug(resp) + logger.debug(JSON.stringify(resp)) + validateState(resp) + }).catch(function(err) { // no error to user //TODO some error alert to community admin @@ -76,16 +78,20 @@ import angular from 'angular' }) } else { if (subscription) { - vm.newsletters.forEach(function(newsletter) { - if (subscription[newsletter.id]) { - newsletter.enabled = true - } - }) + 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) {