@webex/contact-center 3.9.0 → 3.10.0-next.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cc.js +196 -47
- package/dist/cc.js.map +1 -1
- package/dist/constants.js +1 -0
- package/dist/constants.js.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/logger-proxy.js +24 -1
- package/dist/logger-proxy.js.map +1 -1
- package/dist/metrics/MetricsManager.js +1 -1
- package/dist/metrics/MetricsManager.js.map +1 -1
- package/dist/metrics/behavioral-events.js +89 -0
- package/dist/metrics/behavioral-events.js.map +1 -1
- package/dist/metrics/constants.js +32 -2
- package/dist/metrics/constants.js.map +1 -1
- package/dist/services/AddressBook.js +271 -0
- package/dist/services/AddressBook.js.map +1 -0
- package/dist/services/EntryPoint.js +227 -0
- package/dist/services/EntryPoint.js.map +1 -0
- package/dist/services/Queue.js +261 -0
- package/dist/services/Queue.js.map +1 -0
- package/dist/services/config/constants.js +36 -2
- package/dist/services/config/constants.js.map +1 -1
- package/dist/services/config/index.js +29 -21
- package/dist/services/config/index.js.map +1 -1
- package/dist/services/config/types.js +33 -1
- package/dist/services/config/types.js.map +1 -1
- package/dist/services/core/GlobalTypes.js.map +1 -1
- package/dist/services/core/Utils.js +162 -2
- package/dist/services/core/Utils.js.map +1 -1
- package/dist/services/core/aqm-reqs.js +0 -4
- package/dist/services/core/aqm-reqs.js.map +1 -1
- package/dist/services/core/websocket/WebSocketManager.js +0 -4
- package/dist/services/core/websocket/WebSocketManager.js.map +1 -1
- package/dist/services/task/TaskManager.js +114 -3
- package/dist/services/task/TaskManager.js.map +1 -1
- package/dist/services/task/TaskUtils.js +76 -0
- package/dist/services/task/TaskUtils.js.map +1 -0
- package/dist/services/task/constants.js +26 -1
- package/dist/services/task/constants.js.map +1 -1
- package/dist/services/task/contact.js +86 -0
- package/dist/services/task/contact.js.map +1 -1
- package/dist/services/task/index.js +418 -87
- package/dist/services/task/index.js.map +1 -1
- package/dist/services/task/types.js +14 -0
- package/dist/services/task/types.js.map +1 -1
- package/dist/types/cc.d.ts +115 -35
- package/dist/types/constants.d.ts +1 -0
- package/dist/types/index.d.ts +3 -2
- package/dist/types/metrics/constants.d.ts +25 -1
- package/dist/types/services/AddressBook.d.ts +74 -0
- package/dist/types/services/EntryPoint.d.ts +67 -0
- package/dist/types/services/Queue.d.ts +76 -0
- package/dist/types/services/config/constants.d.ts +35 -1
- package/dist/types/services/config/index.d.ts +6 -9
- package/dist/types/services/config/types.d.ts +79 -58
- package/dist/types/services/core/GlobalTypes.d.ts +25 -0
- package/dist/types/services/core/Utils.d.ts +40 -1
- package/dist/types/services/task/TaskUtils.d.ts +28 -0
- package/dist/types/services/task/constants.d.ts +23 -0
- package/dist/types/services/task/contact.d.ts +10 -0
- package/dist/types/services/task/index.d.ts +85 -4
- package/dist/types/services/task/types.d.ts +233 -21
- package/dist/types/types.d.ts +162 -0
- package/dist/types/utils/PageCache.d.ts +173 -0
- package/dist/types.js +17 -0
- package/dist/types.js.map +1 -1
- package/dist/utils/PageCache.js +192 -0
- package/dist/utils/PageCache.js.map +1 -0
- package/dist/webex.js +1 -1
- package/package.json +10 -9
- package/src/cc.ts +221 -52
- package/src/constants.ts +1 -0
- package/src/index.ts +16 -2
- package/src/logger-proxy.ts +24 -1
- package/src/metrics/MetricsManager.ts +1 -1
- package/src/metrics/behavioral-events.ts +94 -0
- package/src/metrics/constants.ts +37 -1
- package/src/services/AddressBook.ts +291 -0
- package/src/services/EntryPoint.ts +241 -0
- package/src/services/Queue.ts +277 -0
- package/src/services/config/constants.ts +42 -2
- package/src/services/config/index.ts +30 -30
- package/src/services/config/types.ts +59 -58
- package/src/services/core/GlobalTypes.ts +27 -0
- package/src/services/core/Utils.ts +199 -1
- package/src/services/core/aqm-reqs.ts +0 -5
- package/src/services/core/websocket/WebSocketManager.ts +0 -4
- package/src/services/task/TaskManager.ts +123 -5
- package/src/services/task/TaskUtils.ts +81 -0
- package/src/services/task/constants.ts +25 -0
- package/src/services/task/contact.ts +80 -0
- package/src/services/task/index.ts +510 -71
- package/src/services/task/types.ts +251 -20
- package/src/types.ts +180 -0
- package/src/utils/PageCache.ts +252 -0
- package/test/unit/spec/cc.ts +282 -85
- package/test/unit/spec/metrics/MetricsManager.ts +0 -1
- package/test/unit/spec/metrics/behavioral-events.ts +42 -0
- package/test/unit/spec/services/AddressBook.ts +332 -0
- package/test/unit/spec/services/EntryPoint.ts +259 -0
- package/test/unit/spec/services/Queue.ts +323 -0
- package/test/unit/spec/services/config/index.ts +279 -65
- package/test/unit/spec/services/core/Utils.ts +50 -0
- package/test/unit/spec/services/core/aqm-reqs.ts +1 -3
- package/test/unit/spec/services/core/websocket/WebSocketManager.ts +0 -4
- package/test/unit/spec/services/task/TaskManager.ts +390 -1
- package/test/unit/spec/services/task/TaskUtils.ts +131 -0
- package/test/unit/spec/services/task/contact.ts +31 -1
- package/test/unit/spec/services/task/index.ts +585 -130
- package/umd/contact-center.min.js +2 -2
- package/umd/contact-center.min.js.map +1 -1
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = exports.AddressBook = void 0;
|
|
7
|
+
var _types = require("../types");
|
|
8
|
+
var _loggerProxy = _interopRequireDefault(require("../logger-proxy"));
|
|
9
|
+
var _WebexRequest = _interopRequireDefault(require("./core/WebexRequest"));
|
|
10
|
+
var _PageCache = _interopRequireWildcard(require("../utils/PageCache"));
|
|
11
|
+
var _MetricsManager = _interopRequireDefault(require("../metrics/MetricsManager"));
|
|
12
|
+
var _constants = require("./constants");
|
|
13
|
+
var _constants2 = require("./config/constants");
|
|
14
|
+
var _constants3 = require("../metrics/constants");
|
|
15
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
16
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
17
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
18
|
+
/**
|
|
19
|
+
* AddressBook API class for managing Webex Contact Center address book entries.
|
|
20
|
+
* Provides functionality to fetch address book entries using the entry API.
|
|
21
|
+
*
|
|
22
|
+
* @class AddressBook
|
|
23
|
+
* @public
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* import Webex from 'webex';
|
|
27
|
+
*
|
|
28
|
+
* const webex = new Webex({ credentials: 'YOUR_ACCESS_TOKEN' });
|
|
29
|
+
* const cc = webex.cc;
|
|
30
|
+
*
|
|
31
|
+
* // Register and login first
|
|
32
|
+
* await cc.register();
|
|
33
|
+
* await cc.stationLogin({ teamId: 'team123', loginOption: 'BROWSER' });
|
|
34
|
+
*
|
|
35
|
+
* // Get AddressBook API instance from ContactCenter
|
|
36
|
+
* const addressBookAPI = cc.addressBook;
|
|
37
|
+
*
|
|
38
|
+
* // Get entries from agent's default address book
|
|
39
|
+
* const entries = await addressBookAPI.getEntries();
|
|
40
|
+
*
|
|
41
|
+
* // Get entries from a specific address book with pagination
|
|
42
|
+
* const entries = await addressBookAPI.getEntries({
|
|
43
|
+
* addressBookId: 'addressBookId123',
|
|
44
|
+
* page: 0,
|
|
45
|
+
* pageSize: 50
|
|
46
|
+
* });
|
|
47
|
+
*
|
|
48
|
+
* // Search for specific entries
|
|
49
|
+
* const searchResults = await addressBook.getEntries({
|
|
50
|
+
* search: 'john',
|
|
51
|
+
* filter: 'name=="John Doe"'
|
|
52
|
+
* });
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
class AddressBook {
|
|
56
|
+
// Page cache using the common utility
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Creates an instance of AddressBook
|
|
60
|
+
* @param {WebexSDK} webex - The Webex SDK instance
|
|
61
|
+
* @param {() => string} getAddressBookId - Function to get the addressBookId from agent profile
|
|
62
|
+
* @public
|
|
63
|
+
*/
|
|
64
|
+
constructor(webex, getAddressBookId) {
|
|
65
|
+
this.webex = webex;
|
|
66
|
+
this.webexRequest = _WebexRequest.default.getInstance({
|
|
67
|
+
webex
|
|
68
|
+
});
|
|
69
|
+
this.getAddressBookId = getAddressBookId;
|
|
70
|
+
this.pageCache = new _PageCache.default('AddressBook');
|
|
71
|
+
this.metricsManager = _MetricsManager.default.getInstance({
|
|
72
|
+
webex
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Fetches address book entries for a specific address book using the entry API
|
|
78
|
+
* @param {AddressBookEntrySearchParams} [params] - Search and pagination parameters including addressBookId
|
|
79
|
+
* @returns {Promise<AddressBookEntriesResponse>} Promise resolving to address book entries
|
|
80
|
+
* @throws {Error} If the API call fails
|
|
81
|
+
* @public
|
|
82
|
+
* @example
|
|
83
|
+
* ```typescript
|
|
84
|
+
* // Get entries from agent's default address book
|
|
85
|
+
* const response = await addressBookAPI.getEntries();
|
|
86
|
+
*
|
|
87
|
+
* // Get entries from a specific address book with pagination
|
|
88
|
+
* const response = await addressBookAPI.getEntries({
|
|
89
|
+
* addressBookId: 'addressBookId123',
|
|
90
|
+
* page: 0,
|
|
91
|
+
* pageSize: 25
|
|
92
|
+
* });
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
async getEntries(params = {}) {
|
|
96
|
+
const startTime = Date.now();
|
|
97
|
+
const {
|
|
98
|
+
addressBookId,
|
|
99
|
+
page = _PageCache.PAGINATION_DEFAULTS.PAGE,
|
|
100
|
+
pageSize = _PageCache.PAGINATION_DEFAULTS.PAGE_SIZE,
|
|
101
|
+
search,
|
|
102
|
+
filter,
|
|
103
|
+
attributes
|
|
104
|
+
} = params;
|
|
105
|
+
|
|
106
|
+
// Use provided addressBookId or fall back to agent's address book
|
|
107
|
+
const bookId = addressBookId || this.getAddressBookId();
|
|
108
|
+
const orgId = this.webex.credentials.getOrgId();
|
|
109
|
+
const isSearchRequest = !!(search || filter || attributes);
|
|
110
|
+
_loggerProxy.default.info('Fetching address book entries', {
|
|
111
|
+
module: 'AddressBook',
|
|
112
|
+
method: 'getEntries',
|
|
113
|
+
data: {
|
|
114
|
+
orgId,
|
|
115
|
+
bookId,
|
|
116
|
+
page,
|
|
117
|
+
pageSize,
|
|
118
|
+
isSearchRequest
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
// Check if we can use cache for simple pagination (no search/filter/attributes)
|
|
123
|
+
if (this.pageCache.canUseCache({
|
|
124
|
+
search,
|
|
125
|
+
filter,
|
|
126
|
+
attributes
|
|
127
|
+
})) {
|
|
128
|
+
const cacheKey = this.pageCache.buildCacheKey(bookId, page, pageSize);
|
|
129
|
+
const cachedPage = this.pageCache.getCachedPage(cacheKey);
|
|
130
|
+
if (cachedPage) {
|
|
131
|
+
const duration = Date.now() - startTime;
|
|
132
|
+
_loggerProxy.default.info(`Returning page ${page} from cache`, {
|
|
133
|
+
module: 'AddressBook',
|
|
134
|
+
method: 'getEntries',
|
|
135
|
+
data: {
|
|
136
|
+
cacheHit: true,
|
|
137
|
+
duration,
|
|
138
|
+
recordCount: cachedPage.data.length,
|
|
139
|
+
page,
|
|
140
|
+
pageSize
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
return {
|
|
144
|
+
data: cachedPage.data,
|
|
145
|
+
meta: {
|
|
146
|
+
page,
|
|
147
|
+
pageSize,
|
|
148
|
+
totalPages: cachedPage.totalMeta?.totalPages,
|
|
149
|
+
totalRecords: cachedPage.totalMeta?.totalRecords
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// Start timing for the operation
|
|
156
|
+
this.metricsManager.timeEvent(_constants3.METRIC_EVENT_NAMES.ADDRESSBOOK_FETCH_SUCCESS);
|
|
157
|
+
|
|
158
|
+
// Validate address book id early to avoid bad requests
|
|
159
|
+
if (!bookId) {
|
|
160
|
+
const errorData = {
|
|
161
|
+
orgId,
|
|
162
|
+
bookId,
|
|
163
|
+
isSearchRequest,
|
|
164
|
+
page,
|
|
165
|
+
pageSize,
|
|
166
|
+
error: 'Missing addressBookId for agent. Ensure agent profile contains addressBookId.'
|
|
167
|
+
};
|
|
168
|
+
_loggerProxy.default.error('AddressBook called without a valid addressBookId', {
|
|
169
|
+
module: 'AddressBook',
|
|
170
|
+
method: 'getEntries',
|
|
171
|
+
data: errorData
|
|
172
|
+
});
|
|
173
|
+
this.metricsManager.trackEvent(_constants3.METRIC_EVENT_NAMES.ADDRESSBOOK_FETCH_FAILED, errorData, ['behavioral', 'operational']);
|
|
174
|
+
throw new Error('AddressBook: addressBookId is not available for the current agent.');
|
|
175
|
+
}
|
|
176
|
+
try {
|
|
177
|
+
// Build query parameters according to spec
|
|
178
|
+
const queryParams = new URLSearchParams({
|
|
179
|
+
page: page.toString(),
|
|
180
|
+
pageSize: pageSize.toString()
|
|
181
|
+
});
|
|
182
|
+
if (filter) queryParams.append('filter', filter);
|
|
183
|
+
if (attributes) queryParams.append('attributes', attributes);
|
|
184
|
+
if (search) queryParams.append('search', search);
|
|
185
|
+
const resource = _constants2.endPointMap.addressBookEntries(orgId, bookId, queryParams.toString());
|
|
186
|
+
_loggerProxy.default.info('Making API request to fetch address book entries', {
|
|
187
|
+
module: 'AddressBook',
|
|
188
|
+
method: 'getEntries',
|
|
189
|
+
data: {
|
|
190
|
+
resource,
|
|
191
|
+
service: _constants.WCC_API_GATEWAY
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
const response = await this.webexRequest.request({
|
|
195
|
+
service: _constants.WCC_API_GATEWAY,
|
|
196
|
+
resource,
|
|
197
|
+
method: _types.HTTP_METHODS.GET
|
|
198
|
+
});
|
|
199
|
+
const duration = Date.now() - startTime;
|
|
200
|
+
const recordCount = response.body?.data?.length || 0;
|
|
201
|
+
const totalRecords = response.body?.meta?.totalRecords;
|
|
202
|
+
_loggerProxy.default.info(`Successfully retrieved ${recordCount} address book entries`, {
|
|
203
|
+
module: 'AddressBook',
|
|
204
|
+
method: 'getEntries',
|
|
205
|
+
data: {
|
|
206
|
+
statusCode: response.statusCode,
|
|
207
|
+
duration,
|
|
208
|
+
recordCount,
|
|
209
|
+
totalRecords,
|
|
210
|
+
isSearchRequest,
|
|
211
|
+
page,
|
|
212
|
+
pageSize
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
// Only track metrics for search requests or first page loads to reduce metric volume
|
|
217
|
+
if (isSearchRequest || page === 0) {
|
|
218
|
+
this.metricsManager.trackEvent(_constants3.METRIC_EVENT_NAMES.ADDRESSBOOK_FETCH_SUCCESS, {
|
|
219
|
+
orgId,
|
|
220
|
+
bookId,
|
|
221
|
+
statusCode: response.statusCode,
|
|
222
|
+
recordCount,
|
|
223
|
+
totalRecords,
|
|
224
|
+
isSearchRequest,
|
|
225
|
+
isFirstPage: page === 0
|
|
226
|
+
}, ['behavioral', 'operational']);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Cache the page data for simple pagination (no search/filter/attributes)
|
|
230
|
+
if (this.pageCache.canUseCache({
|
|
231
|
+
search,
|
|
232
|
+
filter,
|
|
233
|
+
attributes
|
|
234
|
+
}) && response.body?.data) {
|
|
235
|
+
const cacheKey = this.pageCache.buildCacheKey(bookId, page, pageSize);
|
|
236
|
+
this.pageCache.cachePage(cacheKey, response.body.data, response.body.meta);
|
|
237
|
+
_loggerProxy.default.info('Cached address book entries for future requests', {
|
|
238
|
+
module: 'AddressBook',
|
|
239
|
+
method: 'getEntries',
|
|
240
|
+
data: {
|
|
241
|
+
cacheKey,
|
|
242
|
+
recordCount
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
return response.body;
|
|
247
|
+
} catch (error) {
|
|
248
|
+
const errorData = {
|
|
249
|
+
orgId,
|
|
250
|
+
bookId,
|
|
251
|
+
error: error instanceof Error ? error.message : String(error),
|
|
252
|
+
isSearchRequest,
|
|
253
|
+
page,
|
|
254
|
+
pageSize
|
|
255
|
+
};
|
|
256
|
+
_loggerProxy.default.error('Failed to fetch address book entries', {
|
|
257
|
+
module: 'AddressBook',
|
|
258
|
+
method: 'getEntries',
|
|
259
|
+
data: errorData,
|
|
260
|
+
error
|
|
261
|
+
});
|
|
262
|
+
|
|
263
|
+
// Track all failures for troubleshooting
|
|
264
|
+
this.metricsManager.trackEvent(_constants3.METRIC_EVENT_NAMES.ADDRESSBOOK_FETCH_FAILED, errorData, ['behavioral', 'operational']);
|
|
265
|
+
throw error;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
exports.AddressBook = AddressBook;
|
|
270
|
+
var _default = exports.default = AddressBook;
|
|
271
|
+
//# sourceMappingURL=AddressBook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_types","require","_loggerProxy","_interopRequireDefault","_WebexRequest","_PageCache","_interopRequireWildcard","_MetricsManager","_constants","_constants2","_constants3","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","obj","AddressBook","constructor","webex","getAddressBookId","webexRequest","WebexRequest","getInstance","pageCache","PageCache","metricsManager","MetricsManager","getEntries","params","startTime","Date","now","addressBookId","page","PAGINATION_DEFAULTS","PAGE","pageSize","PAGE_SIZE","search","filter","attributes","bookId","orgId","credentials","getOrgId","isSearchRequest","LoggerProxy","info","module","method","data","canUseCache","cacheKey","buildCacheKey","cachedPage","getCachedPage","duration","cacheHit","recordCount","length","meta","totalPages","totalMeta","totalRecords","timeEvent","METRIC_EVENT_NAMES","ADDRESSBOOK_FETCH_SUCCESS","errorData","error","trackEvent","ADDRESSBOOK_FETCH_FAILED","Error","queryParams","URLSearchParams","toString","append","resource","endPointMap","addressBookEntries","service","WCC_API_GATEWAY","response","request","HTTP_METHODS","GET","body","statusCode","isFirstPage","cachePage","message","String","exports","_default"],"sources":["AddressBook.ts"],"sourcesContent":["import {HTTP_METHODS, WebexSDK} from '../types';\nimport type {\n AddressBookEntry,\n AddressBookEntriesResponse,\n AddressBookEntrySearchParams,\n} from '../types';\nimport LoggerProxy from '../logger-proxy';\nimport WebexRequest from './core/WebexRequest';\nimport PageCache, {PAGINATION_DEFAULTS} from '../utils/PageCache';\nimport MetricsManager from '../metrics/MetricsManager';\nimport {WCC_API_GATEWAY} from './constants';\nimport {endPointMap} from './config/constants';\nimport {METRIC_EVENT_NAMES} from '../metrics/constants';\n\n/**\n * AddressBook API class for managing Webex Contact Center address book entries.\n * Provides functionality to fetch address book entries using the entry API.\n *\n * @class AddressBook\n * @public\n * @example\n * ```typescript\n * import Webex from 'webex';\n *\n * const webex = new Webex({ credentials: 'YOUR_ACCESS_TOKEN' });\n * const cc = webex.cc;\n *\n * // Register and login first\n * await cc.register();\n * await cc.stationLogin({ teamId: 'team123', loginOption: 'BROWSER' });\n *\n * // Get AddressBook API instance from ContactCenter\n * const addressBookAPI = cc.addressBook;\n *\n * // Get entries from agent's default address book\n * const entries = await addressBookAPI.getEntries();\n *\n * // Get entries from a specific address book with pagination\n * const entries = await addressBookAPI.getEntries({\n * addressBookId: 'addressBookId123',\n * page: 0,\n * pageSize: 50\n * });\n *\n * // Search for specific entries\n * const searchResults = await addressBook.getEntries({\n * search: 'john',\n * filter: 'name==\"John Doe\"'\n * });\n * ```\n */\nexport class AddressBook {\n private webexRequest: WebexRequest;\n private webex: WebexSDK;\n private getAddressBookId: () => string;\n private metricsManager: MetricsManager;\n\n // Page cache using the common utility\n private pageCache: PageCache<AddressBookEntry>;\n\n /**\n * Creates an instance of AddressBook\n * @param {WebexSDK} webex - The Webex SDK instance\n * @param {() => string} getAddressBookId - Function to get the addressBookId from agent profile\n * @public\n */\n constructor(webex: WebexSDK, getAddressBookId: () => string) {\n this.webex = webex;\n this.webexRequest = WebexRequest.getInstance({webex});\n this.getAddressBookId = getAddressBookId;\n this.pageCache = new PageCache<AddressBookEntry>('AddressBook');\n this.metricsManager = MetricsManager.getInstance({webex});\n }\n\n /**\n * Fetches address book entries for a specific address book using the entry API\n * @param {AddressBookEntrySearchParams} [params] - Search and pagination parameters including addressBookId\n * @returns {Promise<AddressBookEntriesResponse>} Promise resolving to address book entries\n * @throws {Error} If the API call fails\n * @public\n * @example\n * ```typescript\n * // Get entries from agent's default address book\n * const response = await addressBookAPI.getEntries();\n *\n * // Get entries from a specific address book with pagination\n * const response = await addressBookAPI.getEntries({\n * addressBookId: 'addressBookId123',\n * page: 0,\n * pageSize: 25\n * });\n * ```\n */\n public async getEntries(\n params: AddressBookEntrySearchParams = {}\n ): Promise<AddressBookEntriesResponse> {\n const startTime = Date.now();\n const {\n addressBookId,\n page = PAGINATION_DEFAULTS.PAGE,\n pageSize = PAGINATION_DEFAULTS.PAGE_SIZE,\n search,\n filter,\n attributes,\n } = params;\n\n // Use provided addressBookId or fall back to agent's address book\n const bookId = addressBookId || this.getAddressBookId();\n const orgId = this.webex.credentials.getOrgId();\n const isSearchRequest = !!(search || filter || attributes);\n\n LoggerProxy.info('Fetching address book entries', {\n module: 'AddressBook',\n method: 'getEntries',\n data: {\n orgId,\n bookId,\n page,\n pageSize,\n isSearchRequest,\n },\n });\n\n // Check if we can use cache for simple pagination (no search/filter/attributes)\n if (this.pageCache.canUseCache({search, filter, attributes})) {\n const cacheKey = this.pageCache.buildCacheKey(bookId, page, pageSize);\n const cachedPage = this.pageCache.getCachedPage(cacheKey);\n\n if (cachedPage) {\n const duration = Date.now() - startTime;\n\n LoggerProxy.info(`Returning page ${page} from cache`, {\n module: 'AddressBook',\n method: 'getEntries',\n data: {\n cacheHit: true,\n duration,\n recordCount: cachedPage.data.length,\n page,\n pageSize,\n },\n });\n\n return {\n data: cachedPage.data,\n meta: {\n page,\n pageSize,\n totalPages: cachedPage.totalMeta?.totalPages,\n totalRecords: cachedPage.totalMeta?.totalRecords,\n },\n };\n }\n }\n\n // Start timing for the operation\n this.metricsManager.timeEvent(METRIC_EVENT_NAMES.ADDRESSBOOK_FETCH_SUCCESS);\n\n // Validate address book id early to avoid bad requests\n if (!bookId) {\n const errorData = {\n orgId,\n bookId,\n isSearchRequest,\n page,\n pageSize,\n error: 'Missing addressBookId for agent. Ensure agent profile contains addressBookId.',\n };\n LoggerProxy.error('AddressBook called without a valid addressBookId', {\n module: 'AddressBook',\n method: 'getEntries',\n data: errorData,\n });\n\n this.metricsManager.trackEvent(METRIC_EVENT_NAMES.ADDRESSBOOK_FETCH_FAILED, errorData, [\n 'behavioral',\n 'operational',\n ]);\n\n throw new Error('AddressBook: addressBookId is not available for the current agent.');\n }\n\n try {\n // Build query parameters according to spec\n const queryParams = new URLSearchParams({\n page: page.toString(),\n pageSize: pageSize.toString(),\n });\n\n if (filter) queryParams.append('filter', filter);\n if (attributes) queryParams.append('attributes', attributes);\n if (search) queryParams.append('search', search);\n\n const resource = endPointMap.addressBookEntries(orgId, bookId, queryParams.toString());\n\n LoggerProxy.info('Making API request to fetch address book entries', {\n module: 'AddressBook',\n method: 'getEntries',\n data: {\n resource,\n service: WCC_API_GATEWAY,\n },\n });\n\n const response = await this.webexRequest.request({\n service: WCC_API_GATEWAY,\n resource,\n method: HTTP_METHODS.GET,\n });\n\n const duration = Date.now() - startTime;\n\n const recordCount = response.body?.data?.length || 0;\n const totalRecords = response.body?.meta?.totalRecords;\n\n LoggerProxy.info(`Successfully retrieved ${recordCount} address book entries`, {\n module: 'AddressBook',\n method: 'getEntries',\n data: {\n statusCode: response.statusCode,\n duration,\n recordCount,\n totalRecords,\n isSearchRequest,\n page,\n pageSize,\n },\n });\n\n // Only track metrics for search requests or first page loads to reduce metric volume\n if (isSearchRequest || page === 0) {\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.ADDRESSBOOK_FETCH_SUCCESS,\n {\n orgId,\n bookId,\n statusCode: response.statusCode,\n recordCount,\n totalRecords,\n isSearchRequest,\n isFirstPage: page === 0,\n },\n ['behavioral', 'operational']\n );\n }\n\n // Cache the page data for simple pagination (no search/filter/attributes)\n if (this.pageCache.canUseCache({search, filter, attributes}) && response.body?.data) {\n const cacheKey = this.pageCache.buildCacheKey(bookId, page, pageSize);\n this.pageCache.cachePage(cacheKey, response.body.data, response.body.meta);\n\n LoggerProxy.info('Cached address book entries for future requests', {\n module: 'AddressBook',\n method: 'getEntries',\n data: {\n cacheKey,\n recordCount,\n },\n });\n }\n\n return response.body;\n } catch (error) {\n const errorData = {\n orgId,\n bookId,\n error: error instanceof Error ? error.message : String(error),\n isSearchRequest,\n page,\n pageSize,\n };\n\n LoggerProxy.error('Failed to fetch address book entries', {\n module: 'AddressBook',\n method: 'getEntries',\n data: errorData,\n error,\n });\n\n // Track all failures for troubleshooting\n this.metricsManager.trackEvent(METRIC_EVENT_NAMES.ADDRESSBOOK_FETCH_FAILED, errorData, [\n 'behavioral',\n 'operational',\n ]);\n\n throw error;\n }\n }\n}\n\nexport default AddressBook;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = exports.EntryPoint = void 0;
|
|
7
|
+
var _types = require("../types");
|
|
8
|
+
var _loggerProxy = _interopRequireDefault(require("../logger-proxy"));
|
|
9
|
+
var _WebexRequest = _interopRequireDefault(require("./core/WebexRequest"));
|
|
10
|
+
var _PageCache = _interopRequireWildcard(require("../utils/PageCache"));
|
|
11
|
+
var _MetricsManager = _interopRequireDefault(require("../metrics/MetricsManager"));
|
|
12
|
+
var _constants = require("./constants");
|
|
13
|
+
var _constants2 = require("./config/constants");
|
|
14
|
+
var _constants3 = require("../metrics/constants");
|
|
15
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
16
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
17
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
18
|
+
/**
|
|
19
|
+
* EntryPoint class for managing Webex Contact Center entry points.
|
|
20
|
+
* Provides functionality to fetch, search, and paginate through entry points.
|
|
21
|
+
*
|
|
22
|
+
* @class EntryPoint
|
|
23
|
+
* @public
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* import Webex from 'webex';
|
|
27
|
+
*
|
|
28
|
+
* const webex = new Webex({ credentials: 'YOUR_ACCESS_TOKEN' });
|
|
29
|
+
* const cc = webex.cc;
|
|
30
|
+
*
|
|
31
|
+
* // Register and login first
|
|
32
|
+
* await cc.register();
|
|
33
|
+
* await cc.stationLogin({ teamId: 'team123', loginOption: 'BROWSER' });
|
|
34
|
+
*
|
|
35
|
+
* // Get EntryPoint API instance from ContactCenter
|
|
36
|
+
* const entryPointAPI = cc.entryPoint;
|
|
37
|
+
*
|
|
38
|
+
* // Get all entry points with pagination
|
|
39
|
+
* const response = await entryPointAPI.getEntryPoints({
|
|
40
|
+
* page: 0,
|
|
41
|
+
* pageSize: 50
|
|
42
|
+
* });
|
|
43
|
+
*
|
|
44
|
+
* // Search for specific entry points
|
|
45
|
+
* const searchResults = await entryPointAPI.searchEntryPoints({
|
|
46
|
+
* search: 'support',
|
|
47
|
+
* filter: 'type=="voice"'
|
|
48
|
+
* });
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
class EntryPoint {
|
|
52
|
+
// Page cache using the common utility
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Creates an instance of EntryPoint
|
|
56
|
+
* @param {WebexSDK} webex - The Webex SDK instance
|
|
57
|
+
* @public
|
|
58
|
+
*/
|
|
59
|
+
constructor(webex) {
|
|
60
|
+
this.webex = webex;
|
|
61
|
+
this.webexRequest = _WebexRequest.default.getInstance({
|
|
62
|
+
webex
|
|
63
|
+
});
|
|
64
|
+
this.pageCache = new _PageCache.default('EntryPoint');
|
|
65
|
+
this.metricsManager = _MetricsManager.default.getInstance({
|
|
66
|
+
webex
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Fetches entry points for the organization with pagination support
|
|
72
|
+
* @param {EntryPointSearchParams} [params] - Search and pagination parameters
|
|
73
|
+
* @returns {Promise<EntryPointListResponse>} Promise resolving to paginated entry points
|
|
74
|
+
* @throws {Error} If the API call fails
|
|
75
|
+
* @public
|
|
76
|
+
* @example
|
|
77
|
+
* ```typescript
|
|
78
|
+
* // Get first page of entry points
|
|
79
|
+
* const response = await entryPointAPI.getEntryPoints();
|
|
80
|
+
*
|
|
81
|
+
* // Get specific page with custom page size
|
|
82
|
+
* const response = await entryPointAPI.getEntryPoints({
|
|
83
|
+
* page: 2,
|
|
84
|
+
* pageSize: 25
|
|
85
|
+
* });
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
async getEntryPoints(params = {}) {
|
|
89
|
+
const startTime = Date.now();
|
|
90
|
+
const {
|
|
91
|
+
page = _PageCache.PAGINATION_DEFAULTS.PAGE,
|
|
92
|
+
pageSize = _PageCache.PAGINATION_DEFAULTS.PAGE_SIZE,
|
|
93
|
+
search,
|
|
94
|
+
filter,
|
|
95
|
+
attributes,
|
|
96
|
+
sortBy,
|
|
97
|
+
sortOrder = 'asc'
|
|
98
|
+
} = params;
|
|
99
|
+
const orgId = this.webex.credentials.getOrgId();
|
|
100
|
+
const isSearchRequest = !!(search || filter || attributes || sortBy);
|
|
101
|
+
_loggerProxy.default.info(`Fetching entry points - orgId: ${orgId}, page: ${page}, pageSize: ${pageSize}, isSearchRequest: ${isSearchRequest}`, {
|
|
102
|
+
module: 'EntryPoint',
|
|
103
|
+
method: 'getEntryPoints'
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
// Check if we can use cache for simple pagination (no search/filter/attributes/sort)
|
|
107
|
+
if (this.pageCache.canUseCache({
|
|
108
|
+
search,
|
|
109
|
+
filter,
|
|
110
|
+
attributes,
|
|
111
|
+
sortBy
|
|
112
|
+
})) {
|
|
113
|
+
const cacheKey = this.pageCache.buildCacheKey(orgId, page, pageSize);
|
|
114
|
+
const cachedPage = this.pageCache.getCachedPage(cacheKey);
|
|
115
|
+
if (cachedPage) {
|
|
116
|
+
const duration = Date.now() - startTime;
|
|
117
|
+
_loggerProxy.default.log(`Returning page ${page} from cache - cacheHit: true, duration: ${duration}ms, recordCount: ${cachedPage.data.length}, pageSize: ${pageSize}`, {
|
|
118
|
+
module: 'EntryPoint',
|
|
119
|
+
method: 'getEntryPoints'
|
|
120
|
+
});
|
|
121
|
+
return {
|
|
122
|
+
data: cachedPage.data,
|
|
123
|
+
meta: {
|
|
124
|
+
page,
|
|
125
|
+
pageSize,
|
|
126
|
+
totalPages: cachedPage.totalMeta?.totalPages,
|
|
127
|
+
totalRecords: cachedPage.totalMeta?.totalRecords
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Start timing only for actual API calls (not cache hits)
|
|
134
|
+
this.metricsManager.timeEvent(_constants3.METRIC_EVENT_NAMES.ENTRYPOINT_FETCH_SUCCESS);
|
|
135
|
+
try {
|
|
136
|
+
// Build query parameters
|
|
137
|
+
const queryParams = new URLSearchParams({
|
|
138
|
+
page: page.toString(),
|
|
139
|
+
pageSize: pageSize.toString(),
|
|
140
|
+
sortOrder
|
|
141
|
+
});
|
|
142
|
+
if (search) queryParams.append('search', search);
|
|
143
|
+
if (filter) queryParams.append('filter', filter);
|
|
144
|
+
if (attributes) queryParams.append('attributes', attributes);
|
|
145
|
+
if (sortBy) queryParams.append('sortBy', sortBy);
|
|
146
|
+
const resource = _constants2.endPointMap.entryPointList(orgId, queryParams.toString());
|
|
147
|
+
_loggerProxy.default.log(`Making API request to fetch entry points - resource: ${resource}, service: ${_constants.WCC_API_GATEWAY}`, {
|
|
148
|
+
module: 'EntryPoint',
|
|
149
|
+
method: 'getEntryPoints'
|
|
150
|
+
});
|
|
151
|
+
const response = await this.webexRequest.request({
|
|
152
|
+
service: _constants.WCC_API_GATEWAY,
|
|
153
|
+
resource,
|
|
154
|
+
method: _types.HTTP_METHODS.GET
|
|
155
|
+
});
|
|
156
|
+
const duration = Date.now() - startTime;
|
|
157
|
+
const recordCount = response.body?.data?.length || 0;
|
|
158
|
+
const totalRecords = response.body?.meta?.totalRecords;
|
|
159
|
+
_loggerProxy.default.log(`Successfully retrieved ${recordCount} entry points`, {
|
|
160
|
+
module: 'EntryPoint',
|
|
161
|
+
method: 'getEntryPoints',
|
|
162
|
+
data: {
|
|
163
|
+
statusCode: response.statusCode,
|
|
164
|
+
duration,
|
|
165
|
+
recordCount,
|
|
166
|
+
totalRecords,
|
|
167
|
+
isSearchRequest,
|
|
168
|
+
page,
|
|
169
|
+
pageSize
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
// Only track metrics for search requests or first page loads to reduce metric volume
|
|
174
|
+
if (isSearchRequest || page === 0) {
|
|
175
|
+
this.metricsManager.trackEvent(_constants3.METRIC_EVENT_NAMES.ENTRYPOINT_FETCH_SUCCESS, {
|
|
176
|
+
orgId,
|
|
177
|
+
statusCode: response.statusCode,
|
|
178
|
+
recordCount,
|
|
179
|
+
totalRecords,
|
|
180
|
+
isSearchRequest,
|
|
181
|
+
isFirstPage: page === 0
|
|
182
|
+
}, ['behavioral']);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// Cache the page data for simple pagination (no search/filter/attributes/sort)
|
|
186
|
+
if (this.pageCache.canUseCache({
|
|
187
|
+
search,
|
|
188
|
+
filter,
|
|
189
|
+
attributes,
|
|
190
|
+
sortBy
|
|
191
|
+
}) && response.body?.data) {
|
|
192
|
+
const cacheKey = this.pageCache.buildCacheKey(orgId, page, pageSize);
|
|
193
|
+
this.pageCache.cachePage(cacheKey, response.body.data, response.body.meta);
|
|
194
|
+
_loggerProxy.default.log('Cached entry points data for future requests', {
|
|
195
|
+
module: 'EntryPoint',
|
|
196
|
+
method: 'getEntryPoints',
|
|
197
|
+
data: {
|
|
198
|
+
cacheKey,
|
|
199
|
+
recordCount
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
return response.body;
|
|
204
|
+
} catch (error) {
|
|
205
|
+
const errorData = {
|
|
206
|
+
orgId,
|
|
207
|
+
error: error instanceof Error ? error.message : String(error),
|
|
208
|
+
isSearchRequest,
|
|
209
|
+
page,
|
|
210
|
+
pageSize
|
|
211
|
+
};
|
|
212
|
+
_loggerProxy.default.error(`Failed to fetch entry points`, {
|
|
213
|
+
module: 'EntryPoint',
|
|
214
|
+
method: 'getEntryPoints',
|
|
215
|
+
data: errorData,
|
|
216
|
+
error
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
// Track all failures for troubleshooting
|
|
220
|
+
this.metricsManager.trackEvent(_constants3.METRIC_EVENT_NAMES.ENTRYPOINT_FETCH_FAILED, errorData, ['behavioral']);
|
|
221
|
+
throw error;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
exports.EntryPoint = EntryPoint;
|
|
226
|
+
var _default = exports.default = EntryPoint;
|
|
227
|
+
//# sourceMappingURL=EntryPoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_types","require","_loggerProxy","_interopRequireDefault","_WebexRequest","_PageCache","_interopRequireWildcard","_MetricsManager","_constants","_constants2","_constants3","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","obj","EntryPoint","constructor","webex","webexRequest","WebexRequest","getInstance","pageCache","PageCache","metricsManager","MetricsManager","getEntryPoints","params","startTime","Date","now","page","PAGINATION_DEFAULTS","PAGE","pageSize","PAGE_SIZE","search","filter","attributes","sortBy","sortOrder","orgId","credentials","getOrgId","isSearchRequest","LoggerProxy","info","module","method","canUseCache","cacheKey","buildCacheKey","cachedPage","getCachedPage","duration","log","data","length","meta","totalPages","totalMeta","totalRecords","timeEvent","METRIC_EVENT_NAMES","ENTRYPOINT_FETCH_SUCCESS","queryParams","URLSearchParams","toString","append","resource","endPointMap","entryPointList","WCC_API_GATEWAY","response","request","service","HTTP_METHODS","GET","recordCount","body","statusCode","trackEvent","isFirstPage","cachePage","error","errorData","Error","message","String","ENTRYPOINT_FETCH_FAILED","exports","_default"],"sources":["EntryPoint.ts"],"sourcesContent":["import {HTTP_METHODS, WebexSDK} from '../types';\nimport type {EntryPointRecord, EntryPointListResponse, EntryPointSearchParams} from '../types';\nimport LoggerProxy from '../logger-proxy';\nimport WebexRequest from './core/WebexRequest';\nimport PageCache, {PAGINATION_DEFAULTS} from '../utils/PageCache';\nimport MetricsManager from '../metrics/MetricsManager';\nimport {WCC_API_GATEWAY} from './constants';\nimport {endPointMap} from './config/constants';\nimport {METRIC_EVENT_NAMES} from '../metrics/constants';\n\n/**\n * EntryPoint class for managing Webex Contact Center entry points.\n * Provides functionality to fetch, search, and paginate through entry points.\n *\n * @class EntryPoint\n * @public\n * @example\n * ```typescript\n * import Webex from 'webex';\n *\n * const webex = new Webex({ credentials: 'YOUR_ACCESS_TOKEN' });\n * const cc = webex.cc;\n *\n * // Register and login first\n * await cc.register();\n * await cc.stationLogin({ teamId: 'team123', loginOption: 'BROWSER' });\n *\n * // Get EntryPoint API instance from ContactCenter\n * const entryPointAPI = cc.entryPoint;\n *\n * // Get all entry points with pagination\n * const response = await entryPointAPI.getEntryPoints({\n * page: 0,\n * pageSize: 50\n * });\n *\n * // Search for specific entry points\n * const searchResults = await entryPointAPI.searchEntryPoints({\n * search: 'support',\n * filter: 'type==\"voice\"'\n * });\n * ```\n */\nexport class EntryPoint {\n private webexRequest: WebexRequest;\n private webex: WebexSDK;\n private metricsManager: MetricsManager;\n\n // Page cache using the common utility\n private pageCache: PageCache<EntryPointRecord>;\n\n /**\n * Creates an instance of EntryPoint\n * @param {WebexSDK} webex - The Webex SDK instance\n * @public\n */\n constructor(webex: WebexSDK) {\n this.webex = webex;\n this.webexRequest = WebexRequest.getInstance({webex});\n this.pageCache = new PageCache<EntryPointRecord>('EntryPoint');\n this.metricsManager = MetricsManager.getInstance({webex});\n }\n\n /**\n * Fetches entry points for the organization with pagination support\n * @param {EntryPointSearchParams} [params] - Search and pagination parameters\n * @returns {Promise<EntryPointListResponse>} Promise resolving to paginated entry points\n * @throws {Error} If the API call fails\n * @public\n * @example\n * ```typescript\n * // Get first page of entry points\n * const response = await entryPointAPI.getEntryPoints();\n *\n * // Get specific page with custom page size\n * const response = await entryPointAPI.getEntryPoints({\n * page: 2,\n * pageSize: 25\n * });\n * ```\n */\n public async getEntryPoints(\n params: EntryPointSearchParams = {}\n ): Promise<EntryPointListResponse> {\n const startTime = Date.now();\n const {\n page = PAGINATION_DEFAULTS.PAGE,\n pageSize = PAGINATION_DEFAULTS.PAGE_SIZE,\n search,\n filter,\n attributes,\n sortBy,\n sortOrder = 'asc',\n } = params;\n\n const orgId = this.webex.credentials.getOrgId();\n const isSearchRequest = !!(search || filter || attributes || sortBy);\n\n LoggerProxy.info(\n `Fetching entry points - orgId: ${orgId}, page: ${page}, pageSize: ${pageSize}, isSearchRequest: ${isSearchRequest}`,\n {\n module: 'EntryPoint',\n method: 'getEntryPoints',\n }\n );\n\n // Check if we can use cache for simple pagination (no search/filter/attributes/sort)\n if (this.pageCache.canUseCache({search, filter, attributes, sortBy})) {\n const cacheKey = this.pageCache.buildCacheKey(orgId, page, pageSize);\n const cachedPage = this.pageCache.getCachedPage(cacheKey);\n\n if (cachedPage) {\n const duration = Date.now() - startTime;\n\n LoggerProxy.log(\n `Returning page ${page} from cache - cacheHit: true, duration: ${duration}ms, recordCount: ${cachedPage.data.length}, pageSize: ${pageSize}`,\n {\n module: 'EntryPoint',\n method: 'getEntryPoints',\n }\n );\n\n return {\n data: cachedPage.data,\n meta: {\n page,\n pageSize,\n totalPages: cachedPage.totalMeta?.totalPages,\n totalRecords: cachedPage.totalMeta?.totalRecords,\n },\n };\n }\n }\n\n // Start timing only for actual API calls (not cache hits)\n this.metricsManager.timeEvent(METRIC_EVENT_NAMES.ENTRYPOINT_FETCH_SUCCESS);\n\n try {\n // Build query parameters\n const queryParams = new URLSearchParams({\n page: page.toString(),\n pageSize: pageSize.toString(),\n sortOrder,\n });\n\n if (search) queryParams.append('search', search);\n if (filter) queryParams.append('filter', filter);\n if (attributes) queryParams.append('attributes', attributes);\n if (sortBy) queryParams.append('sortBy', sortBy);\n\n const resource = endPointMap.entryPointList(orgId, queryParams.toString());\n\n LoggerProxy.log(\n `Making API request to fetch entry points - resource: ${resource}, service: ${WCC_API_GATEWAY}`,\n {\n module: 'EntryPoint',\n method: 'getEntryPoints',\n }\n );\n\n const response = await this.webexRequest.request({\n service: WCC_API_GATEWAY,\n resource,\n method: HTTP_METHODS.GET,\n });\n\n const duration = Date.now() - startTime;\n\n const recordCount = response.body?.data?.length || 0;\n const totalRecords = response.body?.meta?.totalRecords;\n\n LoggerProxy.log(`Successfully retrieved ${recordCount} entry points`, {\n module: 'EntryPoint',\n method: 'getEntryPoints',\n data: {\n statusCode: response.statusCode,\n duration,\n recordCount,\n totalRecords,\n isSearchRequest,\n page,\n pageSize,\n },\n });\n\n // Only track metrics for search requests or first page loads to reduce metric volume\n if (isSearchRequest || page === 0) {\n this.metricsManager.trackEvent(\n METRIC_EVENT_NAMES.ENTRYPOINT_FETCH_SUCCESS,\n {\n orgId,\n statusCode: response.statusCode,\n recordCount,\n totalRecords,\n isSearchRequest,\n isFirstPage: page === 0,\n },\n ['behavioral']\n );\n }\n\n // Cache the page data for simple pagination (no search/filter/attributes/sort)\n if (this.pageCache.canUseCache({search, filter, attributes, sortBy}) && response.body?.data) {\n const cacheKey = this.pageCache.buildCacheKey(orgId, page, pageSize);\n this.pageCache.cachePage(cacheKey, response.body.data, response.body.meta);\n\n LoggerProxy.log('Cached entry points data for future requests', {\n module: 'EntryPoint',\n method: 'getEntryPoints',\n data: {cacheKey, recordCount},\n });\n }\n\n return response.body;\n } catch (error) {\n const errorData = {\n orgId,\n error: error instanceof Error ? error.message : String(error),\n isSearchRequest,\n page,\n pageSize,\n };\n\n LoggerProxy.error(`Failed to fetch entry points`, {\n module: 'EntryPoint',\n method: 'getEntryPoints',\n data: errorData,\n error,\n });\n\n // Track all failures for troubleshooting\n this.metricsManager.trackEvent(METRIC_EVENT_NAMES.ENTRYPOINT_FETCH_FAILED, errorData, [\n 'behavioral',\n ]);\n\n throw error;\n }\n }\n}\n\nexport default EntryPoint;\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAEA,IAAAC,YAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,aAAA,GAAAD,sBAAA,CAAAF,OAAA;AACA,IAAAI,UAAA,GAAAC,uBAAA,CAAAL,OAAA;AACA,IAAAM,eAAA,GAAAJ,sBAAA,CAAAF,OAAA;AACA,IAAAO,UAAA,GAAAP,OAAA;AACA,IAAAQ,WAAA,GAAAR,OAAA;AACA,IAAAS,WAAA,GAAAT,OAAA;AAAwD,SAAAU,yBAAAC,CAAA,6BAAAC,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAN,wBAAAM,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAK,OAAA,EAAAL,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,UAAAG,CAAA,CAAAI,GAAA,CAAAP,CAAA,OAAAQ,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,CAAA,IAAAd,CAAA,oBAAAc,CAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAjB,CAAA,EAAAc,CAAA,SAAAI,CAAA,GAAAR,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAb,CAAA,EAAAc,CAAA,UAAAI,CAAA,KAAAA,CAAA,CAAAX,GAAA,IAAAW,CAAA,CAAAC,GAAA,IAAAR,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAI,CAAA,IAAAV,CAAA,CAAAM,CAAA,IAAAd,CAAA,CAAAc,CAAA,YAAAN,CAAA,CAAAH,OAAA,GAAAL,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAgB,GAAA,CAAAnB,CAAA,EAAAQ,CAAA,GAAAA,CAAA;AAAA,SAAAjB,uBAAA6B,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAhB,UAAA,GAAAgB,GAAA,KAAAf,OAAA,EAAAe,GAAA;AAExD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,UAAU,CAAC;EAKtB;;EAGA;AACF;AACA;AACA;AACA;EACEC,WAAWA,CAACC,KAAe,EAAE;IAC3B,IAAI,CAACA,KAAK,GAAGA,KAAK;IAClB,IAAI,CAACC,YAAY,GAAGC,qBAAY,CAACC,WAAW,CAAC;MAACH;IAAK,CAAC,CAAC;IACrD,IAAI,CAACI,SAAS,GAAG,IAAIC,kBAAS,CAAmB,YAAY,CAAC;IAC9D,IAAI,CAACC,cAAc,GAAGC,uBAAc,CAACJ,WAAW,CAAC;MAACH;IAAK,CAAC,CAAC;EAC3D;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,MAAaQ,cAAcA,CACzBC,MAA8B,GAAG,CAAC,CAAC,EACF;IACjC,MAAMC,SAAS,GAAGC,IAAI,CAACC,GAAG,CAAC,CAAC;IAC5B,MAAM;MACJC,IAAI,GAAGC,8BAAmB,CAACC,IAAI;MAC/BC,QAAQ,GAAGF,8BAAmB,CAACG,SAAS;MACxCC,MAAM;MACNC,MAAM;MACNC,UAAU;MACVC,MAAM;MACNC,SAAS,GAAG;IACd,CAAC,GAAGb,MAAM;IAEV,MAAMc,KAAK,GAAG,IAAI,CAACvB,KAAK,CAACwB,WAAW,CAACC,QAAQ,CAAC,CAAC;IAC/C,MAAMC,eAAe,GAAG,CAAC,EAAER,MAAM,IAAIC,MAAM,IAAIC,UAAU,IAAIC,MAAM,CAAC;IAEpEM,oBAAW,CAACC,IAAI,CACb,kCAAiCL,KAAM,WAAUV,IAAK,eAAcG,QAAS,sBAAqBU,eAAgB,EAAC,EACpH;MACEG,MAAM,EAAE,YAAY;MACpBC,MAAM,EAAE;IACV,CACF,CAAC;;IAED;IACA,IAAI,IAAI,CAAC1B,SAAS,CAAC2B,WAAW,CAAC;MAACb,MAAM;MAAEC,MAAM;MAAEC,UAAU;MAAEC;IAAM,CAAC,CAAC,EAAE;MACpE,MAAMW,QAAQ,GAAG,IAAI,CAAC5B,SAAS,CAAC6B,aAAa,CAACV,KAAK,EAAEV,IAAI,EAAEG,QAAQ,CAAC;MACpE,MAAMkB,UAAU,GAAG,IAAI,CAAC9B,SAAS,CAAC+B,aAAa,CAACH,QAAQ,CAAC;MAEzD,IAAIE,UAAU,EAAE;QACd,MAAME,QAAQ,GAAGzB,IAAI,CAACC,GAAG,CAAC,CAAC,GAAGF,SAAS;QAEvCiB,oBAAW,CAACU,GAAG,CACZ,kBAAiBxB,IAAK,2CAA0CuB,QAAS,oBAAmBF,UAAU,CAACI,IAAI,CAACC,MAAO,eAAcvB,QAAS,EAAC,EAC5I;UACEa,MAAM,EAAE,YAAY;UACpBC,MAAM,EAAE;QACV,CACF,CAAC;QAED,OAAO;UACLQ,IAAI,EAAEJ,UAAU,CAACI,IAAI;UACrBE,IAAI,EAAE;YACJ3B,IAAI;YACJG,QAAQ;YACRyB,UAAU,EAAEP,UAAU,CAACQ,SAAS,EAAED,UAAU;YAC5CE,YAAY,EAAET,UAAU,CAACQ,SAAS,EAAEC;UACtC;QACF,CAAC;MACH;IACF;;IAEA;IACA,IAAI,CAACrC,cAAc,CAACsC,SAAS,CAACC,8BAAkB,CAACC,wBAAwB,CAAC;IAE1E,IAAI;MACF;MACA,MAAMC,WAAW,GAAG,IAAIC,eAAe,CAAC;QACtCnC,IAAI,EAAEA,IAAI,CAACoC,QAAQ,CAAC,CAAC;QACrBjC,QAAQ,EAAEA,QAAQ,CAACiC,QAAQ,CAAC,CAAC;QAC7B3B;MACF,CAAC,CAAC;MAEF,IAAIJ,MAAM,EAAE6B,WAAW,CAACG,MAAM,CAAC,QAAQ,EAAEhC,MAAM,CAAC;MAChD,IAAIC,MAAM,EAAE4B,WAAW,CAACG,MAAM,CAAC,QAAQ,EAAE/B,MAAM,CAAC;MAChD,IAAIC,UAAU,EAAE2B,WAAW,CAACG,MAAM,CAAC,YAAY,EAAE9B,UAAU,CAAC;MAC5D,IAAIC,MAAM,EAAE0B,WAAW,CAACG,MAAM,CAAC,QAAQ,EAAE7B,MAAM,CAAC;MAEhD,MAAM8B,QAAQ,GAAGC,uBAAW,CAACC,cAAc,CAAC9B,KAAK,EAAEwB,WAAW,CAACE,QAAQ,CAAC,CAAC,CAAC;MAE1EtB,oBAAW,CAACU,GAAG,CACZ,wDAAuDc,QAAS,cAAaG,0BAAgB,EAAC,EAC/F;QACEzB,MAAM,EAAE,YAAY;QACpBC,MAAM,EAAE;MACV,CACF,CAAC;MAED,MAAMyB,QAAQ,GAAG,MAAM,IAAI,CAACtD,YAAY,CAACuD,OAAO,CAAC;QAC/CC,OAAO,EAAEH,0BAAe;QACxBH,QAAQ;QACRrB,MAAM,EAAE4B,mBAAY,CAACC;MACvB,CAAC,CAAC;MAEF,MAAMvB,QAAQ,GAAGzB,IAAI,CAACC,GAAG,CAAC,CAAC,GAAGF,SAAS;MAEvC,MAAMkD,WAAW,GAAGL,QAAQ,CAACM,IAAI,EAAEvB,IAAI,EAAEC,MAAM,IAAI,CAAC;MACpD,MAAMI,YAAY,GAAGY,QAAQ,CAACM,IAAI,EAAErB,IAAI,EAAEG,YAAY;MAEtDhB,oBAAW,CAACU,GAAG,CAAE,0BAAyBuB,WAAY,eAAc,EAAE;QACpE/B,MAAM,EAAE,YAAY;QACpBC,MAAM,EAAE,gBAAgB;QACxBQ,IAAI,EAAE;UACJwB,UAAU,EAAEP,QAAQ,CAACO,UAAU;UAC/B1B,QAAQ;UACRwB,WAAW;UACXjB,YAAY;UACZjB,eAAe;UACfb,IAAI;UACJG;QACF;MACF,CAAC,CAAC;;MAEF;MACA,IAAIU,eAAe,IAAIb,IAAI,KAAK,CAAC,EAAE;QACjC,IAAI,CAACP,cAAc,CAACyD,UAAU,CAC5BlB,8BAAkB,CAACC,wBAAwB,EAC3C;UACEvB,KAAK;UACLuC,UAAU,EAAEP,QAAQ,CAACO,UAAU;UAC/BF,WAAW;UACXjB,YAAY;UACZjB,eAAe;UACfsC,WAAW,EAAEnD,IAAI,KAAK;QACxB,CAAC,EACD,CAAC,YAAY,CACf,CAAC;MACH;;MAEA;MACA,IAAI,IAAI,CAACT,SAAS,CAAC2B,WAAW,CAAC;QAACb,MAAM;QAAEC,MAAM;QAAEC,UAAU;QAAEC;MAAM,CAAC,CAAC,IAAIkC,QAAQ,CAACM,IAAI,EAAEvB,IAAI,EAAE;QAC3F,MAAMN,QAAQ,GAAG,IAAI,CAAC5B,SAAS,CAAC6B,aAAa,CAACV,KAAK,EAAEV,IAAI,EAAEG,QAAQ,CAAC;QACpE,IAAI,CAACZ,SAAS,CAAC6D,SAAS,CAACjC,QAAQ,EAAEuB,QAAQ,CAACM,IAAI,CAACvB,IAAI,EAAEiB,QAAQ,CAACM,IAAI,CAACrB,IAAI,CAAC;QAE1Eb,oBAAW,CAACU,GAAG,CAAC,8CAA8C,EAAE;UAC9DR,MAAM,EAAE,YAAY;UACpBC,MAAM,EAAE,gBAAgB;UACxBQ,IAAI,EAAE;YAACN,QAAQ;YAAE4B;UAAW;QAC9B,CAAC,CAAC;MACJ;MAEA,OAAOL,QAAQ,CAACM,IAAI;IACtB,CAAC,CAAC,OAAOK,KAAK,EAAE;MACd,MAAMC,SAAS,GAAG;QAChB5C,KAAK;QACL2C,KAAK,EAAEA,KAAK,YAAYE,KAAK,GAAGF,KAAK,CAACG,OAAO,GAAGC,MAAM,CAACJ,KAAK,CAAC;QAC7DxC,eAAe;QACfb,IAAI;QACJG;MACF,CAAC;MAEDW,oBAAW,CAACuC,KAAK,CAAE,8BAA6B,EAAE;QAChDrC,MAAM,EAAE,YAAY;QACpBC,MAAM,EAAE,gBAAgB;QACxBQ,IAAI,EAAE6B,SAAS;QACfD;MACF,CAAC,CAAC;;MAEF;MACA,IAAI,CAAC5D,cAAc,CAACyD,UAAU,CAAClB,8BAAkB,CAAC0B,uBAAuB,EAAEJ,SAAS,EAAE,CACpF,YAAY,CACb,CAAC;MAEF,MAAMD,KAAK;IACb;EACF;AACF;AAACM,OAAA,CAAA1E,UAAA,GAAAA,UAAA;AAAA,IAAA2E,QAAA,GAAAD,OAAA,CAAA1F,OAAA,GAEcgB,UAAU"}
|