@webex/contact-center 3.12.0-next.8 → 3.12.0-next.81

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.
Files changed (205) hide show
  1. package/AGENTS.md +438 -0
  2. package/ai-docs/README.md +131 -0
  3. package/ai-docs/RULES.md +455 -0
  4. package/ai-docs/patterns/event-driven-patterns.md +485 -0
  5. package/ai-docs/patterns/testing-patterns.md +480 -0
  6. package/ai-docs/patterns/typescript-patterns.md +365 -0
  7. package/ai-docs/templates/README.md +102 -0
  8. package/ai-docs/templates/documentation/create-agents-md.md +240 -0
  9. package/ai-docs/templates/documentation/create-architecture-md.md +295 -0
  10. package/ai-docs/templates/existing-service/bug-fix.md +254 -0
  11. package/ai-docs/templates/existing-service/feature-enhancement.md +450 -0
  12. package/ai-docs/templates/new-method/00-master.md +80 -0
  13. package/ai-docs/templates/new-method/01-requirements.md +232 -0
  14. package/ai-docs/templates/new-method/02-implementation.md +295 -0
  15. package/ai-docs/templates/new-method/03-tests.md +201 -0
  16. package/ai-docs/templates/new-method/04-validation.md +141 -0
  17. package/ai-docs/templates/new-service/00-master.md +109 -0
  18. package/ai-docs/templates/new-service/01-pre-questions.md +159 -0
  19. package/ai-docs/templates/new-service/02-code-generation.md +346 -0
  20. package/ai-docs/templates/new-service/03-integration.md +178 -0
  21. package/ai-docs/templates/new-service/04-test-generation.md +205 -0
  22. package/ai-docs/templates/new-service/05-validation.md +145 -0
  23. package/dist/cc.js +265 -29
  24. package/dist/cc.js.map +1 -1
  25. package/dist/config.js +6 -0
  26. package/dist/config.js.map +1 -1
  27. package/dist/constants.js +16 -1
  28. package/dist/constants.js.map +1 -1
  29. package/dist/index.js +20 -5
  30. package/dist/index.js.map +1 -1
  31. package/dist/metrics/behavioral-events.js +101 -0
  32. package/dist/metrics/behavioral-events.js.map +1 -1
  33. package/dist/metrics/constants.js +23 -4
  34. package/dist/metrics/constants.js.map +1 -1
  35. package/dist/services/ApiAiAssistant.js +74 -3
  36. package/dist/services/ApiAiAssistant.js.map +1 -1
  37. package/dist/services/UserPreference.js +427 -0
  38. package/dist/services/UserPreference.js.map +1 -0
  39. package/dist/services/config/Util.js +3 -3
  40. package/dist/services/config/Util.js.map +1 -1
  41. package/dist/services/config/constants.js +23 -2
  42. package/dist/services/config/constants.js.map +1 -1
  43. package/dist/services/config/types.js +49 -9
  44. package/dist/services/config/types.js.map +1 -1
  45. package/dist/services/core/Err.js.map +1 -1
  46. package/dist/services/core/Utils.js +107 -32
  47. package/dist/services/core/Utils.js.map +1 -1
  48. package/dist/services/core/websocket/WebSocketManager.js +2 -1
  49. package/dist/services/core/websocket/WebSocketManager.js.map +1 -1
  50. package/dist/services/core/websocket/types.js.map +1 -1
  51. package/dist/services/index.js +1 -1
  52. package/dist/services/index.js.map +1 -1
  53. package/dist/services/task/Task.js +688 -0
  54. package/dist/services/task/Task.js.map +1 -0
  55. package/dist/services/task/TaskFactory.js +45 -0
  56. package/dist/services/task/TaskFactory.js.map +1 -0
  57. package/dist/services/task/TaskManager.js +725 -526
  58. package/dist/services/task/TaskManager.js.map +1 -1
  59. package/dist/services/task/TaskUtils.js +162 -26
  60. package/dist/services/task/TaskUtils.js.map +1 -1
  61. package/dist/services/task/constants.js +9 -2
  62. package/dist/services/task/constants.js.map +1 -1
  63. package/dist/services/task/dialer.js +78 -0
  64. package/dist/services/task/dialer.js.map +1 -1
  65. package/dist/services/task/digital/Digital.js +77 -0
  66. package/dist/services/task/digital/Digital.js.map +1 -0
  67. package/dist/services/task/state-machine/TaskStateMachine.js +837 -0
  68. package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -0
  69. package/dist/services/task/state-machine/actions.js +543 -0
  70. package/dist/services/task/state-machine/actions.js.map +1 -0
  71. package/dist/services/task/state-machine/constants.js +161 -0
  72. package/dist/services/task/state-machine/constants.js.map +1 -0
  73. package/dist/services/task/state-machine/guards.js +340 -0
  74. package/dist/services/task/state-machine/guards.js.map +1 -0
  75. package/dist/services/task/state-machine/index.js +53 -0
  76. package/dist/services/task/state-machine/index.js.map +1 -0
  77. package/dist/services/task/state-machine/types.js +54 -0
  78. package/dist/services/task/state-machine/types.js.map +1 -0
  79. package/dist/services/task/state-machine/uiControlsComputer.js +553 -0
  80. package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -0
  81. package/dist/services/task/taskDataNormalizer.js +99 -0
  82. package/dist/services/task/taskDataNormalizer.js.map +1 -0
  83. package/dist/services/task/types.js +212 -4
  84. package/dist/services/task/types.js.map +1 -1
  85. package/dist/services/task/voice/Voice.js +1042 -0
  86. package/dist/services/task/voice/Voice.js.map +1 -0
  87. package/dist/services/task/voice/WebRTC.js +149 -0
  88. package/dist/services/task/voice/WebRTC.js.map +1 -0
  89. package/dist/types/cc.d.ts +94 -1
  90. package/dist/types/config.d.ts +6 -0
  91. package/dist/types/constants.d.ts +16 -1
  92. package/dist/types/index.d.ts +21 -6
  93. package/dist/types/metrics/constants.d.ts +19 -1
  94. package/dist/types/services/ApiAiAssistant.d.ts +11 -3
  95. package/dist/types/services/UserPreference.d.ts +118 -0
  96. package/dist/types/services/config/constants.d.ts +21 -0
  97. package/dist/types/services/config/types.d.ts +171 -10
  98. package/dist/types/services/core/Err.d.ts +4 -0
  99. package/dist/types/services/core/Utils.d.ts +33 -13
  100. package/dist/types/services/core/websocket/WebSocketManager.d.ts +1 -0
  101. package/dist/types/services/core/websocket/types.d.ts +1 -1
  102. package/dist/types/services/index.d.ts +1 -1
  103. package/dist/types/services/task/Task.d.ts +157 -0
  104. package/dist/types/services/task/TaskFactory.d.ts +12 -0
  105. package/dist/types/services/task/TaskUtils.d.ts +46 -2
  106. package/dist/types/services/task/constants.d.ts +7 -0
  107. package/dist/types/services/task/dialer.d.ts +30 -0
  108. package/dist/types/services/task/digital/Digital.d.ts +22 -0
  109. package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +1144 -0
  110. package/dist/types/services/task/state-machine/actions.d.ts +10 -0
  111. package/dist/types/services/task/state-machine/constants.d.ts +107 -0
  112. package/dist/types/services/task/state-machine/guards.d.ts +90 -0
  113. package/dist/types/services/task/state-machine/index.d.ts +13 -0
  114. package/dist/types/services/task/state-machine/types.d.ts +267 -0
  115. package/dist/types/services/task/state-machine/uiControlsComputer.d.ts +9 -0
  116. package/dist/types/services/task/taskDataNormalizer.d.ts +10 -0
  117. package/dist/types/services/task/types.d.ts +603 -66
  118. package/dist/types/services/task/voice/Voice.d.ts +184 -0
  119. package/dist/types/services/task/voice/WebRTC.d.ts +53 -0
  120. package/dist/types/types.d.ts +94 -0
  121. package/dist/types/webex.d.ts +1 -0
  122. package/dist/types.js +85 -0
  123. package/dist/types.js.map +1 -1
  124. package/dist/webex.js +14 -2
  125. package/dist/webex.js.map +1 -1
  126. package/package.json +15 -12
  127. package/src/cc.ts +329 -30
  128. package/src/config.ts +6 -0
  129. package/src/constants.ts +16 -1
  130. package/src/index.ts +23 -5
  131. package/src/metrics/ai-docs/AGENTS.md +348 -0
  132. package/src/metrics/ai-docs/ARCHITECTURE.md +336 -0
  133. package/src/metrics/behavioral-events.ts +106 -0
  134. package/src/metrics/constants.ts +23 -4
  135. package/src/services/ApiAiAssistant.ts +104 -3
  136. package/src/services/UserPreference.ts +509 -0
  137. package/src/services/agent/ai-docs/AGENTS.md +238 -0
  138. package/src/services/agent/ai-docs/ARCHITECTURE.md +302 -0
  139. package/src/services/ai-docs/AGENTS.md +384 -0
  140. package/src/services/config/Util.ts +3 -3
  141. package/src/services/config/ai-docs/AGENTS.md +253 -0
  142. package/src/services/config/ai-docs/ARCHITECTURE.md +424 -0
  143. package/src/services/config/constants.ts +25 -1
  144. package/src/services/config/types.ts +174 -11
  145. package/src/services/core/Err.ts +2 -0
  146. package/src/services/core/Utils.ts +123 -37
  147. package/src/services/core/ai-docs/AGENTS.md +379 -0
  148. package/src/services/core/ai-docs/ARCHITECTURE.md +696 -0
  149. package/src/services/core/websocket/WebSocketManager.ts +2 -0
  150. package/src/services/core/websocket/types.ts +1 -1
  151. package/src/services/index.ts +1 -1
  152. package/src/services/task/Task.ts +837 -0
  153. package/src/services/task/TaskFactory.ts +55 -0
  154. package/src/services/task/TaskManager.ts +738 -613
  155. package/src/services/task/TaskUtils.ts +205 -25
  156. package/src/services/task/ai-docs/AGENTS.md +455 -0
  157. package/src/services/task/ai-docs/ARCHITECTURE.md +585 -0
  158. package/src/services/task/constants.ts +7 -0
  159. package/src/services/task/dialer.ts +80 -0
  160. package/src/services/task/digital/Digital.ts +95 -0
  161. package/src/services/task/state-machine/TaskStateMachine.ts +1077 -0
  162. package/src/services/task/state-machine/actions.ts +685 -0
  163. package/src/services/task/state-machine/ai-docs/AGENTS.md +495 -0
  164. package/src/services/task/state-machine/ai-docs/ARCHITECTURE.md +1135 -0
  165. package/src/services/task/state-machine/constants.ts +172 -0
  166. package/src/services/task/state-machine/guards.ts +406 -0
  167. package/src/services/task/state-machine/index.ts +28 -0
  168. package/src/services/task/state-machine/types.ts +241 -0
  169. package/src/services/task/state-machine/uiControlsComputer.ts +867 -0
  170. package/src/services/task/taskDataNormalizer.ts +137 -0
  171. package/src/services/task/types.ts +710 -71
  172. package/src/services/task/voice/Voice.ts +1267 -0
  173. package/src/services/task/voice/WebRTC.ts +187 -0
  174. package/src/types.ts +122 -2
  175. package/src/utils/AGENTS.md +276 -0
  176. package/src/webex.js +2 -0
  177. package/test/unit/spec/cc.ts +343 -23
  178. package/test/unit/spec/logger-proxy.ts +70 -0
  179. package/test/unit/spec/services/ApiAiAssistant.ts +122 -17
  180. package/test/unit/spec/services/UserPreference.ts +401 -0
  181. package/test/unit/spec/services/WebCallingService.ts +7 -1
  182. package/test/unit/spec/services/config/index.ts +30 -30
  183. package/test/unit/spec/services/core/Utils.ts +425 -8
  184. package/test/unit/spec/services/core/websocket/WebSocketManager.ts +66 -40
  185. package/test/unit/spec/services/task/AutoWrapup.ts +63 -0
  186. package/test/unit/spec/services/task/Task.ts +477 -0
  187. package/test/unit/spec/services/task/TaskFactory.ts +62 -0
  188. package/test/unit/spec/services/task/TaskManager.ts +832 -1702
  189. package/test/unit/spec/services/task/TaskUtils.ts +206 -0
  190. package/test/unit/spec/services/task/dialer.ts +190 -0
  191. package/test/unit/spec/services/task/digital/Digital.ts +105 -0
  192. package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +1825 -0
  193. package/test/unit/spec/services/task/state-machine/guards.ts +479 -0
  194. package/test/unit/spec/services/task/state-machine/types.ts +18 -0
  195. package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +2020 -0
  196. package/test/unit/spec/services/task/taskTestUtils.ts +87 -0
  197. package/test/unit/spec/services/task/voice/Voice.ts +631 -0
  198. package/test/unit/spec/services/task/voice/WebRTC.ts +235 -0
  199. package/umd/contact-center.min.js +2 -2
  200. package/umd/contact-center.min.js.map +1 -1
  201. package/dist/services/task/index.js +0 -1525
  202. package/dist/services/task/index.js.map +0 -1
  203. package/dist/types/services/task/index.d.ts +0 -650
  204. package/src/services/task/index.ts +0 -1801
  205. package/test/unit/spec/services/task/index.ts +0 -2184
