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

Promoting to QA (Mailchimp Integration) #787

Merged
merged 10 commits into from
May 4, 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
1 change: 1 addition & 0 deletions app/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ require('../assets/css/sitemap/sitemap.scss')
require('../assets/css/settings/update-password.scss')
require('../assets/css/settings/settings.scss')
require('../assets/css/settings/preferences.scss')
require('../assets/css/settings/email.scss')
require('../assets/css/settings/edit-profile.scss')
require('../assets/css/settings/account-info.scss')
require('../assets/css/profile/subtrack.scss')
Expand Down
6 changes: 6 additions & 0 deletions app/services/api.service.js
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,8 @@ import _ from 'lodash'
case 'SUBMISSIONS':
case 'USER':
return _getRestangularV3(CONSTANTS.AUTH_API_URL)
case 'MAILCHIMP':
return _getRestangularV3(CONSTANTS.INTERNAL_API_URL)
default:
return _getRestangularV3()
}
Expand All @@ -93,6 +95,10 @@ import _ from 'lodash'
})
.setDefaultHeaders({ 'Content-Type': 'application/json' })
.addRequestInterceptor(function(element, operation, what, url) {
// for mailchimp api, don't add param field in the body
if (url.indexOf('mailchimp') > -1) {
return element
}
if (url.indexOf('members') > -1 || (operation.toLowerCase() === 'post' && url.indexOf('profiles') > -1)) {
return {
param: element
Expand Down
78 changes: 78 additions & 0 deletions app/services/mailchimp.service.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import angular from 'angular'

(function() {
'use strict'

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

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

function MailchimpService($http, logger, Restangular, CONSTANTS, ApiService, $q) {
var mailchimpApi = ApiService.getApiServiceProvider('MAILCHIMP')
var service = {
getMemberSubscription: getMemberSubscription,
addSubscription: addSubscription
}
return service

function getMemberSubscription(user) {
return $q(function(resolve, reject) {
mailchimpApi.one('mailchimp/lists', CONSTANTS.MAILCHIMP_LIST_ID)
.one('members', user.userId).get()
.then(function(resp) {
resolve(resp)
})
.catch(function(err) {
if (err.status === 404) {
logger.debug('Member subscription not found')
resolve()
return
}
logger.error('Error getting member to subscription list', err)

var errorStatus = 'FATAL_ERROR'
reject({
status: errorStatus,
msg: err.errorMessage
})
})
})
}


function addSubscription(user, preferences) {
var subscription = {
userId: user.userId,
firstName: user.firstName,
lastName: user.lastName,
interests: {}
}
if (!preferences) {
subscription.interests[CONSTANTS.MAILCHIMP_NL_TCO] = true
subscription.interests[CONSTANTS.MAILCHIMP_NL_IOS] = true
subscription.interests[CONSTANTS.MAILCHIMP_NL_DEV] = true
subscription.interests[CONSTANTS.MAILCHIMP_NL_DESIGN] = true
subscription.interests[CONSTANTS.MAILCHIMP_NL_DATA] = true
} else {
subscription.interests = preferences
}
return $q(function(resolve, reject) {
mailchimpApi.one('mailchimp/lists', CONSTANTS.MAILCHIMP_LIST_ID)
.customPUT(subscription, 'members')
.then(function(resp) {
resolve(resp)
})
.catch(function(err) {
logger.error('Error adding member to subscription list', err)

var errorStatus = 'FATAL_ERROR'

reject({
status: errorStatus,
msg: err.errorMessage
})
})
})
}
}
})()
104 changes: 104 additions & 0 deletions app/settings/email/email.controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
import angular from 'angular'

(function () {
'use strict'

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

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

function EmailSettingsController($rootScope, userProfile, ProfileService, MailchimpService, logger, CONSTANTS, toaster, $q, $scope) {
var vm = this
vm.loading = false
vm.saving = false
vm.isDirty = isDirty
vm.save = save

activate()

function activate() {
vm.newsletters = [
{
id: CONSTANTS.MAILCHIMP_NL_DEV,
name: 'Developer Newsletter',
desc: 'Software architecture, component assembly, application development and bug hunting',
enabled: false,
dirty: false
},
{
id: CONSTANTS.MAILCHIMP_NL_DESIGN,
name: 'Design Newsletter',
desc: 'Website, mobile, and product design; UI and UX',
enabled: false,
dirty: false
},
{
id: CONSTANTS.MAILCHIMP_NL_DATA,
name: 'Data Science Newsletter',
desc: 'Algorithm and data structures, statistical analysis',
enabled: false,
dirty: false
},
{
id: CONSTANTS.MAILCHIMP_NL_TCO,
name: 'TCO Newsletter',
desc: 'Software architecture, component assembly, application development and bug hunting',
enabled: false,
dirty: false
},
{
id: CONSTANTS.MAILCHIMP_NL_IOS,
name: 'iOS Community Newsletter',
desc: 'Software architecture, component assembly, application development and bug hunting',
enabled: false,
dirty: false
}
]

vm.loading = true
MailchimpService.getMemberSubscription(userProfile).then(function(resp) {
vm.loading = false
if (resp.interests) {
vm.newsletters.forEach(function(newsletter) {
if (resp.interests[newsletter.id]) {
newsletter.enabled = true
}
})
}
})
}

function isDirty() {
var dirty = false
vm.newsletters.forEach(function(newsletter) {
if (newsletter.dirty){
dirty = true
}
})
return dirty
}

function save() {
vm.saving = true
var preferences = {}
vm.newsletters.forEach(function(newsletter) {
preferences[newsletter.id] = newsletter.enabled
})
MailchimpService.addSubscription(userProfile, preferences).then(function(resp) {
vm.loading = false
vm.saving = false
// reset dirty state for all newsletter options
vm.newsletters.forEach(function(newsletter) {
newsletter.dirty = false
})
toaster.pop('success', 'Success!', 'Preferences updated.')
}).catch(function(err) {
logger.error('Could not update email preferences', err)
vm.loading = false
vm.saving = false

toaster.pop('error', 'Whoops!', 'Something went wrong. Please try again later.')
})
}
}
})()
30 changes: 30 additions & 0 deletions app/settings/email/email.jade
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
.email-preferences-container
.settings-section.newsletters
.section-info
h2 Always be up to date
.description Select the email notifications that you'd like to receive. We send them once every week, so you can be up to date with latest news, events and callenges.

.section-fields
.processing(ng-show="vm.loading")
i.fa.fa-spinner.fa-spin
.newsletters(ng-hide="vm.loading")
.newsletter(ng-repeat="newsletter in vm.newsletters")

.content(ng-class="{ disabled: !newsletter.enabled }")
.newsletter-details
.text
span.title {{newsletter.name}}
.description
span(ng-bind="newsletter.desc")

.onoffswitch
input.onoffswitch-checkbox(type='checkbox', name='onoffswitch', checked='', ng-model="newsletter.enabled", id="{{newsletter.name}}-onoffswitch", ng-change="newsletter.dirty = !newsletter.dirty")
label.onoffswitch-label(for='{{newsletter.name}}-onoffswitch')
span.onoffswitch-inner
span.onoffswitch-switch
.save-section
button.tc-btn.tc-btn-l.done-button(
type="button",
tc-busy-button, tc-busy-when="vm.saving",
ng-click="vm.save()",
ng-disabled="!vm.isDirty()") Save
7 changes: 0 additions & 7 deletions app/settings/preferences/preferences.jade
Original file line number Diff line number Diff line change
@@ -1,12 +1,5 @@
.preferences-container
ul
li
a(href="http://thecloud.appirio.com/email_prefs_request.html", target="_blank")
.icon
i.fa.fa-envelope
span Email Preferences
.description Specify what kind of email you would like to receive from us

li
a(href="https://apps.{{DOMAIN}}/forums/?module=Settings", target="_blank")
.icon
Expand Down
3 changes: 3 additions & 0 deletions app/settings/settings.jade
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
li
a(ui-sref="settings.account", ui-sref-active="active-tab") Account

li
a(ui-sref="settings.email", ui-sref-active="active-tab") Email

li
a(ui-sref="settings.preferences", ui-sref-active="active-tab") Preferences

Expand Down
17 changes: 17 additions & 0 deletions app/settings/settings.routes.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,23 @@ import angular from 'angular'
title: 'Account Info'
}
},
'settings.email': {
url: 'email/',
template: require('./email/email')(),
controller: 'EmailSettingsController',
controllerAs: 'vm',
data: {
title: 'Email Preferences'
},
resolve: {
userIdentity: ['UserService', function(UserService) {
return UserService.getUserIdentity()
}],
userProfile: ['userIdentity', 'ProfileService', function(userIdentity, ProfileService) {
return ProfileService.getUserProfile(userIdentity.handle.toLowerCase())
}]
}
},
'settings.preferences': {
url: 'preferences/',
template: require('./preferences/preferences')(),
Expand Down
24 changes: 22 additions & 2 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']
SkillPickerController.$inject = ['$scope', 'CONSTANTS', 'ProfileService', '$state', 'userProfile', 'featuredSkills', 'logger', 'toaster', 'MemberCertService', '$q', 'MailchimpService']

function SkillPickerController($scope, CONSTANTS, ProfileService, $state, userProfile, featuredSkills, logger, toaster, MemberCertService, $q) {
function SkillPickerController($scope, CONSTANTS, ProfileService, $state, userProfile, featuredSkills, logger, toaster, MemberCertService, $q, MailchimpService) {
var vm = this
vm.ASSET_PREFIX = CONSTANTS.ASSET_PREFIX
vm.IOS_PROGRAM_ID = CONSTANTS.SWIFT_PROGRAM_ID
Expand All @@ -32,6 +32,7 @@ import _ from 'lodash'
* Activates the controller.
*/
function activate() {
addToMailingList()
initCommunities()
checkCommunityStatus()
}
Expand Down Expand Up @@ -137,6 +138,25 @@ import _ from 'lodash'
}
}

function addToMailingList() {
return MailchimpService.getMemberSubscription(userProfile).then(function(subscription) {
logger.debug(subscription)
if (!subscription) {
return MailchimpService.addSubscription(userProfile).then(function(resp) {
logger.debug(resp)
}).catch(function(err) {
// no error to user
//TODO some error alert to community admin
logger.debug('error in adding user to member list')
})
}
}).catch(function(err) {
// no error to user
//TODO some error alert to community admin
logger.debug('error in adding user to member list')
})
}

/**
* Persists the user's altered information.
*/
Expand Down
Loading