From d2301fda1c3bc416b5d4b761a569f218f71da178 Mon Sep 17 00:00:00 2001 From: Hans-Peter Herzog Date: Tue, 19 Dec 2017 11:38:03 +0100 Subject: [PATCH] TT#28106 PBXConfig: As a Customer, I want to add new PBX Groups Change-Id: I44f20dc9c9ee6837e16210495bfe84b4d471489b --- src/api/pbx-config.js | 45 +++- src/api/subscriber.js | 33 +++ src/api/user.js | 38 ++++ .../pages/PbxConfiguration/CscPbxGroup.vue | 103 ++------- .../pages/PbxConfiguration/Groups.vue | 215 +++++++++++++++++- src/locales/en.json | 3 +- src/store/pbx-config.js | 109 +++++++-- t/store/pbx-config.js | 2 +- 8 files changed, 423 insertions(+), 125 deletions(-) diff --git a/src/api/pbx-config.js b/src/api/pbx-config.js index 0ac2c2eb..6c0182ac 100644 --- a/src/api/pbx-config.js +++ b/src/api/pbx-config.js @@ -1,7 +1,8 @@ import Vue from 'vue'; import { getJsonBody } from './utils'; -import { getNumbers } from './user'; +import { getNumbers, assignNumber, assignNumbers } from './user'; +import { createSubscriber } from './subscriber'; var assumedRows = 1000; @@ -12,7 +13,7 @@ export function getAllPbxSubscribers() { return Vue.http.get('/api/subscribers', { params: _.assign(params, { page: 1, - rows: assumedRows, + rows: assumedRows }) }); }).then((res)=>{ @@ -33,11 +34,11 @@ export function getAllPbxSubscribers() { let seats = []; let groups = []; subscribers.forEach((subscriber)=>{ - if(subscriber.is_pbx_group) { - groups.push(subscriber); - } else if(subscriber.is_pbx_pilot) { + if(_.has(subscriber, 'is_pbx_pilot') && subscriber.is_pbx_pilot === true) { pilot = subscriber; - } else { + } else if(_.has(subscriber, 'is_pbx_group') && subscriber.is_pbx_group === true) { + groups.push(subscriber); + } else if (_.has(subscriber, 'pbx_extension') && subscriber.pbx_extension !== null) { seats.push(subscriber); } }); @@ -69,3 +70,35 @@ export function getPbxConfiguration() { }); }); } + +export function addGroup(group) { + return new Promise((resolve, reject)=>{ + let randomToken = ()=>{ return 'd' + Date.now() + "r" + (Math.round(Math.random() * 1000000) + 1000000); }; + Promise.resolve().then(()=>{ + return createSubscriber({ + customer_id: group.customerId, + domain_id: group.domainId, + username: randomToken(), + password: randomToken(), + display_name: group.name, + is_pbx_group: true, + pbx_extension: group.extension, + pbx_hunt_policy: group.huntPolicy, + pbx_hunt_timeout: group.huntTimeout, + pbx_groupmember_ids: group.seats + }); + }).then((subscriberId)=>{ + return assignNumbers(group.aliasNumbers, subscriberId); + }).then(()=>{ + resolve(); + }).catch((err)=>{ + reject(err); + }); + }); +} + +export function deleteGroup(id) { + return new Promise((resolve, reject)=>{ + + }); +} diff --git a/src/api/subscriber.js b/src/api/subscriber.js index cb6c1626..861f4d80 100644 --- a/src/api/subscriber.js +++ b/src/api/subscriber.js @@ -179,3 +179,36 @@ export function enablePrivacy(id) { export function disablePrivacy(id) { return setPrivacy(id, false); } + +export function createSubscriber(subscriber) { + return new Promise((resolve, reject)=>{ + Vue.http.post('/api/subscribers/', subscriber, { + params: { + customer_id: subscriber.customer_id + } + }).then((res)=>{ + resolve(_.last(_.split(res.headers.get('Location'), '/'))); + }).catch((err)=>{ + if(err.status === 422) { + reject(new Error(err.body.message)); + } else { + reject(err); + } + }); + }); +} + +// export function deleteSubscriber(id) { +// return new Promise((resolve, reject)=>{ +// Vue.http.delete('/api/subscribers/', null, { +// }).then((res)=>{ +// resolve(_.last(_.split(res.headers.get('Location'), '/'))); +// }).catch((err)=>{ +// if(err.status === 422) { +// reject(new Error(err.body.message)); +// } else { +// reject(err); +// } +// }); +// }); +// } diff --git a/src/api/user.js b/src/api/user.js index 9303b394..7c0e11bd 100644 --- a/src/api/user.js +++ b/src/api/user.js @@ -68,6 +68,44 @@ export function getCapabilities() { }); } +export function assignNumber(numberId, subscriberId) { + return new Promise((resolve, reject)=>{ + var headers = {}; + headers['Content-Type'] = 'application/json-patch+json'; + Promise.resolve().then((result)=>{ + return Vue.http.patch('/api/numbers/' + numberId, [{ + op: 'replace', + path: '/subscriber_id', + value: subscriberId + }], { + headers: headers + }); + }).then(()=>{ + resolve(); + }).catch((err)=>{ + reject(err); + }); + }); +} + +export function assignNumbers(numberIds, subscriberId) { + return new Promise((resolve, reject)=>{ + if(_.isArray(numberIds) && numberIds.length > 0) { + let assignNumberRequests = []; + numberIds.forEach((numberId)=>{ + assignNumberRequests.push(assignNumber(numberId, subscriberId)); + }); + Promise.all(assignNumberRequests).then(()=>{ + resolve(); + }).catch((err)=>{ + reject(err); + }); + } else { + reject(new Error('No numberIds given')); + } + }); +} + export function getNumbers() { return new Promise((resolve, reject)=>{ let params = {}; diff --git a/src/components/pages/PbxConfiguration/CscPbxGroup.vue b/src/components/pages/PbxConfiguration/CscPbxGroup.vue index db759a32..ff76f380 100644 --- a/src/components/pages/PbxConfiguration/CscPbxGroup.vue +++ b/src/components/pages/PbxConfiguration/CscPbxGroup.vue @@ -1,5 +1,5 @@