From 15055868377cb1f473cca781594c07c2eda284ba Mon Sep 17 00:00:00 2001 From: Joris Tirado Date: Wed, 24 Jun 2020 16:13:33 -0700 Subject: [PATCH] Refactor users module adaptors (#230) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Enforce linting rules * Streamline faxing adaptor * Streamline call forwarding adaptor * Streamline license roles adaptor * Streamline devices adaptor * Streamline add user adaptor * Fix incorrect prop names Co-authored-by: Guillermo GutiƩrrez * Remove legacy sort Co-authored-by: Guillermo GutiƩrrez --- submodules/users/users.js | 247 +++++++++++++++++++------------------- 1 file changed, 121 insertions(+), 126 deletions(-) diff --git a/submodules/users/users.js b/submodules/users/users.js index c350451..e9295d2 100644 --- a/submodules/users/users.js +++ b/submodules/users/users.js @@ -1967,87 +1967,94 @@ define(function(require) { } }, + /** + * @param {Object} data + * @param {Array} data.callflows + * @param {Array} data.provisioners + * @param {Array} data.vmboxes + * @return {Object} + */ usersFormatAddUser: function(data) { var self = this, - formattedData = { - hasProvisioner: self.appFlags.common.hasProvisioner && !_.isEmpty(data.provisioners), - sendToSameEmail: true, - nextExtension: '', - listExtensions: {}, - createVmbox: true, - listVMBoxes: {} - }, - arrayExtensions = [], - arrayVMBoxes = [], - allNumbers = []; - - if (_.size(self.appFlags.global.servicePlansRole) > 0) { - formattedData.licensedUserRoles = self.appFlags.global.servicePlansRole; - } - - _.each(data.callflows, function(callflow) { - _.each(callflow.numbers, function(number) { - if (number.length < 7) { - formattedData.listExtensions[number] = callflow; - arrayExtensions.push(number); - } - }); - }); - - _.each(data.vmboxes, function(vmbox) { - formattedData.listVMBoxes[vmbox.mailbox] = vmbox; - arrayVMBoxes.push(vmbox.mailbox); - }); - - // We concat both arrays because we want to create users with the same number for the extension # and the vmbox, - // If for some reason a vmbox number exist without an extension, we still don't want to let them set their extension number to that number. - allNumbers = arrayExtensions.concat(arrayVMBoxes); - formattedData.nextExtension = parseInt(monster.util.getNextExtension(allNumbers)) + ''; - formattedData.listProvisioners = _.map(data.provisioners, function(brand) { - var models = _.flatMap(brand.families, function(family) { - return _.map(family.models, function(model) { - model.family = family.name; - return model; - }); - }); - - return { - id: brand.id, - name: brand.name, - models: models - }; + servicePlansRole = self.appFlags.global.servicePlansRole, + listExtensions = _.flatMap(data.callflows, function(callflow) { + return _ + .chain(callflow.numbers) + .filter(function(number) { + return _.size(number) < 7; + }) + .map(function(number) { + return { + callflow: callflow, + extension: number + }; + }) + .value(); + }), + mapVMBoxes = _.keyBy(data.vmboxes, 'mailbox'), + // We concat both arrays because we want to create users with the same number for the extension # and the vmbox, + // If for some reason a vmbox number exist without an extension, we still don't want to let them set their extension number to that number. + allNumbers = _ + .chain([ + _.map(listExtensions, 'extension'), + _.keys(mapVMBoxes, 'mailbox') + ]) + .flatten() + .uniq() + .value(); + + return _.merge({ + createVmbox: true, + hasProvisioner: self.appFlags.common.hasProvisioner && !_.isEmpty(data.provisioners), + listExtensions: _ + .chain(listExtensions) + .keyBy('extension') + .mapValues('callflow') + .value(), + listProvisioners: _ + .chain(data.provisioners) + .map(function(brand) { + return _.merge({ + models: _.flatMap(brand.families, function(family) { + return _.map(family.models, function(model) { + return _.merge({ + family: family.name + }, model); + }); + }) + }, _.pick(brand, [ + 'id', + 'name' + ])); + }) + .sortBy('name') + .value(), + listVMBoxes: mapVMBoxes, + nextExtension: parseInt(monster.util.getNextExtension(allNumbers)) + '', + sendToSameEmail: true + }, !_.isEmpty(servicePlansRole) && { + licensedUserRoles: servicePlansRole }); - - return formattedData; }, usersFormatFaxingData: function(data) { - var tempList = [], - listNumbers = {}; - - _.each(data.numbers, function(val, key) { - tempList.push(key); - }); - - tempList.sort(function(a, b) { - return a < b ? -1 : 1; - }); - - if (data.callflows) { - if (data.callflows.numbers.length > 0) { - listNumbers[data.callflows.numbers[0]] = data.callflows.numbers[0]; + return _.merge({}, data, { + extra: { + listNumbers: _ + .chain([ + _.keys(data.numbers), + _ + .chain(data.callflows) + .get('numbers', []) + .slice(0, 1) + .value() + ]) + .flatten() + .uniq() + .keyBy() + .value() } - } - - _.each(tempList, function(val, key) { - listNumbers[val] = val; - }); - - data.extra = $.extend(true, {}, data.extra, { - listNumbers: listNumbers }); - - return data; }, usersRenderConferencing: function(data) { @@ -2427,7 +2434,7 @@ define(function(require) { usersRenderCallerId: function(currentUser, numberChoices) { var self = this, allowAnyOwnedNumberAsCallerID = monster.config.whitelabel && monster.config.whitelabel.allowAnyOwnedNumberAsCallerID ? true : false, - templateUser = $.extend(true, {allowAnyOwnedNumberAsCallerID: allowAnyOwnedNumberAsCallerID}, currentUser), + templateUser = $.extend(true, { allowAnyOwnedNumberAsCallerID: allowAnyOwnedNumberAsCallerID }, currentUser), featureTemplate, switchFeature; @@ -2491,28 +2498,25 @@ define(function(require) { usersFormatCallForwardData: function(user) { var self = this, - cfMode = 'off'; - - user.extra = user.extra || {}; + isCallForwardConfigured = _.has(user, 'call_forward.enabled'), + isCallForwardEnabled = _.get(user, 'call_forward.enabled', false), + isFailoverEnabled = _.get(user, 'call_forward.failover', false); //cfmode is on if call_forward.enabled = true //cfmode is failover if call_forward.enabled = false & call_forward.failover = true //cfmode is off if call_forward.enabled = false & call_forward.failover = false - if (user.hasOwnProperty('call_forward') && user.call_forward.hasOwnProperty('enabled')) { - if (user.call_forward.enabled === true) { - cfMode = 'on'; - } else if (user.call_forward.enabled === false) { - cfMode = user.call_forward.hasOwnProperty('failover') && user.call_forward.failover === true ? 'failover' : 'off'; - } - - if (_.has(user.call_forward, 'number')) { - user.call_forward.number = monster.util.unformatPhoneNumber(user.call_forward.number); + return _.merge({}, user, _.merge({ + extra: { + callForwardMode: !isCallForwardConfigured ? 'off' + : isCallForwardEnabled ? 'on' + : isFailoverEnabled ? 'failover' + : 'off' } - } - - user.extra.callForwardMode = cfMode; - - return user; + }, isCallForwardConfigured && { + call_forward: _.merge({}, _.has(user, 'call_forward.number') && { + number: monster.util.unformatPhoneNumber(user.call_forward.number) + }) + })); }, usersRenderCallForward: function(currentUser) { @@ -2592,7 +2596,6 @@ define(function(require) { args.openedTab = 'name'; } - self.usersUpdateUser(userToSave, function(data) { args.userId = data.data.id; @@ -3485,7 +3488,7 @@ define(function(require) { } }); - timezone.populateDropdown(template.find('#user_timezone'), dataTemplate.timezone || 'inherit', {inherit: self.i18n.active().defaultTimezone}); + timezone.populateDropdown(template.find('#user_timezone'), dataTemplate.timezone || 'inherit', { inherit: self.i18n.active().defaultTimezone }); monster.ui.tooltips(template, { options: { @@ -3682,45 +3685,37 @@ define(function(require) { callback && callback(template, user); }); }, - usersFormatLicensedRolesData: function(user) { - var self = this, - formattedData = { - selectedRole: undefined, - availableRoles: self.appFlags.global.servicePlansRole - }; - if (user.hasOwnProperty('service') && user.service.hasOwnProperty('plans') && _.size(user.service.plans) > 0) { - for (var key in user.service.plans) { - if (user.service.plans.hasOwnProperty(key)) { - formattedData.selectedRole = key; - break; - } - } - } - - return formattedData; - }, - usersFormatDevicesData: function(userId, data) { + usersFormatLicensedRolesData: function(user) { var self = this, - formattedData = { - countSpare: 0, - assignedDevices: {}, - unassignedDevices: {} - }; + userPlanIds = _ + .chain(user) + .get('service.plans', {}) + .keys() + .value(); - _.each(data, function(device) { - if (device.owner_id === userId) { - formattedData.assignedDevices[device.id] = device; - } else if (device.owner_id === '' || !('owner_id' in device)) { - formattedData.countSpare++; - formattedData.unassignedDevices[device.id] = device; - } + return _.merge({ + availableRoles: self.appFlags.global.servicePlansRole + }, !_.isEmpty(userPlanIds) && { + selectedRole: _.head(userPlanIds) }); + }, - formattedData.emptyAssigned = _.isEmpty(formattedData.assignedDevices); - formattedData.emptySpare = _.isEmpty(formattedData.unassignedDevices); + usersFormatDevicesData: function(userId, devices) { + var self = this, + assigned = _.filter(devices, { owner_id: userId }), + unassigned = _.flatten([ + _.filter(devices, { owner_id: '' }), + _.reject(devices, _.partial(_.has, _, 'owner_id')) + ]); - return formattedData; + return { + countSpare: _.size(unassigned), + emptyAssigned: _.isEmpty(assigned), + emptySpare: _.isEmpty(unassigned), + assignedDevices: _.keyBy(assigned, 'id'), + unassignedDevices: _.keyBy(unassigned, 'id') + }; }, /**