diff --git a/app/account/account.module.js b/app/account/account.module.js index c45ce1ea5..5f75f472c 100644 --- a/app/account/account.module.js +++ b/app/account/account.module.js @@ -12,10 +12,4 @@ import angular from 'angular' ] angular.module('tc.account', dependencies) - .config(['$provide',function ($provide) { - $provide.decorator('$log', ['$delegate', 'LogEnhancer', function ($delegate, LogEnhancer) { - LogEnhancer.enhanceLogger($delegate) - return $delegate - }]) - }]) })() diff --git a/app/account/account.routes.js b/app/account/account.routes.js index f9f650f4b..ea42cce75 100644 --- a/app/account/account.routes.js +++ b/app/account/account.routes.js @@ -15,11 +15,11 @@ import angular from 'angular' data: { authRequired: false }, - onEnter: ['$state', '$stateParams', 'TcAuthService', '$log', function($state, $stateParams, TcAuthService, $log) { + onEnter: ['$state', '$stateParams', 'TcAuthService', 'logger', function($state, $stateParams, TcAuthService, logger) { if (TcAuthService.isAuthenticated()) { // redirect to next if exists else dashboard if ($stateParams.next) { - $log.debug('Redirecting: ' + $stateParams.next) + logger.debug('Redirecting: ' + $stateParams.next) window.location.href = decodeURIComponent($stateParams.next) } else { $state.go('dashboard') diff --git a/app/account/login/login.controller.js b/app/account/login/login.controller.js index 8db372b9b..6d0c6bf5e 100644 --- a/app/account/login/login.controller.js +++ b/app/account/login/login.controller.js @@ -5,11 +5,10 @@ import angular from 'angular' angular.module('tc.account').controller('LoginController', LoginController) - LoginController.$inject = ['$log', '$state', '$stateParams', '$location', '$scope', 'TcAuthService', 'UserService', 'Helpers', 'CONSTANTS'] + LoginController.$inject = ['logger', '$state', '$stateParams', '$location', '$scope', 'TcAuthService', 'UserService', 'Helpers', 'CONSTANTS'] - function LoginController($log, $state, $stateParams, $location, $scope, TcAuthService, UserService, Helpers, CONSTANTS) { + function LoginController(logger, $state, $stateParams, $location, $scope, TcAuthService, UserService, Helpers, CONSTANTS) { var vm = this - $log = $log.getInstance('LoginController') vm.$stateParams = $stateParams vm.passwordReset = false vm.loginErrors = { @@ -76,27 +75,28 @@ import angular from 'angular' } function _doLogin(usernameOrEmail, password) { - return TcAuthService.login(usernameOrEmail, password).then(function(data) { - // success - $log.debug('logged in') + return TcAuthService.login(usernameOrEmail, password) + .then(function(data) { + // setup login event for analytics tracking + Helpers.setupLoginEventMetrics(usernameOrEmail) + return Helpers.redirectPostLogin($stateParams.next) - // setup login event for analytics tracking - Helpers.setupLoginEventMetrics(usernameOrEmail) - return Helpers.redirectPostLogin($stateParams.next) - - }).catch(function(resp) { - $log.warn(resp) - switch (resp.status) { - case 'ACCOUNT_INACTIVE': - $state.go('registeredSuccessfully') - // user should already be redirected - break - case 'UNKNOWN_ERROR': - default: - vm.loginErrors.WRONG_PASSWORD = true - vm.password = '' - } - }) + }) + .catch(function(err) { + logger.warning(err) + + switch (err.status) { + case 'ACCOUNT_INACTIVE': + $state.go('registeredSuccessfully') + // user should already be redirected + break + case 'UNKNOWN_ERROR': + default: + vm.loginErrors.WRONG_PASSWORD = true + vm.password = '' + logger.error('Error logging in: ', err) + } + }) } function socialLogin(platform) { @@ -111,19 +111,19 @@ import angular from 'angular' TcAuthService.socialLogin(platform, callbackUrl) .then(function() { - $log.debug('logged in') + logger.debug('logged in') return Helpers.redirectPostLogin($stateParams.next) }) - .catch(function(resp) { + .catch(function(err) { /*eslint no-fallthrough:0*/ - switch (resp.status) { + switch (err.status) { case 'ACCOUNT_INACTIVE': window.location.href = 'https://www.' + CONSTANTS.domain + '/account-inactive/' case 'USER_NOT_REGISTERED': default: vm.socialLoginError = 401 vm.loginErrors.SOCIAL_LOGIN_ERROR = true - break + logger.error('Error logging in with social account', err) } }) } diff --git a/app/account/logout/logout.controller.js b/app/account/logout/logout.controller.js index 4275cc9be..4be96b3c9 100644 --- a/app/account/logout/logout.controller.js +++ b/app/account/logout/logout.controller.js @@ -5,17 +5,16 @@ import angular from 'angular' angular.module('tc.account').controller('LogoutController', LogoutController) - LogoutController.$inject = ['$log', 'TcAuthService', '$window', 'CONSTANTS'] + LogoutController.$inject = ['logger', 'TcAuthService', '$window', 'CONSTANTS'] - function LogoutController($log, TcAuthService, $window, CONSTANTS) { - $log = $log.getInstance('LogoutController') + function LogoutController(logger, TcAuthService, $window, CONSTANTS) { TcAuthService.logout() .then(function() { - $log.debug('successfully logged out.') - // redirect to home + logger.debug('Successfully logged out.') + + // Redirect to home $window.location.href = CONSTANTS.MAIN_URL }) - } })() diff --git a/app/account/register/register.controller.js b/app/account/register/register.controller.js index 290cd1418..a08b1d86d 100644 --- a/app/account/register/register.controller.js +++ b/app/account/register/register.controller.js @@ -6,11 +6,9 @@ import _ from 'lodash' angular.module('tc.account').controller('RegisterController', RegisterController) - RegisterController.$inject = ['$log', 'CONSTANTS', '$state', '$stateParams', 'TcAuthService', 'UserService', 'ISO3166', 'Helpers'] + RegisterController.$inject = ['logger', 'CONSTANTS', '$state', '$stateParams', 'TcAuthService', 'UserService', 'ISO3166', 'Helpers'] - function RegisterController($log, CONSTANTS, $state, $stateParams, TcAuthService, UserService, ISO3166, Helpers) { - $log = $log.getInstance('RegisterController') - $log.debug('-init') + function RegisterController(logger, CONSTANTS, $state, $stateParams, TcAuthService, UserService, ISO3166, Helpers) { var vm = this vm.registering = false // prepares utm params, if available @@ -20,18 +18,10 @@ import _ from 'lodash' campaign : $stateParams && $stateParams.utm_campaign ? $stateParams.utm_campaign : '' } - // Set default for toggle password directive vm.defaultPlaceholder = 'Create Password' vm.busyMessage = CONSTANTS.BUSY_PROGRESS_MESSAGE - // FIXME - This needs to be setup with https - // lookup users country - // Helpers.getCountyObjFromIP() - // .then(function(obj) { - // vm.countryObj = obj - // }) - vm.countries = ISO3166.getAllCountryObjects() vm.updateCountry = function (angucompleteCountryObj) { @@ -85,18 +75,18 @@ import _ from 'lodash' } } - $log.debug('attempting to register user') TcAuthService.register(body) .then(function(data) { vm.registering = false - $log.debug('registered successfully') + logger.debug('Registered successfully') // In the future, go to dashboard $state.go('registeredSuccessfully') }) .catch(function(err) { vm.registering = false - $log.error('Error in registering new user: ', err) + + logger.error('Error in registering new user', err) }) } @@ -130,17 +120,22 @@ import _ from 'lodash' vm.isSocialRegistration = false } }) - .catch(function(result) { - switch (result.status) { - case 'SOCIAL_PROFILE_ALREADY_EXISTS': - vm.errMsg = 'An account with that profile already exists. Please login to access your account.' - break - default: - vm.errMsg = 'Whoops! Something went wrong. Please try again later.' - break - } - vm.isSocialRegistration = false - }) + .catch(function(err) { + switch (err.status) { + case 'SOCIAL_PROFILE_ALREADY_EXISTS': + vm.errMsg = 'An account with that profile already exists. Please login to access your account.' + + logger.error('Error registering user with social account', err) + + break + + default: + vm.errMsg = 'Whoops! Something went wrong. Please try again later.' + + logger.error('Error registering user with social account', err) + } + vm.isSocialRegistration = false + }) } vm.$stateParams = $stateParams diff --git a/app/blocks/logger/logger.js b/app/blocks/logger/logger.js index ec098a2c1..4b651a72b 100644 --- a/app/blocks/logger/logger.js +++ b/app/blocks/logger/logger.js @@ -12,10 +12,11 @@ import angular from 'angular' var service = { showToasts: false, - error: error, - info: info, + error : error, + info : info, success: success, warning: warning, + debug : debug, // straight to console bypass toastr log: $log.log @@ -25,19 +26,33 @@ import angular from 'angular' ///////////////////// function error(message, data, title) { - $log.error('Error: ' + message, data) + if (data) { + message = `${message} ${JSON.stringify(data)}` + } + + $log.error(message) + + if (window.NREUM) { + var err = new Error(message) + + window.NREUM.noticeError(err) + } } function info(message, data, title) { - $log.info('Info: ' + message, data) + $log.info('Info: ' + message, data ? data : '') } function success(message, data, title) { - $log.info('Success: ' + message, data) + $log.info('Success: ' + message, data ? data : '') + } + + function debug(message, data, title) { + $log.debug('Debug: ' + message, data ? data : '') } function warning(message, data, title) { - $log.warn('Warning: ' + message, data) + $log.warn('Warning: ' + message, data ? data : '') } } }()) diff --git a/app/directives/account/validate-register.directive.js b/app/directives/account/validate-register.directive.js index 5c765e014..d20920abe 100644 --- a/app/directives/account/validate-register.directive.js +++ b/app/directives/account/validate-register.directive.js @@ -52,14 +52,14 @@ import angular from 'angular' } } - usernameIsFree.$inject = ['UserService', '$log', '$q'] + usernameIsFree.$inject = ['UserService', 'logger', '$q'] - function usernameIsFree(UserService, $log, $q) { + function usernameIsFree(UserService, logger, $q) { return { require: 'ngModel', link: function(scope, element, attrs, ctrl) { ctrl.$asyncValidators.usernameIsFree = function(modelValue, viewValue) { - $log.info('Validating username: ' + modelValue) + logger.info('Validating username: ' + modelValue) var defer = $q.defer() @@ -97,14 +97,14 @@ import angular from 'angular' } } - emailIsAvailable.$inject = ['UserService', '$log', '$q'] + emailIsAvailable.$inject = ['UserService', 'logger', '$q'] - function emailIsAvailable(UserService, $log, $q) { + function emailIsAvailable(UserService, logger, $q) { return { require: 'ngModel', link: function(scope, element, attrs, ctrl) { ctrl.$asyncValidators.emailIsAvailable = function(modelValue, viewValue) { - $log.info('Validating email: ' + modelValue) + logger.info('Validating email: ' + modelValue) var defer = $q.defer() diff --git a/app/directives/external-account/external-account.directive.js b/app/directives/external-account/external-account.directive.js index 26b2b4c2d..ae9c3a35e 100644 --- a/app/directives/external-account/external-account.directive.js +++ b/app/directives/external-account/external-account.directive.js @@ -24,20 +24,21 @@ import _ from 'lodash' linkedAccounts: '=', readOnly: '=' }, - controller: ['$log', '$scope', 'ExternalAccountService', 'toaster', - function($log, $scope, ExternalAccountService, toaster) { - - $log = $log.getInstance('ExtAccountDirectiveCtrl') - + controller: ['logger', '$scope', 'ExternalAccountService', 'toaster', + function(logger, $scope, ExternalAccountService, toaster) { var _accountList = _.clone(_supportedAccounts, true) + _.remove(_accountList, function(al) { return al.order < 0}) + $scope.$watchCollection('linkedAccounts', function(newValue, oldValue) { if (newValue) { angular.forEach(_accountList, function(account) { var _linkedAccount = _.find(newValue, function(p) { return p.provider === account.provider }) + var accountStatus = _.get(_linkedAccount, 'data.status', null) + if (!_linkedAccount) { account.status = 'unlinked' } else if(accountStatus && accountStatus.toLowerCase() === 'pending') { @@ -46,9 +47,11 @@ import _ from 'lodash' account.status = 'linked' } }) + $scope.accountList = _accountList + } else { - // reset the status for all accounts + // Reset the status for all accounts angular.forEach(_accountList, function(account) { delete account.status }) @@ -59,11 +62,15 @@ import _ from 'lodash' provider = _.find(_supportedAccounts, function(s) { return s.provider === provider }) + if (status === 'linked') { - $log.debug(String.supplant('UnLinking to ' + provider.displayName)) + logger.debug(String.supplant('UnLinking to ' + provider.displayName)) + _unlink(provider) + } else if (status === 'unlinked') { - $log.debug(String.supplant('Linking to ' + provider.displayName)) + logger.debug(String.supplant('Linking to ' + provider.displayName)) + _link(provider) } } @@ -71,8 +78,10 @@ import _ from 'lodash' function _link(provider) { ExternalAccountService.linkExternalAccount(provider.provider, null) .then(function(resp) { - $log.debug('Social account linked: ' + JSON.stringify(resp)) + logger.debug('Social account linked: ' + JSON.stringify(resp)) + $scope.linkedAccounts.push(resp.linkedAccount) + toaster.pop('success', 'Success', String.supplant( 'Your {provider} account has been linked. Data from your linked account will be visible on your profile shortly.', @@ -80,9 +89,10 @@ import _ from 'lodash' ) ) }) - .catch(function(resp) { - if (resp.status === 'SOCIAL_PROFILE_ALREADY_EXISTS') { - $log.info('Social profile already linked to another account') + .catch(function(err) { + if (err.status === 'SOCIAL_PROFILE_ALREADY_EXISTS') { + logger.info('Social profile already linked to another account') + toaster.pop('error', 'Whoops!', String.supplant( 'This {provider} account is linked to another account. \ @@ -91,7 +101,8 @@ import _ from 'lodash' ) ) } else { - $log.error('Fatal Error: _link: ' + resp.msg) + logger.error('Fatal Error: _link: ', err.msg) + toaster.pop('error', 'Whoops!', 'Sorry, we are unable to add your account right now. Please try again later. If the problem persists, please contact support@topcoder.com.') } }) @@ -100,10 +111,12 @@ import _ from 'lodash' function _unlink(provider) { return ExternalAccountService.unlinkExternalAccount(provider.provider) .then(function(resp) { - $log.debug('Social account unlinked: ' + JSON.stringify(resp)) + logger.debug('Social account unlinked: ' + JSON.stringify(resp)) + var toRemove = _.findIndex($scope.linkedAccounts, function(la) { return la.provider === provider.provider }) + if (toRemove > -1) { // remove from the linkedAccounts array $scope.linkedAccounts.splice(toRemove, 1) @@ -115,13 +128,16 @@ import _ from 'lodash' ) ) }) - .catch(function(resp) { - var msg = resp.msg - if (resp.status === 'SOCIAL_PROFILE_NOT_EXIST') { - $log.info('Social profile not linked to account') + .catch(function(err) { + var msg = err.msg + + if (err.status === 'SOCIAL_PROFILE_NOT_EXIST') { + logger.info('Social profile not linked to account') + msg = '{provider} account is not linked to your account. If you think this is an error please contact support@topcoder.com.' } else { - $log.error('Fatal error: _unlink: ' + msg) + logger.error('Fatal error: _unlink', msg) + msg = 'Sorry! We are unable to unlink your {provider} account. If problem persists, please contact support@topcoder.com' } toaster.pop('error', 'Whoops!', String.supplant(msg, {provider: provider.displayName })) diff --git a/app/directives/external-account/external-link-deletion.controller.js b/app/directives/external-account/external-link-deletion.controller.js index bde43efc3..5e2b1fbeb 100644 --- a/app/directives/external-account/external-link-deletion.controller.js +++ b/app/directives/external-account/external-link-deletion.controller.js @@ -2,51 +2,55 @@ import angular from 'angular' import _ from 'lodash' (function () { - angular.module('tcUIComponents') .controller('ExternalLinkDeletionController', ExternalLinkDeletionController) - ExternalLinkDeletionController.$inject = ['ExternalWebLinksService', '$q', '$log', 'toaster', 'ngDialog', 'userHandle', 'account', 'linkedAccountsData'] + ExternalLinkDeletionController.$inject = ['ExternalWebLinksService', '$q', 'logger', 'toaster', 'ngDialog', 'userHandle', 'account', 'linkedAccountsData'] - function ExternalLinkDeletionController(ExternalWebLinksService, $q, $log, toaster, ngDialog, userHandle, account, linkedAccountsData) { + function ExternalLinkDeletionController(ExternalWebLinksService, $q, logger, toaster, ngDialog, userHandle, account, linkedAccountsData) { var vm = this vm.account = account - $log = $log.getInstance('ExternalLinkDeletionController') vm.deleteAccount = function() { - $log.debug('Deleting Account...') + logger.debug('Deleting Account...') + if (account && account.deletingAccount) { - $log.debug('Another deletion is already in progress.') + logger.debug('Another deletion is already in progress.') return } + if (account && account.provider === 'weblink') { account.deletingAccount = true - $log.debug('Deleting weblink...') - return ExternalWebLinksService.removeLink(userHandle, account.key).then(function(data) { - account.deletingAccount = false - $log.debug('Web link removed: ' + JSON.stringify(data)) - var toRemove = _.findIndex(linkedAccountsData, function(la) { - return la.provider === 'weblink' && la.key === account.key + logger.debug('Deleting weblink...') + + return ExternalWebLinksService.removeLink(userHandle, account.key) + .then(function(data) { + account.deletingAccount = false + logger.debug('Web link removed: ' + JSON.stringify(data)) + var toRemove = _.findIndex(linkedAccountsData, function(la) { + return la.provider === 'weblink' && la.key === account.key + }) + if (toRemove > -1) { + // remove from the linkedAccountsData array + linkedAccountsData.splice(toRemove, 1) + } + toaster.pop('success', 'Success', 'Your link has been removed.') + }) + .catch(function(err) { + var msg = err.msg + if (err.status === 'WEBLINK_NOT_EXIST') { + logger.info('Weblink does not exist') + + msg = 'Weblink is not linked to your account. If you think this is an error please contact support@topcoder.com.' + } else { + logger.error('Fatal error: _unlink', msg) + + msg = 'Sorry! We are unable to remove your weblink. If problem persists, please contact support@topcoder.com' + } + + account.deletingAccount = false + toaster.pop('error', 'Whoops!', msg) }) - if (toRemove > -1) { - // remove from the linkedAccountsData array - linkedAccountsData.splice(toRemove, 1) - } - toaster.pop('success', 'Success', 'Your link has been removed.') - }) - .catch(function(resp) { - var msg = resp.msg - if (resp.status === 'WEBLINK_NOT_EXIST') { - $log.info('Weblink does not exist') - msg = 'Weblink is not linked to your account. If you think this is an error please contact support@topcoder.com.' - } else { - $log.error('Fatal error: _unlink: ' + msg) - msg = 'Sorry! We are unable to remove your weblink. If problem persists, please contact support@topcoder.com' - } - - account.deletingAccount = false - toaster.pop('error', 'Whoops!', msg) - }) } } } diff --git a/app/directives/external-account/external-links-data.directive.js b/app/directives/external-account/external-links-data.directive.js index a2840f86f..96fe1d3b7 100644 --- a/app/directives/external-account/external-links-data.directive.js +++ b/app/directives/external-account/external-links-data.directive.js @@ -16,9 +16,8 @@ import angular from 'angular' editable: '=', userHandle: '@' }, - controller: ['$log', '$scope', '$window', '$filter', 'ExternalWebLinksService', 'toaster', 'ngDialog', - function($log, $scope, $window, $filter, ExternalWebLinksService, toaster, ngDialog) { - $log = $log.getInstance('ExternalLinksDataCtrl') + controller: ['logger', '$scope', '$window', '$filter', 'ExternalWebLinksService', 'toaster', 'ngDialog', + function(logger, $scope, $window, $filter, ExternalWebLinksService, toaster, ngDialog) { $scope.deletionDialog = null $scope.openLink = function(account) { @@ -63,7 +62,7 @@ import angular from 'angular' } } }).closePromise.then(function (data) { - $log.debug('Closing deletion confirmation dialog.') + logger.debug('Closing deletion confirmation dialog.') }) } } diff --git a/app/directives/external-account/external-web-links.directive.js b/app/directives/external-account/external-web-links.directive.js index 58eea3169..9f5f5e5d4 100644 --- a/app/directives/external-account/external-web-links.directive.js +++ b/app/directives/external-account/external-web-links.directive.js @@ -7,9 +7,9 @@ import angular from 'angular' // @example angular.module('tcUIComponents').directive('externalWebLink', ExternalWebLink) - ExternalWebLink.$inject = ['$log', 'ExternalWebLinksService', 'toaster'] + ExternalWebLink.$inject = ['logger', 'ExternalWebLinksService', 'toaster'] - function ExternalWebLink($log, ExternalWebLinksService, toaster) { + function ExternalWebLink(logger, ExternalWebLinksService, toaster) { var directive = { restrict: 'E', template: require('./external-web-link')(), @@ -17,24 +17,24 @@ import angular from 'angular' linkedAccounts: '=', userHandle: '@' }, - controller: ['$scope', '$log', ExternalWebLinkCtrl] + controller: ['$scope', 'logger', ExternalWebLinkCtrl] } - function ExternalWebLinkCtrl($scope, $log) { - $log = $log.getInstance('ExternalWebLinkCtrl') + function ExternalWebLinkCtrl($scope, logger) { $scope.addingWebLink = false $scope.errorMessage = null $scope.urlRegEx = /^(http(s?):\/\/)?(www\.)?[a-zA-Z0-9\.\-\_]+(\.[a-zA-Z]{2,15})+(\/[a-zA-Z0-9\_\-\s\.\/\?\%\#\&\=]*)?$/ $scope.addWebLink = function() { - $log.debug('URL: ' + $scope.url) + logger.debug('URL: ' + $scope.url) $scope.addingWebLink = true $scope.errorMessage = null + ExternalWebLinksService.addLink($scope.userHandle, $scope.url) .then(function(data) { $scope.addingWebLink = false - $log.debug('Web link added: ' + JSON.stringify(data)) + logger.debug('Web link added: ' + JSON.stringify(data)) data.data.provider = data.provider $scope.linkedAccounts.push(data.data) // reset the form when it is successfully added @@ -42,17 +42,19 @@ import angular from 'angular' $scope.url = null toaster.pop('success', 'Success', 'Your link has been added. Data from your link will be visible on your profile shortly.') }) - .catch(function(resp) { + .catch(function(err) { $scope.addingWebLink = false - if (resp.status === 'WEBLINK_ALREADY_EXISTS') { - $log.info('Social profile already linked to another account') + if (err.status === 'WEBLINK_ALREADY_EXISTS') { + logger.info('Social profile already linked to another account') + toaster.pop('error', 'Whoops!', 'This weblink is already added to your account. \ If you think this is an error please contact support@topcoder.com.' ) } else { - $log.error('Fatal Error: addWebLink: ' + resp.msg) + logger.error('Fatal Error: addWebLink', err.msg) + toaster.pop('error', 'Sorry, we are unable add web link. If problem persist please contact support@topcoder.com.') } }) diff --git a/app/directives/page-state-header/page-state-header.directive.js b/app/directives/page-state-header/page-state-header.directive.js index c5f11a4af..23030ba96 100644 --- a/app/directives/page-state-header/page-state-header.directive.js +++ b/app/directives/page-state-header/page-state-header.directive.js @@ -16,12 +16,12 @@ import _ from 'lodash' hideMoney: '=', defaultState: '@' }, - controller: ['CONSTANTS', '$rootScope', '$scope', 'ProfileService', '$log', '$state', pageStateHeader], + controller: ['CONSTANTS', '$rootScope', '$scope', 'ProfileService', 'logger', '$state', pageStateHeader], controllerAs: 'vm' } }) - function pageStateHeader(CONSTANTS, $rootScope, $scope, ProfileService, $log, $state) { + function pageStateHeader(CONSTANTS, $rootScope, $scope, ProfileService, logger, $state) { var vm = this vm.backHandler = backHandler @@ -106,6 +106,8 @@ import _ from 'lodash' .catch(function(err) { $scope.hideMoney = true vm.loading = false + + logger.error('Could not get user financial information', err) }) } } diff --git a/app/directives/responsive-carousel/responsive-carousel.directive.js b/app/directives/responsive-carousel/responsive-carousel.directive.js index cf226ed78..32869d152 100644 --- a/app/directives/responsive-carousel/responsive-carousel.directive.js +++ b/app/directives/responsive-carousel/responsive-carousel.directive.js @@ -13,8 +13,8 @@ import angular from 'angular' data: '=', handle: '@' }, - controller: ['$log', '$scope', '$element', '$window', - function($log, $scope, $element, $window) { + controller: ['$scope', '$element', '$window', + function($scope, $element, $window) { $scope.slideCounts = {} activate() diff --git a/app/directives/tc-paginator/tc-paginator.directive.js b/app/directives/tc-paginator/tc-paginator.directive.js index c46c4c6dd..822040974 100644 --- a/app/directives/tc-paginator/tc-paginator.directive.js +++ b/app/directives/tc-paginator/tc-paginator.directive.js @@ -13,7 +13,7 @@ import angular from 'angular' pageParams: '=', data: '=' }, - controller: ['$log', '$scope', '$element', function($log, $scope, $element) { + controller: ['logger', '$scope', '$element', function(logger, $scope, $element) { $element.addClass('tc-paginator') var vm = this @@ -35,7 +35,7 @@ import angular from 'angular' function activate() { // attaches watcher to watch data changes $scope.$watch('data', function(updatedValue) { - $log.debug('data updated for paginator ', updatedValue) + logger.debug('data updated for paginator ', updatedValue) init(updatedValue) }) } diff --git a/app/directives/tc-section/tc-section.directive.js b/app/directives/tc-section/tc-section.directive.js index bb9633053..ce64027ae 100644 --- a/app/directives/tc-section/tc-section.directive.js +++ b/app/directives/tc-section/tc-section.directive.js @@ -12,8 +12,8 @@ import angular from 'angular' scope: { state: '=state' }, - controller: ['$log', '$scope', '$element', function($log, $scope, $element) { - $log.debug('state ', $scope.state) + controller: ['logger', '$scope', '$element', function(logger, $scope, $element) { + logger.debug('state ', $scope.state) $element.addClass('tc-section') $scope.errMsg = 'Whoops! Something went wrong. Please try again later.' }] diff --git a/app/directives/tc-tabs/tc-tabs.directive.js b/app/directives/tc-tabs/tc-tabs.directive.js index 7007027e0..f788de803 100644 --- a/app/directives/tc-tabs/tc-tabs.directive.js +++ b/app/directives/tc-tabs/tc-tabs.directive.js @@ -11,8 +11,7 @@ import angular from 'angular' bindToController: true, template: require('./tc-tabs')(), scope: {}, - controller: ['$log', '$location', '$scope', function($log, $location, $scope, $element) { - $log = $log.getInstance('TcTabSetController') + controller: ['$location', '$scope', function($location, $scope, $element) { this.tabs = [] this.addTab = function addTab(tab) { diff --git a/app/directives/tcui-components.module.js b/app/directives/tcui-components.module.js index 6330f4da6..30abf2e5a 100644 --- a/app/directives/tcui-components.module.js +++ b/app/directives/tcui-components.module.js @@ -4,10 +4,4 @@ import angular from 'angular' 'use strict' angular.module('tcUIComponents', ['dcbImgFallback', 'blocks.logger', 'toaster']) - .config(['$provide',function ($provide) { - $provide.decorator('$log', ['$delegate', 'LogEnhancer', function ($delegate, LogEnhancer) { - LogEnhancer.enhanceLogger($delegate) - return $delegate - }]) - }]) })() diff --git a/app/layout/header/header.controller.js b/app/layout/header/header.controller.js index 1b2af8d8f..e8ae71961 100644 --- a/app/layout/header/header.controller.js +++ b/app/layout/header/header.controller.js @@ -6,9 +6,9 @@ import _ from 'lodash' angular.module('tc.layout').controller('HeaderController', HeaderController) - HeaderController.$inject = ['$state', 'TcAuthService', 'CONSTANTS', '$log', '$rootScope', 'UserService', 'ProfileService', 'NavService'] + HeaderController.$inject = ['$state', 'TcAuthService', 'CONSTANTS', 'logger', '$rootScope', 'UserService', 'ProfileService', 'NavService'] - function HeaderController($state, TcAuthService, CONSTANTS, $log, $rootScope, UserService, ProfileService, NavService) { + function HeaderController($state, TcAuthService, CONSTANTS, logger, $rootScope, UserService, ProfileService, NavService) { var vm = this vm.constants = CONSTANTS @@ -47,8 +47,10 @@ import _ from 'lodash' } function initHeaderProps(event) { - $log.debug(event + ' triggered header update.') + logger.debug(event + ' triggered header update.') + vm.isAuth = TcAuthService.isAuthenticated() + if (vm.isAuth) { vm.userHandle = UserService.getUserIdentity().handle @@ -65,8 +67,7 @@ import _ from 'lodash' vm.userHandleColor = ProfileService.getUserHandleColor(vm.profile) }) .catch(function(err) { - $log.error('Unable to get user data') - // todo handle error + logger.error('Unable to get user profile data', err) }) } } diff --git a/app/my-challenges/my-challenges.controller.js b/app/my-challenges/my-challenges.controller.js index 46b226332..b30fe3731 100644 --- a/app/my-challenges/my-challenges.controller.js +++ b/app/my-challenges/my-challenges.controller.js @@ -6,10 +6,9 @@ import _ from 'lodash' angular.module('tc.myChallenges').controller('MyChallengesController', MyChallengesController) - MyChallengesController.$inject = ['ChallengeService', 'UserService', '$q', '$log', '$state', 'CONSTANTS', 'Helpers', '$scope', 'userIdentity', '$stateParams'] + MyChallengesController.$inject = ['ChallengeService', 'UserService', '$q', 'logger', '$state', 'CONSTANTS', 'Helpers', '$scope', 'userIdentity', '$stateParams'] - function MyChallengesController(ChallengeService, UserService, $q, $log, $state, CONSTANTS, Helpers, $scope, userIdentity, $stateParams) { - $log = $log.getInstance('MyChallengesController') + function MyChallengesController(ChallengeService, UserService, $q, logger, $state, CONSTANTS, Helpers, $scope, userIdentity, $stateParams) { var vm = this vm.domain = CONSTANTS.domain vm.neverParticipated = false @@ -28,7 +27,7 @@ import _ from 'lodash' } vm.statusFilter = _.get($stateParams, 'status','active') if (vm.statusFilter !== 'active' && vm.statusFilter !== 'completed') { - $log.error('invalid filter, defaulting to active') + logger.info('invalid filter, defaulting to active') vm.statusFilter = 'active' } vm.orderBy @@ -91,8 +90,9 @@ import _ from 'lodash' vm.loading = CONSTANTS.STATE_READY } }) - .catch(function(resp) { - $log.error(resp) + .catch(function(err) { + logger.error('Error getting all challenges', err) + vm.loading = CONSTANTS.STATE_ERROR }) } diff --git a/app/my-dashboard/community-updates/community-updates.controller.js b/app/my-dashboard/community-updates/community-updates.controller.js index 6b9a9aefd..18880209f 100644 --- a/app/my-dashboard/community-updates/community-updates.controller.js +++ b/app/my-dashboard/community-updates/community-updates.controller.js @@ -5,10 +5,10 @@ import angular from 'angular' angular.module('tc.myDashboard').controller('CommunityUpdatesController', CommunityUpdatesController) - CommunityUpdatesController.$inject = ['BlogService', '$log'] + CommunityUpdatesController.$inject = ['BlogService', 'logger'] // Access and parses the blog RSS feed - function CommunityUpdatesController(BlogService, $log) { + function CommunityUpdatesController(BlogService, logger) { var vm = this vm.loading = true @@ -22,9 +22,9 @@ import angular from 'angular' }) .catch(function(err) { vm.loading = false - $log.debug(err) + + logger.error('Could not fetch blog feed', err) }) } } - })() diff --git a/app/my-dashboard/header-dashboard/header-dashboard.controller.js b/app/my-dashboard/header-dashboard/header-dashboard.controller.js index eff686328..168767a99 100644 --- a/app/my-dashboard/header-dashboard/header-dashboard.controller.js +++ b/app/my-dashboard/header-dashboard/header-dashboard.controller.js @@ -5,9 +5,9 @@ import angular from 'angular' angular.module('tc.myDashboard').controller('HeaderDashboardController', HeaderDashboardController) - HeaderDashboardController.$inject = ['$stateParams', 'profile', '$log'] + HeaderDashboardController.$inject = ['$stateParams', 'profile'] - function HeaderDashboardController($stateParams, profile, $log) { + function HeaderDashboardController($stateParams, profile) { var vm = this vm.profile = profile diff --git a/app/my-dashboard/my-challenges/my-challenges.controller.js b/app/my-dashboard/my-challenges/my-challenges.controller.js index 8b9466353..f848083d3 100644 --- a/app/my-dashboard/my-challenges/my-challenges.controller.js +++ b/app/my-dashboard/my-challenges/my-challenges.controller.js @@ -6,9 +6,9 @@ import _ from 'lodash' angular.module('tc.myDashboard').controller('MyChallengesWidgetController', MyChallengesWidgetController) - MyChallengesWidgetController.$inject = ['ChallengeService', 'UserService', '$log', 'CONSTANTS', 'userIdentity', '$q'] + MyChallengesWidgetController.$inject = ['ChallengeService', 'UserService', 'logger', 'CONSTANTS', 'userIdentity', '$q'] - function MyChallengesWidgetController(ChallengeService, UserService, $log, CONSTANTS, userIdentity, $q) { + function MyChallengesWidgetController(ChallengeService, UserService, logger, CONSTANTS, userIdentity, $q) { var vm = this vm.domain = CONSTANTS.domain vm.neverParticipated = false @@ -65,7 +65,8 @@ import _ from 'lodash' } }) .catch(function(err) { - $log.error(err) + logger.error('Error getting challenges and marathon matches', err) + vm.userHasChallenges = true vm.loading = false }) diff --git a/app/my-dashboard/my-dashboard.controller.js b/app/my-dashboard/my-dashboard.controller.js index df7603ded..0e0fcfc1b 100644 --- a/app/my-dashboard/my-dashboard.controller.js +++ b/app/my-dashboard/my-dashboard.controller.js @@ -6,9 +6,9 @@ import _ from 'lodash' angular.module('tc.myDashboard').controller('MyDashboardController', MyDashboardController) - MyDashboardController.$inject = ['userIdentity', 'ProfileService', '$log'] + MyDashboardController.$inject = ['userIdentity', 'ProfileService', 'logger'] - function MyDashboardController(userIdentity, ProfileService, $log) { + function MyDashboardController(userIdentity, ProfileService, logger) { var vm = this activate() @@ -33,7 +33,8 @@ import _ from 'lodash' }) .catch(function(err) { vm.showSRMs = false - $log.error(err) + + logger.error('Could not get user profile data', err) }) } } diff --git a/app/my-dashboard/programs/programs.controller.js b/app/my-dashboard/programs/programs.controller.js index 25bfdc6de..723b62ed9 100644 --- a/app/my-dashboard/programs/programs.controller.js +++ b/app/my-dashboard/programs/programs.controller.js @@ -9,13 +9,13 @@ import angular from 'angular' 'UserService', 'MemberCertService', 'CONSTANTS', - '$log', + 'logger', 'ChallengeService', '$q', '$rootScope' ] - function ProgramsController (UserService, MemberCertService, CONSTANTS, $log, ChallengeService, $q, $rootScope) { + function ProgramsController (UserService, MemberCertService, CONSTANTS, logger, ChallengeService, $q, $rootScope) { var vm = this vm.domain = CONSTANTS.domain vm.registered = false @@ -44,7 +44,8 @@ import angular from 'angular' .catch(function(err) { vm.registered = false vm.loading = false - $log.debug(err) + + logger.error('Could not get member cert registration data', err) }) } @@ -78,7 +79,8 @@ import angular from 'angular' }) .catch(function(err) { vm.loading = false - $log.debug(err) + + logger.error('Could not get peer review (iOS and Swift) challenges', err) }) } } diff --git a/app/my-dashboard/srms/srms.controller.js b/app/my-dashboard/srms/srms.controller.js index b2d4aac5f..2a40968b4 100644 --- a/app/my-dashboard/srms/srms.controller.js +++ b/app/my-dashboard/srms/srms.controller.js @@ -5,9 +5,9 @@ import angular from 'angular' angular.module('tc.myDashboard').controller('SRMWidgetController', SRMWidgetController) - SRMWidgetController.$inject = ['CONSTANTS', 'UserService','SRMService', '$q', '$log'] + SRMWidgetController.$inject = ['CONSTANTS', 'UserService','SRMService', '$q', 'logger'] - function SRMWidgetController(CONSTANTS, UserService, SRMService, $q, $log) { + function SRMWidgetController(CONSTANTS, UserService, SRMService, $q, logger) { var vm = this vm.srms = [] vm.state = CONSTANTS.STATE_LOADING @@ -51,8 +51,9 @@ import angular from 'angular' vm.srms = srms vm.state = CONSTANTS.STATE_READY - }).catch(function(error) { - $log.error() + }).catch(function(err) { + logger.error('Could not get list of SRMs or user SRMs', err) + vm.state = CONSTANTS.STATE_ERROR }) } diff --git a/app/my-dashboard/subtrack-stats/subtrack-stats.controller.js b/app/my-dashboard/subtrack-stats/subtrack-stats.controller.js index 6c3953cf0..ddd2829bb 100644 --- a/app/my-dashboard/subtrack-stats/subtrack-stats.controller.js +++ b/app/my-dashboard/subtrack-stats/subtrack-stats.controller.js @@ -5,9 +5,9 @@ import angular from 'angular' angular.module('tc.myDashboard').controller('SubtrackStatsController', SubtrackStatsController) - SubtrackStatsController.$inject = ['$filter', 'ProfileService', 'UserStatsService', 'userIdentity'] + SubtrackStatsController.$inject = ['$filter', 'ProfileService', 'UserStatsService', 'userIdentity', 'logger'] - function SubtrackStatsController($filter, ProfileService, UserStatsService, userIdentity) { + function SubtrackStatsController($filter, ProfileService, UserStatsService, userIdentity, logger) { var vm = this vm.loading = true @@ -36,6 +36,8 @@ import angular from 'angular' .catch(function(err) { vm.hasRanks = false vm.loading = false + + logger.error('Could not get user stats', err) }) } } diff --git a/app/my-srms/my-srms.controller.js b/app/my-srms/my-srms.controller.js index 40557e074..a9702784e 100644 --- a/app/my-srms/my-srms.controller.js +++ b/app/my-srms/my-srms.controller.js @@ -6,10 +6,9 @@ import _ from 'lodash' angular.module('tc.myDashboard').controller('MySRMsController', MySRMsController) - MySRMsController.$inject = ['UserService','SRMService', '$log', '$state', '$stateParams', 'CONSTANTS', '$scope'] + MySRMsController.$inject = ['UserService','SRMService', 'logger', '$state', '$stateParams', 'CONSTANTS', '$scope'] - function MySRMsController(UserService, SRMService, $log, $state, $stateParams, CONSTANTS, $scope) { - $log = $log.getInstance('MySRMsController') + function MySRMsController(UserService, SRMService, logger, $state, $stateParams, CONSTANTS, $scope) { var vm = this vm.srms = [] vm.statusFilter = _.get($stateParams, 'status','past') @@ -93,8 +92,8 @@ import _ from 'lodash' vm.loading = CONSTANTS.STATE_READY } - function handleSRMsFailure(resp) { - $log.error(resp) + function handleSRMsFailure(err) { + logger.error('Could not get user SRMs', err) vm.loading = CONSTANTS.STATE_ERROR } } diff --git a/app/peer-review/edit-review/edit-review.controller.js b/app/peer-review/edit-review/edit-review.controller.js index ed80b462d..3358d50a2 100644 --- a/app/peer-review/edit-review/edit-review.controller.js +++ b/app/peer-review/edit-review/edit-review.controller.js @@ -7,9 +7,9 @@ import angular from 'angular' // answers saved but not submitted. angular.module('tc.peer-review').controller('EditReviewController', EditReviewController) - EditReviewController.$inject = ['$state', '$stateParams', 'ReviewService', 'ScorecardService', 'UserService', 'ChallengeService', 'Helpers', '$q', 'CONSTANTS'] + EditReviewController.$inject = ['$state', '$stateParams', 'ReviewService', 'ScorecardService', 'UserService', 'ChallengeService', 'Helpers', '$q', 'CONSTANTS', 'logger'] - function EditReviewController($state, $stateParams, ReviewService, ScorecardService, UserService, ChallengeService, Helpers, $q, CONSTANTS) { + function EditReviewController($state, $stateParams, ReviewService, ScorecardService, UserService, ChallengeService, Helpers, $q, CONSTANTS, logger) { var vm = this vm.domain = CONSTANTS.domain vm.challengeId = $stateParams.challengeId @@ -34,8 +34,10 @@ import angular from 'angular' challengeId: vm.challengeId }) }) - .catch(function(error) { - var message = 'An error occurred while trying to submit answers.\n' + error.status + ': ' + error.statusText + .catch(function(err) { + logger.error('Could not submit review data', err) + + var message = 'An error occurred while trying to submit answers.\n' + err.status + ': ' + err.statusText alert(message) @@ -52,8 +54,10 @@ import angular from 'angular' challengeId: vm.challengeId }) }) - .catch(function(error) { - var message = 'An error occurred while trying to update answers.\n' + error.status + ': ' + error.statusText + .catch(function(err) { + logger.error('Could not save review data for later', err) + + var message = 'An error occurred while trying to update answers.\n' + err.status + ': ' + err.statusText alert(message) diff --git a/app/peer-review/review-status/review-status.controller.js b/app/peer-review/review-status/review-status.controller.js index 5db5dacbf..c480ce39c 100644 --- a/app/peer-review/review-status/review-status.controller.js +++ b/app/peer-review/review-status/review-status.controller.js @@ -5,9 +5,9 @@ import angular from 'angular' angular.module('tc.peer-review').controller('ReviewStatusController', ReviewStatusController) - ReviewStatusController.$inject = ['$state', '$stateParams', 'ReviewService', 'ChallengeService', 'Helpers', 'CONSTANTS'] + ReviewStatusController.$inject = ['$state', '$stateParams', 'ReviewService', 'ChallengeService', 'Helpers', 'CONSTANTS', 'logger'] - function ReviewStatusController($state, $stateParams, ReviewService, ChallengeService, Helpers, CONSTANTS) { + function ReviewStatusController($state, $stateParams, ReviewService, ChallengeService, Helpers, CONSTANTS, logger) { var vm = this vm.domain = CONSTANTS.domain vm.loaded = false @@ -28,8 +28,9 @@ import angular from 'angular' reviewId: newReviewId }) }) - .catch(function(error) { - // An error occurred while trying to get the next review + .catch(function(err) { + logger.error('Could not get next review', err) + $state.reload() }) } diff --git a/app/profile/about/about.controller.js b/app/profile/about/about.controller.js index a3ed7359b..0c20d0af0 100644 --- a/app/profile/about/about.controller.js +++ b/app/profile/about/about.controller.js @@ -5,11 +5,10 @@ import angular from 'angular' angular.module('tc.profile').controller('ProfileAboutController', ProfileAboutController) - ProfileAboutController.$inject = ['$log', '$scope', '$q', 'ExternalAccountService', 'ExternalWebLinksService', 'UserService', 'CONSTANTS'] + ProfileAboutController.$inject = ['logger', '$scope', '$q', 'ExternalAccountService', 'ExternalWebLinksService', 'UserService', 'CONSTANTS'] - function ProfileAboutController($log, $scope, $q, ExternalAccountService, ExternalWebLinksService, UserService, CONSTANTS) { + function ProfileAboutController(logger, $scope, $q, ExternalAccountService, ExternalWebLinksService, UserService, CONSTANTS) { var vm = this - $log = $log.getInstance('ProfileAboutController') var profileVm = $scope.$parent.profileVm vm.categoryIndex = 0 vm.skillIndex = 0 @@ -34,7 +33,9 @@ import angular from 'angular' vm.displaySection.externalLinks = profileVm.showEditProfileLink || !!vm.linkedExternalAccounts.length profileVm.status.externalLinks = CONSTANTS.STATE_READY - }).catch(function(resp) { + }).catch(function(err) { + logger.error('Could retrive web links and external accounts', err) + profileVm.status.externalLinks = CONSTANTS.STATE_ERROR }) diff --git a/app/profile/profile.controller.js b/app/profile/profile.controller.js index 54fdfac4a..1ead6b9cc 100644 --- a/app/profile/profile.controller.js +++ b/app/profile/profile.controller.js @@ -6,12 +6,12 @@ import moment from 'moment' angular.module('tc.profile').controller('ProfileCtrl', ProfileCtrl) - ProfileCtrl.$inject = ['CONSTANTS', '$log', '$q', + ProfileCtrl.$inject = ['CONSTANTS', 'logger', '$q', 'TcAuthService', 'UserService', 'UserStatsService', 'ProfileService', 'ChallengeService', 'ExternalAccountService', 'userHandle', 'profile', 'ngDialog', '$anchorScroll' ] - function ProfileCtrl(CONSTANTS, $log, $q, TcAuthService, UserService, UserStatsService, ProfileService, ChallengeService, ExternalAccountService, userHandle, profile, ngDialog, $anchorScroll) { + function ProfileCtrl(CONSTANTS, logger, $q, TcAuthService, UserService, UserStatsService, ProfileService, ChallengeService, ExternalAccountService, userHandle, profile, ngDialog, $anchorScroll) { var vm = this // set profile to the object that was resolved vm.profile = profile @@ -28,7 +28,7 @@ import moment from 'moment' 'COPILOT': 'copilot' } - $log.debug() + logger.debug() vm.status = { 'badges': CONSTANTS.STATE_LOADING, 'stats': CONSTANTS.STATE_LOADING, @@ -39,65 +39,72 @@ import moment from 'moment' activate() // adding stats promise on scope so child states can use this. - vm.statsPromise = ProfileService.getUserStats(vm.userHandle).then(function(stats) { - if (stats) { - vm.stats = stats - vm.profile.tracks = vm.profile.tracks || [] - vm.tracks = ProfileService.getTracks(stats) || vm.profile.tracks - if (stats.COPILOT && stats.COPILOT.contests && vm.profile.tracks.indexOf('COPILOT') == -1) { - vm.profile.tracks.push('COPILOT') - } - // flag to indicate if the member has acitivity on topcoder to be shown - // it is set to true, if we get at least one track with showTrack == true - vm.showTCActivity = false - vm.numWins = vm.stats.wins - vm.categories = ProfileService.getRanks(vm.stats) - for(var trackName in vm.categories) { - // trackStats is an array of subtrack rankings along with track stats properties (e.g showTrack) - var trackStats = vm.categories[trackName] - // flag to indicate if the member has activity for this track - // it is set to true, if we get at least one subtrack which can be shown for topcoder activity - trackStats.showTrack = false - // if track has subtracks with stats - if (trackStats && trackStats.length > 0) { - // iterate over each subtrack stat and determine if we need to show as stat - trackStats.forEach(function(subTrackRank) { - // process subtack stat - UserStatsService.processStatRank(subTrackRank) - // if any of the subtrack has stat to show, enable the showTrack flag for the track - if (subTrackRank.showStats) { - trackStats.showTrack = true - } - }) + vm.statsPromise = ProfileService.getUserStats(vm.userHandle) + .then(function(stats) { + if (stats) { + vm.stats = stats + vm.profile.tracks = vm.profile.tracks || [] + vm.tracks = ProfileService.getTracks(stats) || vm.profile.tracks + if (stats.COPILOT && stats.COPILOT.contests && vm.profile.tracks.indexOf('COPILOT') == -1) { + vm.profile.tracks.push('COPILOT') } - // if any of the track has stat to show, enable the showTCActivity flag to true - if (trackStats.showTrack) { - vm.showTCActivity = true + // flag to indicate if the member has acitivity on topcoder to be shown + // it is set to true, if we get at least one track with showTrack == true + vm.showTCActivity = false + vm.numWins = vm.stats.wins + vm.categories = ProfileService.getRanks(vm.stats) + for(var trackName in vm.categories) { + // trackStats is an array of subtrack rankings along with track stats properties (e.g showTrack) + var trackStats = vm.categories[trackName] + // flag to indicate if the member has activity for this track + // it is set to true, if we get at least one subtrack which can be shown for topcoder activity + trackStats.showTrack = false + // if track has subtracks with stats + if (trackStats && trackStats.length > 0) { + // iterate over each subtrack stat and determine if we need to show as stat + trackStats.forEach(function(subTrackRank) { + // process subtack stat + UserStatsService.processStatRank(subTrackRank) + // if any of the subtrack has stat to show, enable the showTrack flag for the track + if (subTrackRank.showStats) { + trackStats.showTrack = true + } + }) + } + // if any of the track has stat to show, enable the showTCActivity flag to true + if (trackStats.showTrack) { + vm.showTCActivity = true + } } + } else { + vm.stats = false + // vm.profile.tracks = [] + vm.showTCActivity = 0 + vm.numWins = 0 + vm.categories = {} } - } else { - vm.stats = false - // vm.profile.tracks = [] - vm.showTCActivity = 0 - vm.numWins = 0 - vm.categories = {} - } - vm.status.stats = CONSTANTS.STATE_READY - return vm.stats - }).catch(function(err) { - $log.error(err) - vm.status.stats = CONSTANTS.STATE_ERROR - }) - - vm.skillsPromise = ProfileService.getUserSkills(vm.userHandle).then(function(skills) { - vm.skills = skills.skills - vm.status.skills = CONSTANTS.STATE_READY - }).catch(function(err) { - vm.status.skills = CONSTANTS.STATE_ERROR - }) + vm.status.stats = CONSTANTS.STATE_READY + return vm.stats + }) + .catch(function(err) { + logger.error('Could not get user stats', err) + + vm.status.stats = CONSTANTS.STATE_ERROR + }) + + vm.skillsPromise = ProfileService.getUserSkills(vm.userHandle) + .then(function(skills) { + vm.skills = skills.skills + vm.status.skills = CONSTANTS.STATE_READY + }) + .catch(function(err) { + logger.error('Could not get user skills', err) + + vm.status.skills = CONSTANTS.STATE_ERROR + }) function activate() { - $log.debug('Calling ProfileController activate()') + logger.debug('Calling ProfileController activate()') // show edit profile link if user is authenticated and is viewing their own profile vm.showEditProfileLink = TcAuthService.isAuthenticated() && UserService.getUserIdentity().handle.toLowerCase() === vm.userHandle.toLowerCase() vm.isUser = vm.showEditProfileLink diff --git a/app/profile/subtrack/subtrack.controller.js b/app/profile/subtrack/subtrack.controller.js index 62418c5bd..8e4b5b131 100644 --- a/app/profile/subtrack/subtrack.controller.js +++ b/app/profile/subtrack/subtrack.controller.js @@ -6,9 +6,9 @@ import _ from 'lodash' angular.module('tc.profile').controller('ProfileSubtrackController', ProfileSubtrackController) - ProfileSubtrackController.$inject = ['$scope', 'ProfileService', '$q', '$stateParams', 'ChallengeService', 'SRMService', 'CONSTANTS', '$state', '$window', 'ngDialog', 'UserStatsService'] + ProfileSubtrackController.$inject = ['$scope', 'ProfileService', '$q', '$stateParams', 'ChallengeService', 'SRMService', 'CONSTANTS', '$state', '$window', 'ngDialog', 'UserStatsService', 'logger'] - function ProfileSubtrackController($scope, ProfileService, $q, $stateParams, ChallengeService, SRMService, CONSTANTS, $state, $window, ngDialog, UserStatsService) { + function ProfileSubtrackController($scope, ProfileService, $q, $stateParams, ChallengeService, SRMService, CONSTANTS, $state, $window, ngDialog, UserStatsService, logger) { var vm = this vm.ASSET_PREFIX = CONSTANTS.ASSET_PREFIX vm.graphState = { show: 'history' } @@ -195,7 +195,9 @@ import _ from 'lodash' }) vm.status.challenges = CONSTANTS.STATE_READY }) - .catch(function(resp) { + .catch(function(err) { + logger.error('Could not get user SRMs', err) + vm.status.challenges = CONSTANTS.STATE_ERROR }) } else { @@ -208,7 +210,9 @@ import _ from 'lodash' vm.challenges = vm.challenges.concat(data) vm.status.challenges = CONSTANTS.STATE_READY }) - .catch(function(resp) { + .catch(function(err) { + logger.error('Could not get user marathon matches', err) + vm.status.challenges = CONSTANTS.STATE_ERROR }) } @@ -223,7 +227,10 @@ import _ from 'lodash' vm.pageParams.currentCount = vm.challenges.length vm.status.challenges = CONSTANTS.STATE_READY return data - }).catch(function(err) { + }) + .catch(function(err) { + logger.error('Could not get user challenges', err) + vm.status.challenges = CONSTANTS.STATE_ERROR }) } diff --git a/app/services/api.service.js b/app/services/api.service.js index 0cd195e8e..8881f4d4d 100644 --- a/app/services/api.service.js +++ b/app/services/api.service.js @@ -6,9 +6,9 @@ import _ from 'lodash' angular.module('tc.services').factory('ApiService', ApiService) - ApiService.$inject = ['$http', '$log', 'AuthTokenService', 'Restangular', 'CONSTANTS'] + ApiService.$inject = ['$http', 'logger', 'AuthTokenService', 'Restangular', 'CONSTANTS'] - function ApiService($http, $log, AuthTokenService, Restangular, CONSTANTS) { + function ApiService($http, logger, AuthTokenService, Restangular, CONSTANTS) { var service = { requestHandler: requestHandler, restangularV2: _getRestangularV2(), @@ -60,7 +60,7 @@ import _ from 'lodash' case 500: // SERVER ERROR case 503: // HTTP_503_SERVICE_UNAVAILABLE default: - $log.error('Restangular Error Interceptor' + JSON.stringify(response)) + logger.error('Restangular Error Interceptor', response) return true // error not handled } }) @@ -142,7 +142,7 @@ import _ from 'lodash' case 500: // SERVER ERROR case 503: // HTTP_503_SERVICE_UNAVAILABLE default: - $log.error('Restangular Error Interceptor ', response) + logger.error('Restangular Error Interceptor ', response) return true // error not handled } }) diff --git a/app/services/authtoken.service.js b/app/services/authtoken.service.js index c087e3832..8b016e4b3 100644 --- a/app/services/authtoken.service.js +++ b/app/services/authtoken.service.js @@ -5,9 +5,9 @@ import angular from 'angular' angular.module('tc.services').factory('AuthTokenService', AuthTokenService) - AuthTokenService.$inject = ['CONSTANTS', '$cookies', '$location', 'store', '$http', '$log', 'jwtHelper', '$q'] + AuthTokenService.$inject = ['CONSTANTS', '$cookies', '$location', 'store', '$http', 'logger', 'jwtHelper', '$q'] - function AuthTokenService(CONSTANTS, $cookies, $location, store, $http, $log, jwtHelper, $q) { + function AuthTokenService(CONSTANTS, $cookies, $location, store, $http, logger, jwtHelper, $q) { var v2TokenKey = 'tcjwt' var v2TCSSOTokenKey = 'tcsso' var v3TokenKey = 'appiriojwt' @@ -66,12 +66,17 @@ import angular from 'angular' 'Authorization': 'Bearer ' + token }, data: {} - }).then(function(res) { + }) + .then(function(res) { var appiriojwt = res.data.result.content.token + setV3Token(appiriojwt) + return appiriojwt - }).catch(function(resp) { - $log.error(resp) + }) + .catch(function(err) { + logger.error('Could not refresh v3 token', err) + removeTokens() }) } @@ -98,8 +103,10 @@ import angular from 'angular' resolve(appiriojwt) }, function(err) { - $log.error(err) + logger.error('Could not exchange token', err) + removeTokens() + reject(err) } ) @@ -119,10 +126,10 @@ import angular from 'angular' } return $http(req).then( function(resp) { - $log.debug(resp) + logger.debug(resp) }, function(err) { - $log.error(err) + logger.error('Could not get token from Auth0 code', err) } ) } diff --git a/app/services/challenge.service.js b/app/services/challenge.service.js index b10086a62..c71b4978e 100644 --- a/app/services/challenge.service.js +++ b/app/services/challenge.service.js @@ -7,9 +7,9 @@ import moment from 'moment' angular.module('tc.services').factory('ChallengeService', ChallengeService) - ChallengeService.$inject = ['CONSTANTS', 'ApiService', '$q', '$log'] + ChallengeService.$inject = ['CONSTANTS', 'ApiService', '$q', 'logger'] - function ChallengeService(CONSTANTS, ApiService, $q, $log) { + function ChallengeService(CONSTANTS, ApiService, $q, logger) { var api = ApiService.restangularV3 var apiV2 = ApiService.restangularV2 var service = { @@ -46,7 +46,7 @@ import moment from 'moment' return _.find(phases, function(p) { return p.phaseType.toUpperCase() === phaseType}) }, function(err) { - $log.error(err) + logger.error('Could not get challenge phases', err) } ) } diff --git a/app/services/externalAccounts.service.js b/app/services/externalAccounts.service.js index 415a2d1a2..9df83d0c5 100644 --- a/app/services/externalAccounts.service.js +++ b/app/services/externalAccounts.service.js @@ -6,11 +6,10 @@ import _ from 'lodash' angular.module('tc.services').factory('ExternalAccountService', ExternalAccountService) - ExternalAccountService.$inject = ['$q', '$log', 'CONSTANTS', 'auth', 'ApiService', 'UserService', 'Helpers'] + ExternalAccountService.$inject = ['$q', 'logger', 'CONSTANTS', 'auth', 'ApiService', 'UserService', 'Helpers'] - function ExternalAccountService($q, $log, CONSTANTS, auth, ApiService, UserService, Helpers) { + function ExternalAccountService($q, logger, CONSTANTS, auth, ApiService, UserService, Helpers) { var auth0 = auth - $log = $log.getInstance('ExternalAccountService') var memberApi = ApiService.getApiServiceProvider('MEMBER') var userApi = ApiService.getApiServiceProvider('USER') @@ -56,16 +55,17 @@ import _ from 'lodash' return $q(function($resolve, $reject) { UserService.removeSocialProfile(user.userId, account) .then(function(resp) { - $log.debug('Succesfully unlinked account: ' + JSON.stringify(resp)) + logger.debug('Succesfully unlinked account: ' + JSON.stringify(resp)) $resolve({ status: 'SUCCESS' }) }) - .catch(function(resp) { - $log.error('Error unlinking account: ' + resp.data.result.content) + .catch(function(err) { + logger.error('Error unlinking account', err) + var status = 'FATAL_ERROR' - var msg = resp.data.result.content - if (resp.status === 404) { + var msg = err.data.result.content + if (err.status === 404) { status = 'SOCIAL_PROFILE_NOT_EXIST' } $reject({ @@ -99,7 +99,7 @@ import _ from 'lodash' _cards.push({provider: provider, data: {handle: link.name, status: 'PENDING'}}) } }) - $log.debug('Processed Accounts Cards: ' + JSON.stringify(_cards)) + logger.debug('Processed Accounts Cards: ' + JSON.stringify(_cards)) return _cards } @@ -110,14 +110,17 @@ import _ from 'lodash' if (includePending) _promises.push(getLinkedAccounts(userId)) - $q.all(_promises).then(function(data) { + $q.all(_promises) + .then(function(data) { var links = includePending ? data[1]: [] var _cards = _convertAccountsIntoCards(links, data[0].plain(), includePending) // TODO add weblinks resolve(_cards) - }).catch(function(resp) { - $log.error(resp) - reject(resp) + }) + .catch(function(err) { + logger.error('Could not get all external links accounts', err) + + reject(err) }) }) } @@ -135,7 +138,7 @@ import _ from 'lodash' state: callbackUrl }, function(profile, idToken, accessToken, state, refreshToken) { - $log.debug('onSocialLoginSuccess') + logger.debug('onSocialLoginSuccess') var socialData = Helpers.getSocialUserData(profile, accessToken) var user = UserService.getUserIdentity() var postData = { @@ -152,10 +155,10 @@ import _ from 'lodash' if (socialData.accessTokenSecret) { postData.context.accessTokenSecret = socialData.accessTokenSecret } - $log.debug('link API postdata: ' + JSON.stringify(postData)) + logger.debug('link API postdata: ' + JSON.stringify(postData)) userApi.one('users', user.userId).customPOST(postData, 'profiles', {}, {}) .then(function(resp) { - $log.debug('Succesfully linked account: ' + JSON.stringify(resp)) + logger.debug('Succesfully linked account: ' + JSON.stringify(resp)) // construct 'card' object and resolve it var _data = { status: 'SUCCESS', @@ -167,25 +170,29 @@ import _ from 'lodash' _data.linkedAccount.data.status = 'PENDING' resolve(_data) }) - .catch(function(resp) { + .catch(function(err) { + logger.error('Error linking account', err) + var errorStatus = 'FATAL_ERROR' - $log.error('Error linking account: ' + resp.data.result.content) - if (resp.data.result && resp.data.result.status === 400) { + + if (err.data.result && err.data.result.status === 400) { errorStatus = 'SOCIAL_PROFILE_ALREADY_EXISTS' } reject({ status: errorStatus, - msg: resp.data.result.content + msg: err.data.result.content }) }) }, - function(error) { - $log.warn('onSocialLoginFailure ' + JSON.stringify(error)) - reject(error) + function(err) { + logger.error('Error signing in - onSocialLoginFailure', err) + + reject(err) } ) } else { - $log.error('Unsupported social login backend: ' + provider) + logger.error('Unsupported social login backend', provider) + $q.reject({ status: 'failed', 'error': 'Unsupported social login backend \'' + provider + '\'' diff --git a/app/services/externalLinks.service.js b/app/services/externalLinks.service.js index 4191ca9ce..5d2b67d0f 100644 --- a/app/services/externalLinks.service.js +++ b/app/services/externalLinks.service.js @@ -6,11 +6,9 @@ import _ from 'lodash' angular.module('tc.services').factory('ExternalWebLinksService', ExternalWebLinksService) - ExternalWebLinksService.$inject = ['$log', 'CONSTANTS', 'ApiService', '$q'] - - function ExternalWebLinksService($log, CONSTANTS, ApiService, $q) { - $log = $log.getInstance('ExternalWebLinksService') + ExternalWebLinksService.$inject = ['logger', 'CONSTANTS', 'ApiService', '$q'] + function ExternalWebLinksService(logger, CONSTANTS, ApiService, $q) { var memberApi = ApiService.getApiServiceProvider('MEMBER') var service = { @@ -55,15 +53,17 @@ import _ from 'lodash' _newLink.data.status = 'PENDING' resolve(_newLink) }) - .catch(function(resp) { + .catch(function(err) { + logger.error('Error adding weblink', err) + var errorStatus = 'FATAL_ERROR' - $log.error('Error adding weblink: ' + resp.data.result.content) - if (resp.data.result && resp.data.result.status === 400) { + + if (err.data.result && err.data.result.status === 400) { errorStatus = 'WEBLINK_ALREADY_EXISTS' } reject({ status: errorStatus, - msg: resp.data.result.content + msg: err.data.result.content }) }) }) @@ -75,15 +75,17 @@ import _ from 'lodash' .then(function(resp) { $resolve(resp) }) - .catch(function(resp) { + .catch(function(err) { + logger.error('Error removing weblink', err) + var errorStatus = 'FATAL_ERROR' - $log.error('Error removing weblink: ' + resp.data.result.content) - if (resp.data.result && resp.data.result.status === 400) { + + if (err.data.result && err.data.result.status === 400) { errorStatus = 'WEBLINK_NOT_EXIST' } $reject({ status: errorStatus, - msg: resp.data.result.content + msg: err.data.result.content }) }) }) diff --git a/app/services/image.service.js b/app/services/image.service.js index 6f84b2de0..299aca96f 100644 --- a/app/services/image.service.js +++ b/app/services/image.service.js @@ -5,9 +5,9 @@ import angular from 'angular' angular.module('tc.services').factory('ImageService', ImageService) - ImageService.$inject = ['CONSTANTS', 'ApiService', '$q', '$log', '$rootScope', 'toaster'] + ImageService.$inject = ['CONSTANTS', 'ApiService', '$q', 'logger', '$rootScope', 'toaster'] - function ImageService(CONSTANTS, ApiService, $q, $log, $rootScope, toaster) { + function ImageService(CONSTANTS, ApiService, $q, logger, $rootScope, toaster) { var api = ApiService.restangularV3 var service = { @@ -21,13 +21,13 @@ import angular from 'angular' return api.one('members', S3Response.userHandle).customPUT(S3Response.body, 'photo') .then(function(newPhotoURL) { $rootScope.$broadcast(CONSTANTS.EVENT_PROFILE_UPDATED) - $log.info('Successfully made file record') + logger.info('Successfully made file record') toaster.pop('success', 'Success!', 'Your profile image has been updated.') return newPhotoURL }) .catch(function(err) { - $log.info('Error in creating file record') - $log.error(err) + logger.error('Error in creating file record for image', err) + toaster.pop('error', 'Whoops!', 'There was an error uploading your profile image. Please try again later.') }) } @@ -45,8 +45,10 @@ import angular from 'angular' }) }) .catch(function(err) { - $log.info('Error getting presigned url') + logger.error('Error getting presigned url for image', err) + toaster.pop('error', 'Whoops!', 'There was an error uploading your profile image. Please try again later.') + deferred.reject(err) }) @@ -60,11 +62,11 @@ import angular from 'angular' xhr.open('PUT', response.preSignedURL, true) xhr.setRequestHeader('Content-Type', response.file.type) - // xhr version of the success callback xhr.onreadystatechange = function() { var status = xhr.status if (((status >= 200 && status < 300) || status === 304) && xhr.readyState === 4) { - $log.info('Successfully uploaded file') + logger.info('Successfully uploaded file') + deferred.resolve({ userHandle: response.userHandle, body: { @@ -73,15 +75,19 @@ import angular from 'angular' } }) } else if (status >= 400) { - $log.error('Error uploading to S3 with status: ' + status) + logger.error('Could not upload image to S3', status) + toaster.pop('error', 'Whoops!', 'There was an error uploading your profile image. Please try again later.') + deferred.reject({}) } } xhr.onerror = function(err) { - $log.info('Error uploading to s3') + logger.error('Could not upload image to S3', err) + toaster.pop('error', 'Whoops!', 'There was an error uploading your profile image. Please try again later.') + deferred.reject(err) } diff --git a/app/services/jwtInterceptor.service.js b/app/services/jwtInterceptor.service.js index 9b999a73f..5c5667911 100644 --- a/app/services/jwtInterceptor.service.js +++ b/app/services/jwtInterceptor.service.js @@ -5,10 +5,9 @@ import angular from 'angular' angular.module('tc.services').factory('JwtInterceptorService', JwtInterceptorService) - JwtInterceptorService.$inject = ['$log', 'jwtHelper', 'AuthTokenService', 'TcAuthService', '$state'] + JwtInterceptorService.$inject = ['logger', 'jwtHelper', 'AuthTokenService', 'TcAuthService', '$state'] - function JwtInterceptorService($log, jwtHelper, AuthTokenService, TcAuthService, $state) { - $log = $log.getInstance('JwtInterceptorService') + function JwtInterceptorService(logger, jwtHelper, AuthTokenService, TcAuthService, $state) { var service = { getToken: getToken } @@ -43,18 +42,22 @@ import angular from 'angular' } // var token = config.url.indexOf('v2/') > -1 ? AuthTokenService.getV2Token() : AuthTokenService.getV3Token() if (jwtHelper.isTokenExpired(token)) { - $log.debug(String.supplant('Token has expired, attempting to refreshToken() for "{url}"', config)) - return AuthTokenService.refreshV3Token(token).then(function(idToken) { - $log.debug('Successfully refreshed V3 token.') + logger.debug(String.supplant('Token has expired, attempting to refreshToken() for "{url}"', config)) + + return AuthTokenService.refreshV3Token(token) + .then(function(idToken) { + logger.debug('Successfully refreshed V3 token.') // v2 token doesn't expire AuthTokenService.setV3Token(idToken) return idToken }) - .catch(function(resp) { + .catch(function(err) { // Server will not or cannot refresh token - $log.debug('Unable to refresh V3 token, redirecting to login') - $log.debug(resp) + logger.debug('Unable to refresh V3 token, redirecting to login') + logger.debug(err) + $state.go('login') + return null }) } else { @@ -62,7 +65,7 @@ import angular from 'angular' } } // else - $log.debug(String.supplant('Skipping authToken for "{url}, UnAuthenticated user"', config)) + logger.debug(String.supplant('Skipping authToken for "{url}, UnAuthenticated user"', config)) return null } } @@ -76,18 +79,21 @@ import angular from 'angular' } // Note only v3tokens expire if (jwtHelper.isTokenExpired(idToken)) { - $log.debug(String.supplant('Token has expired, attempting to refreshToken() for "{url}"', config)) - return AuthTokenService.refreshV3Token(idToken).then(function(idToken) { + logger.debug(String.supplant('Token has expired, attempting to refreshToken() for "{url}"', config)) + return AuthTokenService.refreshV3Token(idToken) + .then(function(idToken) { // v2 token doesn't expire - $log.debug('Successfully refreshed V3 token.') + logger.debug('Successfully refreshed V3 token.') AuthTokenService.setV3Token(idToken) return idToken }) - .catch(function(resp) { + .catch(function(err) { // Server will not or cannot refresh token - $log.debug('Unable to refresh V3 token, redirecting to login') - $log.debug(resp) + logger.debug('Unable to refresh V3 token, redirecting to login') + logger.debug(err) + $state.go('login') + return null }) } else { diff --git a/app/services/services.module.js b/app/services/services.module.js index 4e3fd7710..59c51dc2a 100644 --- a/app/services/services.module.js +++ b/app/services/services.module.js @@ -16,12 +16,7 @@ import Auth0 from 'auth0-js' ] angular.module('tc.services', dependencies) - .config(['$provide', 'authProvider', 'CONSTANTS', function($provide, authProvider, CONSTANTS) { - $provide.decorator('$log', ['$delegate', 'LogEnhancer', function($delegate, LogEnhancer) { - LogEnhancer.enhanceLogger($delegate) - return $delegate - }]) - + .config(['authProvider', 'CONSTANTS', function(authProvider, CONSTANTS) { authProvider.init({ domain: CONSTANTS.auth0Domain, clientID: CONSTANTS.clientId, @@ -32,5 +27,4 @@ import Auth0 from 'auth0-js' .factory('UserPrefStore', ['store', function(store) { return store.getNamespacedStore('userSettings') }]) - })() diff --git a/app/services/submissions.service.js b/app/services/submissions.service.js index 776e29ea3..d30c4256e 100644 --- a/app/services/submissions.service.js +++ b/app/services/submissions.service.js @@ -5,9 +5,9 @@ import angular from 'angular' angular.module('tc.services').factory('SubmissionsService', SubmissionsService) - SubmissionsService.$inject = ['CONSTANTS', 'ApiService', '$q', '$log', 'toaster'] + SubmissionsService.$inject = ['CONSTANTS', 'ApiService', '$q', 'logger', 'toaster'] - function SubmissionsService(CONSTANTS, ApiService, $q, $log, toaster) { + function SubmissionsService(CONSTANTS, ApiService, $q, logger, toaster) { var api = ApiService.getApiServiceProvider('SUBMISSIONS') var service = { @@ -20,20 +20,17 @@ import angular from 'angular' return service function getPresignedURL(body, files, progressCallback) { - $log.info('Body of request for presigned url: ') - $log.info(body) - return api.all('submissions').customPOST(body) .then(function(response) { - $log.info('POST/Presigned URL Response: ') - $log.info(response.plain()) progressCallback.call(progressCallback, 'PREPARE', 100) + uploadSubmissionFileToS3(response, response.data.files, files, progressCallback) }) .catch(function(err) { - $log.info(err) - $log.info('Error getting presigned url') + logger.error('Could not get presigned url', err) + progressCallback.call(progressCallback, 'ERROR', err) + toaster.pop('error', 'Whoops!', 'There was an error uploading your submissions. Please try again later.') }) } @@ -48,41 +45,40 @@ import angular from 'angular' xhr.setRequestHeader('Content-Type', fileWithPresignedURL.mediaType) xhr.upload.addEventListener('progress', function(oEvent) { + // Compute progress information only if the total size is known if (oEvent.lengthComputable) { var percentComplete = oEvent.loaded / oEvent.total - // console.log("Completed " + percentComplete) + if (progressCallback && typeof progressCallback === 'function') { progressCallback.call(progressCallback, 'UPLOAD', { file: fileWithPresignedURL.preSignedUploadUrl, progress: percentComplete*100 }) } - // ... - } else { - // Unable to compute progress information since the total size is unknown } }) - // xhr version of the success callback xhr.onreadystatechange = function() { var status = xhr.status if (((status >= 200 && status < 300) || status === 304) && xhr.readyState === 4) { - $log.info('Successfully uploaded file') - $log.info('xhr response: ', xhr.responseText) + logger.info('Successfully uploaded file') - // updateSubmissionStatus and then resolve? deferred.resolve() } else if (status >= 400) { - $log.error('Error uploading to S3 with status: ' + status) + logger.error('Error uploading to S3 with status', status) + toaster.pop('error', 'Whoops!', 'There was an error uploading your files. Please try again later.') + deferred.reject({}) } } xhr.onerror = function(err) { - $log.info('Error uploading to s3') + logger.error('Error uploading to s3', err) + toaster.pop('error', 'Whoops!', 'There was an error uploading your files. Please try again later.') + deferred.reject(err) } @@ -93,19 +89,16 @@ import angular from 'angular' return $q.all(promises) .then(function(response) { - $log.info('response from S3: ') - $log.info(response) - $log.info('response to use .save restnagular with: ') - $log.info(presignedURLResponse) progressCallback.call(progressCallback, 'UPLOAD', 100) + // Update and start processing updateSubmissionStatus(presignedURLResponse.plain(), progressCallback) }) .catch(function(err) { progressCallback.call(progressCallback, 'ERROR', err) - $log.info('error uploading to S3: ') - $log.info(err) + + logger.error('Could not upload to S3', err) }) } @@ -117,12 +110,13 @@ import angular from 'angular' return api.one('submissions', body.id).customPUT(body) .then(function(response) { - $log.info('Successfully updated file statuses') + logger.info('Successfully updated file statuses') + recordCompletedSubmission(response.plain(), progressCallback) }) .catch(function(err) { - $log.info('Error updating file statuses') - $log.error(err) + logger.error('Could not update file statuses', err) + progressCallback.call(progressCallback, 'ERROR', err) }) } @@ -131,14 +125,13 @@ import angular from 'angular' // Once all uploaded, make record and begin processing return api.one('submissions', body.id).customPOST(body, 'process') .then(function(response) { - $log.info('Successfully made file record. Beginning processing') - $log.info('response from process call: ') - $log.info(response) + logger.info('Successfully made file record. Beginning processing') + progressCallback.call(progressCallback, 'FINISH', 100) }) .catch(function(err) { - $log.info('Error in starting processing') - $log.error(err) + logger.error('Could not start processing', err) + progressCallback.call(progressCallback, 'ERROR', err) }) } diff --git a/app/services/tcAuth.service.js b/app/services/tcAuth.service.js index b7edff902..646cba015 100644 --- a/app/services/tcAuth.service.js +++ b/app/services/tcAuth.service.js @@ -5,10 +5,9 @@ import angular from 'angular' angular.module('tc.services').factory('TcAuthService', TcAuthService) - TcAuthService.$inject = ['CONSTANTS', 'auth', 'AuthTokenService', '$rootScope', '$q', '$log', '$timeout', 'UserService', 'Helpers', 'ApiService', 'store', '$http'] + TcAuthService.$inject = ['CONSTANTS', 'auth', 'AuthTokenService', '$rootScope', '$q', 'logger', '$timeout', 'UserService', 'Helpers', 'ApiService', 'store', '$http'] - function TcAuthService(CONSTANTS, auth, AuthTokenService, $rootScope, $q, $log, $timeout, UserService, Helpers, ApiService, store, $http) { - $log = $log.getInstance('TcAuthServicetcAuth') + function TcAuthService(CONSTANTS, auth, AuthTokenService, $rootScope, $q, logger, $timeout, UserService, Helpers, ApiService, store, $http) { var auth0 = auth var service = { login: login, @@ -74,7 +73,7 @@ import angular from 'angular' }, 200) }, function(resp) { - $log.debug(JSON.stringify(resp)) + logger.debug(JSON.stringify(resp)) // 401 status here implies user is not registered if (resp.status === 401) { reject({ @@ -94,7 +93,7 @@ import angular from 'angular' ) }, function(error) { - $log.warn(JSON.stringify(error)) + logger.warning(JSON.stringify(error)) reject(error) } ) @@ -117,18 +116,18 @@ import angular from 'angular' UserService.validateSocialProfile(socialData.socialUserId, socialData.socialProvider) .then(function(resp) { - $log.debug(JSON.stringify(resp)) + logger.debug(JSON.stringify(resp)) if (resp.valid) { // success var result = { status: 'SUCCESS', data: socialData } - $log.debug('socialRegister Result: ' + JSON.stringify(result)) + logger.debug('socialRegister Result: ' + JSON.stringify(result)) resolve(result) } else { if (resp.reasonCode === 'ALREADY_IN_USE') { - $log.error('Social handle exist') + logger.error('Social handle exist') reject({ status: 'SOCIAL_PROFILE_ALREADY_EXISTS' }) @@ -136,17 +135,18 @@ import angular from 'angular' } }) - .catch(function(resp) { - $log.debug(JSON.stringify(resp)) + .catch(function(err) { + logger.debug(JSON.stringify(err)) }) }, function(error) { - $log.warn('onSocialLoginFailure ' + JSON.stringify(error)) + logger.warning('onSocialLoginFailure ' + JSON.stringify(error)) reject(error) } ) } else { - $log.error('Unsupported social login provider: ' + provider) + logger.error('Unsupported social login provider', provider) + reject({ status: 'FAILED', 'error': 'Unsupported social login provider \'' + provider + '\'' diff --git a/app/settings/account-info/account-info.controller.js b/app/settings/account-info/account-info.controller.js index f0133d4db..b1eddb707 100644 --- a/app/settings/account-info/account-info.controller.js +++ b/app/settings/account-info/account-info.controller.js @@ -6,9 +6,9 @@ import _ from 'lodash' angular.module('tc.settings').controller('AccountInfoController', AccountInfoController) - AccountInfoController.$inject = ['userData', 'UserService', 'ProfileService', '$log', 'ISO3166', 'toaster', '$scope', '$timeout', '$state'] + AccountInfoController.$inject = ['userData', 'UserService', 'ProfileService', 'logger', 'ISO3166', 'toaster', '$scope', '$timeout', '$state'] - function AccountInfoController(userData, UserService, ProfileService, $log, ISO3166, toaster, $scope, $timeout, $state) { + function AccountInfoController(userData, UserService, ProfileService, logger, ISO3166, toaster, $scope, $timeout, $state) { var vm = this vm.saveAccountInfo = saveAccountInfo vm.updateCountry = updateCountry @@ -35,8 +35,11 @@ import _ from 'lodash' vm.loading = false }) .catch(function(err) { - $log.error('Error fetching user profile. Redirecting to edit profile.') + logger.info('Error fetching user profile. Redirecting to edit profile.') + logger.error('Could not fetch user profile data', err) + $state.go('settings.profile') + vm.loading = false }) @@ -88,8 +91,11 @@ import _ from 'lodash' for (var k in vm.userData) userData[k] = vm.userData[k] vm.accountInfoForm.$setPristine() }) - .catch(function() { + .catch(function(err) { + logger.error('Could not update user profile', err) + vm.formProcessing.accountInfoForm = false + toaster.pop('error', 'Whoops!', 'Something went wrong. Please try again later.') }) } @@ -100,6 +106,7 @@ import _ from 'lodash' function submitNewPassword() { vm.formProcessing.newPasswordForm = true + UserService.updatePassword(vm.password, vm.currentPassword) .then(function(res) { vm.formProcessing.newPasswordForm = false @@ -109,12 +116,13 @@ import _ from 'lodash' vm.newPasswordForm.$setPristine() vm.currentPasswordFocus = false - $log.info('Your password has been updated.') + logger.info('Your password has been updated.') }) .catch(function(err) { + logger.error('Could not update password', err) + vm.formProcessing.newPasswordForm = false vm.newPasswordForm.currentPassword.$setValidity('incorrect', false) - $log.error(err) }) } } diff --git a/app/settings/edit-profile/edit-profile.controller.js b/app/settings/edit-profile/edit-profile.controller.js index 50498c657..5465b48a8 100644 --- a/app/settings/edit-profile/edit-profile.controller.js +++ b/app/settings/edit-profile/edit-profile.controller.js @@ -6,10 +6,9 @@ import _ from 'lodash' angular.module('tc.settings').controller('EditProfileController', EditProfileController) - EditProfileController.$inject = ['$rootScope', 'userData', 'userHandle', 'ProfileService', 'ExternalAccountService', 'ExternalWebLinksService', '$log', 'ISO3166', 'ImageService', 'CONSTANTS', 'TagsService', 'toaster', '$q', '$scope'] + EditProfileController.$inject = ['$rootScope', 'userData', 'userHandle', 'ProfileService', 'ExternalAccountService', 'ExternalWebLinksService', 'logger', 'ISO3166', 'ImageService', 'CONSTANTS', 'TagsService', 'toaster', '$q', '$scope'] - function EditProfileController($rootScope, userData, userHandle, ProfileService, ExternalAccountService, ExternalWebLinksService, $log, ISO3166, ImageService, CONSTANTS, TagsService, toaster, $q, $scope) { - $log = $log.getInstance('EditProfileCtrl') + function EditProfileController($rootScope, userData, userHandle, ProfileService, ExternalAccountService, ExternalWebLinksService, logger, ISO3166, ImageService, CONSTANTS, TagsService, toaster, $q, $scope) { var vm = this vm.toggleTrack = toggleTrack vm.updateCountry = updateCountry @@ -27,7 +26,7 @@ import _ from 'lodash' vm.originalUserData = userData vm.linkedExternalAccounts = [] vm.linkedExternalAccountsData = {} - vm.skills = false + vm.skills = [] vm.tags = [] vm.profileFormProcessing = false vm.tracks = {} @@ -57,7 +56,7 @@ import _ from 'lodash' vm.tags = tags }) .catch(function(err) { - $log.error(JSON.stringify(err)) + logger.error('Could not get approved skill tags', err) }) ProfileService.getUserSkills(vm.userData.handle) @@ -67,7 +66,7 @@ import _ from 'lodash' }) }) .catch(function(err) { - $log.error(JSON.stringify(err)) + logger.error('Could not get user skills', err) }) } @@ -102,7 +101,7 @@ import _ from 'lodash' vm.countryObj = null return } - + vm.editProfile.$setDirty() var countryCode = _.get(countryObj, 'alpha3', undefined) vm.userData.competitionCountryCode = countryCode @@ -138,13 +137,15 @@ import _ from 'lodash' .then(function() { vm.profileFormProcessing = false vm.editProfile.$setPristine() - $log.info('Saved successfully') + logger.info('Saved successfully') toaster.pop('success', 'Success!', 'Your account information was updated.') for (var k in vm.userData) userData[k] = vm.userData[k] }) .catch(function(err) { + logger.error('Could not update user profile', err) + vm.profileFormProcessing = false - $log.error(err) + toaster.pop('error', 'Whoops!', 'Something went wrong. Please try again later.') }) } @@ -169,12 +170,16 @@ import _ from 'lodash' ProfileService.updateUserProfile(userData) .then(function() { vm.userData.photoURL = '' - $log.info('Saved successfully') + + logger.info('Saved successfully') + toaster.pop('success', 'Success!', 'Your account information was updated.') }) .catch(function(err) { + logger.error('Could not update user profile and delete image', err) + vm.profileFormProcessing = false - $log.error(err) + vm.userData.photoURL = oldPhotoURL vm.originalUserData.photoURL = oldPhotoURL toaster.pop('error', 'Whoops!', 'Something went wrong. Please try again later.') diff --git a/app/skill-picker/skill-picker.controller.js b/app/skill-picker/skill-picker.controller.js index 2065c1cd0..75b0668d0 100644 --- a/app/skill-picker/skill-picker.controller.js +++ b/app/skill-picker/skill-picker.controller.js @@ -6,11 +6,10 @@ import _ from 'lodash' angular.module('tc.skill-picker').controller('SkillPickerController', SkillPickerController) - SkillPickerController.$inject = ['$scope', 'CONSTANTS', 'ProfileService', '$state', 'userProfile', 'featuredSkills', '$log', 'toaster', 'MemberCertService', '$q'] + SkillPickerController.$inject = ['$scope', 'CONSTANTS', 'ProfileService', '$state', 'userProfile', 'featuredSkills', 'logger', 'toaster', 'MemberCertService', '$q'] - function SkillPickerController($scope, CONSTANTS, ProfileService, $state, userProfile, featuredSkills, $log, toaster, MemberCertService, $q) { + function SkillPickerController($scope, CONSTANTS, ProfileService, $state, userProfile, featuredSkills, logger, toaster, MemberCertService, $q) { var vm = this - $log = $log.getInstance('SkillPickerController') vm.ASSET_PREFIX = CONSTANTS.ASSET_PREFIX vm.IOS_PROGRAM_ID = CONSTANTS.SWIFT_PROGRAM_ID vm.submitSkills = submitSkills @@ -33,7 +32,6 @@ import _ from 'lodash' * Activates the controller. */ function activate() { - $log.debug('init') initCommunities() checkCommunityStatus() } @@ -93,7 +91,9 @@ import _ from 'lodash' promises.push(MemberCertService.getMemberRegistration(vm.userId, community.programId)) } vm.loadingCommunities = true - $q.all(promises).then(function(responses) { + + $q.all(promises) + .then(function(responses) { vm.loadingCommunities = false responses.forEach(function(program) { if (program) { @@ -116,7 +116,9 @@ import _ from 'lodash' vm.showCommunity = true } }) - .catch(function(error) { + .catch(function(err) { + logger.error('Could not load communities with member cert registration data', err) + vm.loadingCommunities = false }) } @@ -163,7 +165,7 @@ import _ from 'lodash' } promises.push(ProfileService.updateUserSkills(vm.username, data)) } - $log.debug('isCommunitiesDirty: ' + isCommunitiesDirty()) + logger.debug('isCommunitiesDirty: ' + isCommunitiesDirty()) if (isCommunitiesDirty()) { for(var communityName in vm.communities) { var community = vm.communities[communityName] @@ -175,14 +177,18 @@ import _ from 'lodash' } } - $q.all(promises).then(function(responses) { + $q.all(promises) + .then(function(responses) { vm.saving = false toaster.pop('success', 'Success!', 'Your skills have been updated.') vm.disableDoneButton = true $state.go('dashboard') }) - .catch(function(resp) { + .catch(function(err) { + logger.error('Could not update update user skills or register members for community', err) + vm.saving = false + toaster.pop('error', 'Whoops!', 'Something went wrong. Please try again later.') }) } diff --git a/app/submissions/submissions.routes.js b/app/submissions/submissions.routes.js index e9a35c5a4..a5bfe1514 100644 --- a/app/submissions/submissions.routes.js +++ b/app/submissions/submissions.routes.js @@ -23,7 +23,7 @@ import _ from 'lodash' title: 'Challenge Submission' }, resolve: { - challengeToSubmitTo: ['ChallengeService', '$stateParams', 'UserService', ChallengeToSubmitTo] + challengeToSubmitTo: ['ChallengeService', '$stateParams', 'UserService', 'logger', ChallengeToSubmitTo] } }, 'submissions.file-design': { @@ -40,7 +40,7 @@ import _ from 'lodash' } } - function ChallengeToSubmitTo(ChallengeService, $stateParams, UserService) { + function ChallengeToSubmitTo(ChallengeService, $stateParams, UserService, logger) { // This page is only available to users that are registered to the challenge (submitter role) and the challenge is in the Checkpoint Submission or Submission phase. var params = { filter: 'id=' + $stateParams.challengeId @@ -102,6 +102,8 @@ import _ from 'lodash' } }) .catch(function(err) { + logger.error('Could not get user challenges', err) + setErrorMessage('challenge', 'There was an error getting information for this challenge.') return { diff --git a/app/submissions/submit-design-files/submit-design-files.controller.js b/app/submissions/submit-design-files/submit-design-files.controller.js index 12160b7fc..9825f3250 100644 --- a/app/submissions/submit-design-files/submit-design-files.controller.js +++ b/app/submissions/submit-design-files/submit-design-files.controller.js @@ -6,13 +6,12 @@ import _ from 'lodash' angular.module('tc.submissions').controller('SubmitDesignFilesController', SubmitDesignFilesController) - SubmitDesignFilesController.$inject = ['$scope','$window', '$stateParams', '$log', 'UserService', 'SubmissionsService', 'challengeToSubmitTo'] + SubmitDesignFilesController.$inject = ['$scope','$window', '$stateParams', 'logger', 'UserService', 'SubmissionsService', 'challengeToSubmitTo'] - function SubmitDesignFilesController($scope, $window, $stateParams, $log, UserService, SubmissionsService, challengeToSubmitTo) { + function SubmitDesignFilesController($scope, $window, $stateParams, logger, UserService, SubmissionsService, challengeToSubmitTo) { if (!challengeToSubmitTo.challenge) { return } var vm = this - $log = $log.getInstance('SubmitDesignFilesController') var files = {} var fileUploadProgress = {} vm.urlRegEx = new RegExp(/^(http(s?):\/\/)?(www\.)?[a-zA-Z0-9\.\-\_]+(\.[a-zA-Z]{2,3})+(\/[a-zA-Z0-9\_\-\s\.\/\?\%\#\&\=]*)?$/) @@ -176,7 +175,7 @@ import _ from 'lodash' if (args === 100) { vm.preparing = false vm.uploading = true - $log.debug('Prepared for upload.') + logger.debug('Prepared for upload.') } } else if (phase === 'UPLOAD') { // if args is object, this update is about XHRRequest's upload progress @@ -202,18 +201,18 @@ import _ from 'lodash' // start next phase when UPLOAD is done if (vm.uploadProgress == 100) { - $log.debug('Uploaded files.') + logger.debug('Uploaded files.') vm.uploading = false vm.finishing = true } } else if (phase === 'FINISH') { // we are concerned only for completion of the phase if (args === 100) { - $log.debug('Finished upload.') + logger.debug('Finished upload.') } } else { // assume it to be error condition - $log.debug('Error Condition: ' + phase) + logger.debug('Error Condition: ' + phase) vm.errorInUpload = true } } diff --git a/app/submissions/submit-develop-files/submit-develop-files.controller.js b/app/submissions/submit-develop-files/submit-develop-files.controller.js index 6889ca397..c8a22f4e3 100644 --- a/app/submissions/submit-develop-files/submit-develop-files.controller.js +++ b/app/submissions/submit-develop-files/submit-develop-files.controller.js @@ -5,13 +5,12 @@ import angular from 'angular' angular.module('tc.submissions').controller('SubmitDevelopFilesController', SubmitDevelopFilesController) - SubmitDevelopFilesController.$inject = ['$scope','$window', '$stateParams', '$log', 'UserService', 'SubmissionsService', 'challengeToSubmitTo'] + SubmitDevelopFilesController.$inject = ['$scope','$window', '$stateParams', 'logger', 'UserService', 'SubmissionsService', 'challengeToSubmitTo'] - function SubmitDevelopFilesController($scope, $window, $stateParams, $log, UserService, SubmissionsService, challengeToSubmitTo) { + function SubmitDevelopFilesController($scope, $window, $stateParams, logger, UserService, SubmissionsService, challengeToSubmitTo) { if (!challengeToSubmitTo.challenge) { return } var vm = this - $log = $log.getInstance('SubmitDevelopFilesController') var files = {} var fileUploadProgress = {} vm.comments = '' @@ -109,7 +108,7 @@ import angular from 'angular' vm.finishing = false vm.submissionsBody.data.submitterComments = vm.comments - $log.debug('Body for request: ', vm.submissionsBody) + logger.debug('Body for request: ', vm.submissionsBody) SubmissionsService.getPresignedURL(vm.submissionsBody, files, updateProgress) } @@ -122,7 +121,7 @@ import angular from 'angular' if (args === 100) { vm.preparing = false vm.uploading = true - $log.debug('Prepared for upload.') + logger.debug('Prepared for upload.') } } else if (phase === 'UPLOAD') { // if args is object, this update is about XHRRequest's upload progress @@ -148,18 +147,18 @@ import angular from 'angular' // start next phase when UPLOAD is done if (vm.uploadProgress == 100) { - $log.debug('Uploaded files.') + logger.debug('Uploaded files.') vm.uploading = false vm.finishing = true } } else if (phase === 'FINISH') { // we are concerned only for completion of the phase if (args === 100) { - $log.debug('Finished upload.') + logger.debug('Finished upload.') } } else { // assume it to be error condition - $log.debug('Error Condition: ' + phase) + logger.debug('Error Condition: ' + phase) vm.errorInUpload = true } } diff --git a/app/topcoder.module.js b/app/topcoder.module.js index d3a6f5c8b..290b107d8 100644 --- a/app/topcoder.module.js +++ b/app/topcoder.module.js @@ -38,9 +38,9 @@ import angular from 'angular' angular.module('topcoder', dependencies).run(appRun) - appRun.$inject = ['$rootScope', '$state', 'TcAuthService', '$cookies', 'Helpers', '$log'] + appRun.$inject = ['$rootScope', '$state', 'TcAuthService', '$cookies', 'Helpers', 'logger'] - function appRun($rootScope, $state, TcAuthService, $cookies, Helpers, $log) { + function appRun($rootScope, $state, TcAuthService, $cookies, Helpers, logger) { // Attaching $state to the $rootScope allows us to access the // current state in index.html (see the body tag) $rootScope.$state = $state @@ -48,7 +48,7 @@ import angular from 'angular' // check AuthNAuth on change state start $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) { if (toState.data.authRequired && !TcAuthService.isAuthenticated()) { - $log.debug('State requires authentication, and user is not logged in, redirecting') + logger.debug('State requires authentication, and user is not logged in, redirecting') // setup redirect for post login event.preventDefault() var next = $state.href(toState.name, toParams, {absolute: false})