@@ -0,0 +1,509 @@
1
+ import {HTTP_METHODS, WebexSDK} from '../types';
2
+ import type {
3
+ UserPreference as UserPreferenceResponse,
4
+ CreateUserPreferenceRequest,
5
+ UpdateUserPreferenceRequest,
6
+ GetUserPreferenceParams,
7
+ } from './config/types';
8
+ import LoggerProxy from '../logger-proxy';
9
+ import WebexRequest from './core/WebexRequest';
10
+ import MetricsManager from '../metrics/MetricsManager';
11
+ import {WCC_API_GATEWAY} from './constants';
12
+ import {endPointMap} from './config/constants';
13
+ import {METRIC_EVENT_NAMES} from '../metrics/constants';
14
+
15
+ /**
16
+ * UserPreference API class for managing Webex Contact Center user preferences.
17
+ * Provides functionality to get, create, update, and delete user preferences.
18
+ *
19
+ * @class UserPreference
20
+ * @public
21
+ * @example
22
+ * ```typescript
23
+ * import Webex from 'webex';
24
+ *
25
+ * const webex = new Webex({ credentials: 'YOUR_ACCESS_TOKEN' });
26
+ * const cc = webex.cc;
27
+ *
28
+ * // Register and login first
29
+ * await cc.register();
30
+ * await cc.stationLogin({ teamId: 'team123', loginOption: 'BROWSER' });
31
+ *
32
+ * // Get UserPreference API instance from ContactCenter
33
+ * const userPreferenceAPI = cc.userPreference;
34
+ *
35
+ * // Get user preferences for the current user
36
+ * const preferences = await userPreferenceAPI.getUserPreference();
37
+ *
38
+ * // Create new user preferences
39
+ * const newPreferences = await userPreferenceAPI.createUserPreference({
40
+ * userId: 'user123',
41
+ * preferences: { e911Reminder: true }
42
+ * });
43
+ *
44
+ * // Update user preferences
45
+ * const updatedPreferences = await userPreferenceAPI.updateUserPreference('user123', {
46
+ * preferences: { e911Reminder: false }
47
+ * });
48
+ *
49
+ * // Delete user preferences
50
+ * await userPreferenceAPI.deleteUserPreference('user123');
51
+ * ```
52
+ */
53
+ export class UserPreference {
54
+ private webexRequest: WebexRequest;
55
+ private webex: WebexSDK;
56
+ private getUserId: () => string;
57
+ private metricsManager: MetricsManager;
58
+
59
+ /**
60
+ * Creates an instance of UserPreference
61
+ * @param {WebexSDK} webex - The Webex SDK instance
62
+ * @param {() => string} getUserId - Function to get the current user's CI user ID
63
+ * @public
64
+ */
65
+ constructor(webex: WebexSDK, getUserId: () => string) {
66
+ this.webex = webex;
67
+ this.webexRequest = WebexRequest.getInstance({webex});
68
+ this.getUserId = getUserId;
69
+ this.metricsManager = MetricsManager.getInstance({webex});
70
+ }
71
+
72
+ /**
73
+ * Fetches user preferences for a specific user
74
+ * @param {GetUserPreferenceParams} [params] - Optional parameters for fetching preferences
75
+ * @param {string} [params.userId] - User ID to fetch preferences for. Defaults to current user's CI user ID.
76
+ * @param {number} [params.page=0] - Page number (0-indexed). Default: 0
77
+ * @param {number} [params.pageSize=100] - Number of items per page. Default: 100
78
+ * @returns {Promise<UserPreferenceResponse>} Promise resolving to user preferences
79
+ * @throws {Error} If the API call fails
80
+ * @public
81
+ * @example
82
+ * ```typescript
83
+ * // Get preferences for current user
84
+ * const preferences = await userPreferenceAPI.getUserPreference();
85
+ *
86
+ * // Get preferences for a specific user
87
+ * const preferences = await userPreferenceAPI.getUserPreference({ userId: 'user123' });
88
+ *
89
+ * // Get preferences with pagination
90
+ * const preferences = await userPreferenceAPI.getUserPreference({ page: 0, pageSize: 50 });
91
+ * ```
92
+ */
93
+ public async getUserPreference(
94
+ params?: GetUserPreferenceParams
95
+ ): Promise<UserPreferenceResponse> {
96
+ const {userId, page, pageSize} = params || {};
97
+ const targetUserId = userId || this.getUserId();
98
+ const orgId = this.webex.credentials.getOrgId();
99
+
100
+ LoggerProxy.info('Fetching user preferences', {
101
+ module: 'UserPreference',
102
+ method: 'getUserPreference',
103
+ data: {
104
+ orgId,
105
+ userId: targetUserId,
106
+ page,
107
+ pageSize,
108
+ },
109
+ });
110
+
111
+ if (!targetUserId) {
112
+ LoggerProxy.error('getUserPreference called without a valid userId', {
113
+ module: 'UserPreference',
114
+ method: 'getUserPreference',
115
+ data: {
116
+ orgId,
117
+ userId: targetUserId,
118
+ error: 'Missing userId. Ensure user is logged in or provide a userId.',
119
+ },
120
+ });
121
+
122
+ throw new Error('UserPreference: userId is not available.');
123
+ }
124
+
125
+ try {
126
+ let resource = endPointMap.userPreference(orgId, targetUserId);
127
+
128
+ // Build query parameters if provided
129
+ const queryParams: string[] = [];
130
+ if (page !== undefined) queryParams.push(`page=${page}`);
131
+ if (pageSize !== undefined) queryParams.push(`pageSize=${pageSize}`);
132
+ if (queryParams.length > 0) {
133
+ resource = `${resource}?${queryParams.join('&')}`;
134
+ }
135
+
136
+ LoggerProxy.info('Making API request to fetch user preferences', {
137
+ module: 'UserPreference',
138
+ method: 'getUserPreference',
139
+ data: {
140
+ resource,
141
+ service: WCC_API_GATEWAY,
142
+ },
143
+ });
144
+
145
+ this.metricsManager.timeEvent(METRIC_EVENT_NAMES.USER_PREFERENCE_GET_SUCCESS);
146
+ this.metricsManager.timeEvent(METRIC_EVENT_NAMES.USER_PREFERENCE_GET_FAILED);
147
+
148
+ const response = await this.webexRequest.request({
149
+ service: WCC_API_GATEWAY,
150
+ resource,
151
+ method: HTTP_METHODS.GET,
152
+ });
153
+
154
+ LoggerProxy.info('Successfully retrieved user preferences', {
155
+ module: 'UserPreference',
156
+ method: 'getUserPreference',
157
+ data: {
158
+ statusCode: response.statusCode,
159
+ userId: targetUserId,
160
+ },
161
+ });
162
+
163
+ this.metricsManager.trackEvent(
164
+ METRIC_EVENT_NAMES.USER_PREFERENCE_GET_SUCCESS,
165
+ {
166
+ orgId,
167
+ userId: targetUserId,
168
+ statusCode: response.statusCode,
169
+ },
170
+ ['behavioral', 'operational']
171
+ );
172
+
173
+ return response.body;
174
+ } catch (error) {
175
+ const errorData = {
176
+ orgId,
177
+ userId: targetUserId,
178
+ error: error instanceof Error ? error.message : String(error),
179
+ };
180
+
181
+ LoggerProxy.error('Failed to fetch user preferences', {
182
+ module: 'UserPreference',
183
+ method: 'getUserPreference',
184
+ data: errorData,
185
+ error,
186
+ });
187
+
188
+ this.metricsManager.trackEvent(METRIC_EVENT_NAMES.USER_PREFERENCE_GET_FAILED, errorData, [
189
+ 'behavioral',
190
+ 'operational',
191
+ ]);
192
+
193
+ throw error;
194
+ }
195
+ }
196
+
197
+ /**
198
+ * Creates new user preferences
199
+ * @param {CreateUserPreferenceRequest} data - The user preference data to create
200
+ * @returns {Promise<UserPreference>} Promise resolving to created user preferences
201
+ * @throws {Error} If the API call fails
202
+ * @public
203
+ * @example
204
+ * ```typescript
205
+ * const newPreferences = await userPreferenceAPI.createUserPreference({
206
+ * userId: 'user123',
207
+ * preferences: { e911Reminder: true, notificationSettings: { email: true } }
208
+ * });
209
+ * ```
210
+ */
211
+ public async createUserPreference(
212
+ data: CreateUserPreferenceRequest
213
+ ): Promise<UserPreferenceResponse> {
214
+ const orgId = this.webex.credentials.getOrgId();
215
+
216
+ LoggerProxy.info('Creating user preferences', {
217
+ module: 'UserPreference',
218
+ method: 'createUserPreference',
219
+ data: {
220
+ orgId,
221
+ userId: data.userId,
222
+ },
223
+ });
224
+
225
+ if (!data.userId) {
226
+ LoggerProxy.error('createUserPreference called without a valid userId', {
227
+ module: 'UserPreference',
228
+ method: 'createUserPreference',
229
+ data: {
230
+ orgId,
231
+ error: 'Missing userId in request data.',
232
+ },
233
+ });
234
+
235
+ throw new Error('UserPreference: userId is required to create user preferences.');
236
+ }
237
+
238
+ try {
239
+ const resource = endPointMap.userPreferenceCreate(orgId);
240
+
241
+ LoggerProxy.info('Making API request to create user preferences', {
242
+ module: 'UserPreference',
243
+ method: 'createUserPreference',
244
+ data: {
245
+ resource,
246
+ service: WCC_API_GATEWAY,
247
+ },
248
+ });
249
+
250
+ this.metricsManager.timeEvent(METRIC_EVENT_NAMES.USER_PREFERENCE_CREATE_SUCCESS);
251
+ this.metricsManager.timeEvent(METRIC_EVENT_NAMES.USER_PREFERENCE_CREATE_FAILED);
252
+
253
+ const response = await this.webexRequest.request({
254
+ service: WCC_API_GATEWAY,
255
+ resource,
256
+ method: HTTP_METHODS.POST,
257
+ body: data,
258
+ });
259
+
260
+ LoggerProxy.info('Successfully created user preferences', {
261
+ module: 'UserPreference',
262
+ method: 'createUserPreference',
263
+ data: {
264
+ statusCode: response.statusCode,
265
+ userId: data.userId,
266
+ },
267
+ });
268
+
269
+ this.metricsManager.trackEvent(
270
+ METRIC_EVENT_NAMES.USER_PREFERENCE_CREATE_SUCCESS,
271
+ {
272
+ orgId,
273
+ userId: data.userId,
274
+ statusCode: response.statusCode,
275
+ },
276
+ ['behavioral', 'operational']
277
+ );
278
+
279
+ return response.body;
280
+ } catch (error) {
281
+ const errorData = {
282
+ orgId,
283
+ userId: data.userId,
284
+ error: error instanceof Error ? error.message : String(error),
285
+ };
286
+
287
+ LoggerProxy.error('Failed to create user preferences', {
288
+ module: 'UserPreference',
289
+ method: 'createUserPreference',
290
+ data: errorData,
291
+ error,
292
+ });
293
+
294
+ this.metricsManager.trackEvent(METRIC_EVENT_NAMES.USER_PREFERENCE_CREATE_FAILED, errorData, [
295
+ 'behavioral',
296
+ 'operational',
297
+ ]);
298
+
299
+ throw error;
300
+ }
301
+ }
302
+
303
+ /**
304
+ * Updates existing user preferences
305
+ * @param {string} userId - User ID to update preferences for
306
+ * @param {UpdateUserPreferenceRequest} data - The user preference data to update
307
+ * @returns {Promise<UserPreference>} Promise resolving to updated user preferences
308
+ * @throws {Error} If the API call fails
309
+ * @public
310
+ * @example
311
+ * ```typescript
312
+ * const updatedPreferences = await userPreferenceAPI.updateUserPreference('user123', {
313
+ * preferences: { e911Reminder: false }
314
+ * });
315
+ * ```
316
+ */
317
+ public async updateUserPreference(
318
+ userId: string,
319
+ data: UpdateUserPreferenceRequest
320
+ ): Promise<UserPreferenceResponse> {
321
+ const orgId = this.webex.credentials.getOrgId();
322
+
323
+ LoggerProxy.info('Updating user preferences', {
324
+ module: 'UserPreference',
325
+ method: 'updateUserPreference',
326
+ data: {
327
+ orgId,
328
+ userId,
329
+ },
330
+ });
331
+
332
+ if (!userId) {
333
+ LoggerProxy.error('updateUserPreference called without a valid userId', {
334
+ module: 'UserPreference',
335
+ method: 'updateUserPreference',
336
+ data: {
337
+ orgId,
338
+ error: 'Missing userId parameter.',
339
+ },
340
+ });
341
+
342
+ throw new Error('UserPreference: userId is required to update user preferences.');
343
+ }
344
+
345
+ try {
346
+ const resource = endPointMap.userPreference(orgId, userId);
347
+
348
+ LoggerProxy.info('Making API request to update user preferences', {
349
+ module: 'UserPreference',
350
+ method: 'updateUserPreference',
351
+ data: {
352
+ resource,
353
+ service: WCC_API_GATEWAY,
354
+ },
355
+ });
356
+
357
+ this.metricsManager.timeEvent(METRIC_EVENT_NAMES.USER_PREFERENCE_UPDATE_SUCCESS);
358
+ this.metricsManager.timeEvent(METRIC_EVENT_NAMES.USER_PREFERENCE_UPDATE_FAILED);
359
+
360
+ const response = await this.webexRequest.request({
361
+ service: WCC_API_GATEWAY,
362
+ resource,
363
+ method: HTTP_METHODS.PUT,
364
+ body: data,
365
+ });
366
+
367
+ LoggerProxy.info('Successfully updated user preferences', {
368
+ module: 'UserPreference',
369
+ method: 'updateUserPreference',
370
+ data: {
371
+ statusCode: response.statusCode,
372
+ userId,
373
+ },
374
+ });
375
+
376
+ this.metricsManager.trackEvent(
377
+ METRIC_EVENT_NAMES.USER_PREFERENCE_UPDATE_SUCCESS,
378
+ {
379
+ orgId,
380
+ userId,
381
+ statusCode: response.statusCode,
382
+ },
383
+ ['behavioral', 'operational']
384
+ );
385
+
386
+ return response.body;
387
+ } catch (error) {
388
+ const errorData = {
389
+ orgId,
390
+ userId,
391
+ error: error instanceof Error ? error.message : String(error),
392
+ };
393
+
394
+ LoggerProxy.error('Failed to update user preferences', {
395
+ module: 'UserPreference',
396
+ method: 'updateUserPreference',
397
+ data: errorData,
398
+ error,
399
+ });
400
+
401
+ this.metricsManager.trackEvent(METRIC_EVENT_NAMES.USER_PREFERENCE_UPDATE_FAILED, errorData, [
402
+ 'behavioral',
403
+ 'operational',
404
+ ]);
405
+
406
+ throw error;
407
+ }
408
+ }
409
+
410
+ /**
411
+ * Deletes user preferences for a specific user
412
+ * @param {string} userId - User ID to delete preferences for
413
+ * @returns {Promise<void>} Promise resolving when deletion is complete
414
+ * @throws {Error} If the API call fails
415
+ * @public
416
+ * @example
417
+ * ```typescript
418
+ * await userPreferenceAPI.deleteUserPreference('user123');
419
+ * ```
420
+ */
421
+ public async deleteUserPreference(userId: string): Promise<void> {
422
+ const orgId = this.webex.credentials.getOrgId();
423
+
424
+ LoggerProxy.info('Deleting user preferences', {
425
+ module: 'UserPreference',
426
+ method: 'deleteUserPreference',
427
+ data: {
428
+ orgId,
429
+ userId,
430
+ },
431
+ });
432
+
433
+ if (!userId) {
434
+ LoggerProxy.error('deleteUserPreference called without a valid userId', {
435
+ module: 'UserPreference',
436
+ method: 'deleteUserPreference',
437
+ data: {
438
+ orgId,
439
+ error: 'Missing userId parameter.',
440
+ },
441
+ });
442
+
443
+ throw new Error('UserPreference: userId is required to delete user preferences.');
444
+ }
445
+
446
+ try {
447
+ const resource = endPointMap.userPreference(orgId, userId);
448
+
449
+ LoggerProxy.info('Making API request to delete user preferences', {
450
+ module: 'UserPreference',
451
+ method: 'deleteUserPreference',
452
+ data: {
453
+ resource,
454
+ service: WCC_API_GATEWAY,
455
+ },
456
+ });
457
+
458
+ this.metricsManager.timeEvent(METRIC_EVENT_NAMES.USER_PREFERENCE_DELETE_SUCCESS);
459
+ this.metricsManager.timeEvent(METRIC_EVENT_NAMES.USER_PREFERENCE_DELETE_FAILED);
460
+
461
+ const response = await this.webexRequest.request({
462
+ service: WCC_API_GATEWAY,
463
+ resource,
464
+ method: HTTP_METHODS.DELETE,
465
+ });
466
+
467
+ LoggerProxy.info('Successfully deleted user preferences', {
468
+ module: 'UserPreference',
469
+ method: 'deleteUserPreference',
470
+ data: {
471
+ statusCode: response.statusCode,
472
+ userId,
473
+ },
474
+ });
475
+
476
+ this.metricsManager.trackEvent(
477
+ METRIC_EVENT_NAMES.USER_PREFERENCE_DELETE_SUCCESS,
478
+ {
479
+ orgId,
480
+ userId,
481
+ statusCode: response.statusCode,
482
+ },
483
+ ['behavioral', 'operational']
484
+ );
485
+ } catch (error) {
486
+ const errorData = {
487
+ orgId,
488
+ userId,
489
+ error: error instanceof Error ? error.message : String(error),
490
+ };
491
+
492
+ LoggerProxy.error('Failed to delete user preferences', {
493
+ module: 'UserPreference',
494
+ method: 'deleteUserPreference',
495
+ data: errorData,
496
+ error,
497
+ });
498
+
499
+ this.metricsManager.trackEvent(METRIC_EVENT_NAMES.USER_PREFERENCE_DELETE_FAILED, errorData, [
500
+ 'behavioral',
501
+ 'operational',
502
+ ]);
503
+
504
+ throw error;
505
+ }
506
+ }
507
+ }
508
+
509
+ export default UserPreference;