@app-connect/core 1.7.25 → 1.7.27

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 (138) hide show
  1. package/.env.test +5 -5
  2. package/README.md +441 -441
  3. package/connector/developerPortal.js +31 -31
  4. package/connector/mock.js +84 -77
  5. package/connector/proxy/engine.js +164 -164
  6. package/connector/proxy/index.js +500 -500
  7. package/connector/registry.js +252 -252
  8. package/docs/README.md +50 -50
  9. package/docs/architecture.md +93 -93
  10. package/docs/connectors.md +116 -116
  11. package/docs/handlers.md +125 -125
  12. package/docs/libraries.md +101 -101
  13. package/docs/models.md +144 -144
  14. package/docs/routes.md +115 -115
  15. package/docs/tests.md +73 -73
  16. package/handlers/admin.js +523 -523
  17. package/handlers/appointment.js +193 -0
  18. package/handlers/auth.js +320 -296
  19. package/handlers/calldown.js +99 -99
  20. package/handlers/contact.js +280 -280
  21. package/handlers/disposition.js +82 -80
  22. package/handlers/log.js +990 -973
  23. package/handlers/managedAuth.js +446 -446
  24. package/handlers/managedOAuth.js +247 -0
  25. package/handlers/plugin.js +208 -208
  26. package/handlers/user.js +142 -142
  27. package/index.js +3162 -2652
  28. package/jest.config.js +56 -56
  29. package/lib/analytics.js +54 -54
  30. package/lib/authSession.js +109 -109
  31. package/lib/cacheCleanup.js +21 -0
  32. package/lib/callLogComposer.js +898 -898
  33. package/lib/callLogLookup.js +34 -0
  34. package/lib/constants.js +8 -8
  35. package/lib/debugTracer.js +177 -177
  36. package/lib/encode.js +30 -30
  37. package/lib/errorHandler.js +218 -206
  38. package/lib/generalErrorMessage.js +41 -41
  39. package/lib/jwt.js +18 -18
  40. package/lib/logger.js +190 -190
  41. package/lib/migrateCallLogsSchema.js +116 -0
  42. package/lib/ringcentral.js +266 -266
  43. package/lib/s3ErrorLogReport.js +65 -65
  44. package/lib/sharedSMSComposer.js +471 -471
  45. package/lib/util.js +67 -67
  46. package/mcp/README.md +412 -395
  47. package/mcp/lib/validator.js +91 -91
  48. package/mcp/mcpHandler.js +425 -425
  49. package/mcp/tools/cancelAppointment.js +101 -0
  50. package/mcp/tools/checkAuthStatus.js +105 -105
  51. package/mcp/tools/confirmAppointment.js +101 -0
  52. package/mcp/tools/createAppointment.js +157 -0
  53. package/mcp/tools/createCallLog.js +327 -316
  54. package/mcp/tools/createContact.js +117 -117
  55. package/mcp/tools/createMessageLog.js +287 -287
  56. package/mcp/tools/doAuth.js +60 -60
  57. package/mcp/tools/findContactByName.js +93 -93
  58. package/mcp/tools/findContactByPhone.js +101 -101
  59. package/mcp/tools/getCallLog.js +111 -102
  60. package/mcp/tools/getGoogleFilePicker.js +99 -99
  61. package/mcp/tools/getHelp.js +43 -43
  62. package/mcp/tools/getPublicConnectors.js +94 -94
  63. package/mcp/tools/getSessionInfo.js +90 -90
  64. package/mcp/tools/index.js +51 -41
  65. package/mcp/tools/listAppointments.js +163 -0
  66. package/mcp/tools/logout.js +99 -96
  67. package/mcp/tools/rcGetCallLogs.js +65 -65
  68. package/mcp/tools/updateAppointment.js +154 -0
  69. package/mcp/tools/updateCallLog.js +130 -126
  70. package/mcp/ui/App/App.tsx +358 -358
  71. package/mcp/ui/App/components/AuthInfoForm.tsx +113 -113
  72. package/mcp/ui/App/components/AuthSuccess.tsx +22 -22
  73. package/mcp/ui/App/components/ConnectorList.tsx +82 -82
  74. package/mcp/ui/App/components/DebugPanel.tsx +43 -43
  75. package/mcp/ui/App/components/OAuthConnect.tsx +270 -270
  76. package/mcp/ui/App/lib/callTool.ts +130 -130
  77. package/mcp/ui/App/lib/debugLog.ts +41 -41
  78. package/mcp/ui/App/lib/developerPortal.ts +111 -111
  79. package/mcp/ui/App/main.css +5 -5
  80. package/mcp/ui/App/root.tsx +13 -13
  81. package/mcp/ui/index.html +13 -13
  82. package/mcp/ui/package-lock.json +6356 -6356
  83. package/mcp/ui/package.json +25 -25
  84. package/mcp/ui/tsconfig.json +26 -26
  85. package/mcp/ui/vite.config.ts +16 -16
  86. package/models/accountDataModel.js +33 -33
  87. package/models/adminConfigModel.js +35 -35
  88. package/models/cacheModel.js +30 -26
  89. package/models/callDownListModel.js +34 -34
  90. package/models/callLogModel.js +33 -27
  91. package/models/dynamo/connectorSchema.js +146 -146
  92. package/models/dynamo/lockSchema.js +24 -24
  93. package/models/dynamo/noteCacheSchema.js +29 -29
  94. package/models/llmSessionModel.js +17 -17
  95. package/models/messageLogModel.js +25 -25
  96. package/models/sequelize.js +16 -16
  97. package/models/userModel.js +45 -45
  98. package/package.json +1 -1
  99. package/releaseNotes.json +1101 -1081
  100. package/test/connector/proxy/engine.test.js +126 -126
  101. package/test/connector/proxy/index.test.js +279 -279
  102. package/test/connector/proxy/sample.json +161 -161
  103. package/test/connector/registry.test.js +415 -415
  104. package/test/handlers/admin.test.js +616 -616
  105. package/test/handlers/auth.test.js +1092 -1018
  106. package/test/handlers/contact.test.js +1014 -1014
  107. package/test/handlers/log.test.js +1298 -1160
  108. package/test/handlers/managedAuth.test.js +457 -457
  109. package/test/handlers/plugin.test.js +380 -380
  110. package/test/index.test.js +105 -105
  111. package/test/lib/cacheCleanup.test.js +42 -0
  112. package/test/lib/callLogComposer.test.js +1231 -1231
  113. package/test/lib/debugTracer.test.js +328 -328
  114. package/test/lib/jwt.test.js +176 -176
  115. package/test/lib/logger.test.js +206 -206
  116. package/test/lib/oauth.test.js +359 -359
  117. package/test/lib/ringcentral.test.js +467 -467
  118. package/test/lib/sharedSMSComposer.test.js +1084 -1084
  119. package/test/lib/util.test.js +329 -329
  120. package/test/mcp/tools/checkAuthStatus.test.js +83 -83
  121. package/test/mcp/tools/createCallLog.test.js +436 -436
  122. package/test/mcp/tools/createContact.test.js +58 -58
  123. package/test/mcp/tools/createMessageLog.test.js +595 -595
  124. package/test/mcp/tools/doAuth.test.js +113 -113
  125. package/test/mcp/tools/findContactByName.test.js +275 -275
  126. package/test/mcp/tools/findContactByPhone.test.js +296 -296
  127. package/test/mcp/tools/getCallLog.test.js +298 -298
  128. package/test/mcp/tools/getGoogleFilePicker.test.js +281 -281
  129. package/test/mcp/tools/getPublicConnectors.test.js +107 -107
  130. package/test/mcp/tools/getSessionInfo.test.js +127 -127
  131. package/test/mcp/tools/logout.test.js +233 -233
  132. package/test/mcp/tools/rcGetCallLogs.test.js +56 -56
  133. package/test/mcp/tools/updateCallLog.test.js +360 -360
  134. package/test/models/accountDataModel.test.js +98 -98
  135. package/test/models/dynamo/connectorSchema.test.js +189 -189
  136. package/test/models/models.test.js +568 -539
  137. package/test/routes/managedAuthRoutes.test.js +235 -104
  138. package/test/setup.js +178 -178
@@ -1,93 +1,93 @@
1
- # Core Architecture
2
-
3
- This package is the reusable backend framework behind App Connect server deployments.
4
-
5
- Its job is to expose a stable HTTP surface, persist shared state, and delegate CRM-specific work to registered connectors.
6
-
7
- ## Main Entry Points
8
-
9
- `index.js` exports the package assembly surface:
10
-
11
- | Export | Purpose |
12
- | --- | --- |
13
- | `createCoreApp(options)` | Builds an Express app, installs middleware, and mounts the shared router |
14
- | `createCoreMiddleware()` | Returns the common JSON, XML, and CORS middleware stack |
15
- | `createCoreRouter()` | Creates the shared route layer without creating a full app |
16
- | `initializeCore(options)` | Initializes analytics and database synchronization |
17
- | `connectorRegistry` | Global registry for manifests, release notes, connectors, and interface composition |
18
- | `proxyConnector` | Proxy-driven connector implementation used for config-based integrations |
19
- | `DebugTracer` | Request-level debug tracing helper |
20
-
21
- ## Runtime Responsibilities
22
-
23
- `index.js` owns the framework assembly:
24
-
25
- - configures local DynamoDB support when `DYNAMODB_LOCALHOST` is set
26
- - installs an axios interceptor in local-style environments
27
- - syncs Sequelize models on startup unless `DISABLE_SYNC_DB_TABLE` or `skipDatabaseInit` disables it
28
- - adds the `hashedRcExtensionId` column to `users` if an older schema is missing it
29
- - mounts all shared HTTP routes
30
- - exposes dev-only mock routes when `IS_PROD === 'false'`
31
-
32
- ## Request Flow
33
-
34
- The non-MCP request path is:
35
-
36
- 1. Express receives a request through `createCoreApp()` or `createCoreRouter()`.
37
- 2. Core middleware parses JSON or XML and applies CORS defaults.
38
- 3. Route handlers in `index.js` decode JWTs, gather analytics metadata, and call a shared handler.
39
- 4. Handlers load the current user and connector, refresh auth if needed, and call the connector operation.
40
- 5. Models persist linkage data such as user sessions, call log ids, cached account data, and plugin task state.
41
- 6. Libraries compose payloads, normalize errors, emit analytics, and handle logging.
42
-
43
- ## Connector-Centered Design
44
-
45
- The package keeps route shapes and handler logic shared across platforms by pushing CRM-specific behavior behind the connector interface.
46
-
47
- Important consequences:
48
-
49
- - handlers decide when to load a connector and how to authenticate against it
50
- - connectors decide how to talk to a CRM
51
- - proxy connectors make many integrations data-driven instead of code-driven
52
- - registry-level interface composition lets a platform add methods without mutating the original connector object
53
-
54
- ## Persistence Layers
55
-
56
- There are two storage styles in this package:
57
-
58
- - Sequelize models for relational/shared application state
59
- - Dynamoose models for selected operational state such as proxy connector definitions, distributed locks, and note cache entries
60
-
61
- `AccountDataModel` also stores encrypted shared API-key auth values. Shared auth intentionally stays separate from `AdminConfigModel.userMappings`:
62
-
63
- - `managed-auth-org` stores account-scoped encrypted auth field values
64
- - `managed-auth-user` stores per-extension encrypted auth field values
65
- - server-side logging user mapping continues to live in admin config and is not reused for managed auth
66
-
67
- ## Cross-Cutting Concerns
68
-
69
- Several concerns are applied in multiple modules:
70
-
71
- - OAuth refresh via `lib/oauth.js`
72
- - RingCentral admin and reporting helpers via `lib/ringcentral.js`
73
- - response-safe error shaping via `lib/errorHandler.js`
74
- - analytics events via `lib/analytics.js`
75
- - opt-in debug traces via `lib/debugTracer.js`
76
- - structured server logging via `lib/logger.js`
77
-
78
- ## Important Environment Variables
79
-
80
- | Variable | Why it matters |
81
- | --- | --- |
82
- | `DATABASE_URL` | Sequelize connection string |
83
- | `DISABLE_SYNC_DB_TABLE` | Skips model sync in `initDB()` |
84
- | `MIXPANEL_TOKEN` | Enables analytics tracking |
85
- | `APP_SERVER_SECRET_KEY` | Signs and verifies JWTs and encrypts stored managed auth values |
86
- | `HASH_KEY` | Hashes RingCentral account and extension identifiers |
87
- | `DYNAMODB_LOCALHOST` | Points Dynamoose to a local endpoint |
88
- | `IS_PROD` | Enables local-only logging and mock routes when set to `'false'` |
89
- | `OVERRIDE_APP_SERVER` | Overrides manifest server URL in `GET /crmManifest` |
90
- | `OVERRIDE_SERVER_SIDE_LOGGING_SERVER` | Overrides manifest server-side logging URL in `GET /crmManifest` |
91
- | `RINGCENTRAL_SERVER` | Used by RingCentral OAuth and reporting helpers |
92
- | `RINGCENTRAL_CLIENT_ID` | Used by RingCentral OAuth and reporting helpers |
93
- | `RINGCENTRAL_CLIENT_SECRET` | Used by RingCentral OAuth and reporting helpers |
1
+ # Core Architecture
2
+
3
+ This package is the reusable backend framework behind App Connect server deployments.
4
+
5
+ Its job is to expose a stable HTTP surface, persist shared state, and delegate CRM-specific work to registered connectors.
6
+
7
+ ## Main Entry Points
8
+
9
+ `index.js` exports the package assembly surface:
10
+
11
+ | Export | Purpose |
12
+ | --- | --- |
13
+ | `createCoreApp(options)` | Builds an Express app, installs middleware, and mounts the shared router |
14
+ | `createCoreMiddleware()` | Returns the common JSON, XML, and CORS middleware stack |
15
+ | `createCoreRouter()` | Creates the shared route layer without creating a full app |
16
+ | `initializeCore(options)` | Initializes analytics and database synchronization |
17
+ | `connectorRegistry` | Global registry for manifests, release notes, connectors, and interface composition |
18
+ | `proxyConnector` | Proxy-driven connector implementation used for config-based integrations |
19
+ | `DebugTracer` | Request-level debug tracing helper |
20
+
21
+ ## Runtime Responsibilities
22
+
23
+ `index.js` owns the framework assembly:
24
+
25
+ - configures local DynamoDB support when `DYNAMODB_LOCALHOST` is set
26
+ - installs an axios interceptor in local-style environments
27
+ - syncs Sequelize models on startup unless `DISABLE_SYNC_DB_TABLE` or `skipDatabaseInit` disables it
28
+ - adds the `hashedRcExtensionId` column to `users` if an older schema is missing it
29
+ - mounts all shared HTTP routes
30
+ - exposes dev-only mock routes when `IS_PROD === 'false'`
31
+
32
+ ## Request Flow
33
+
34
+ The non-MCP request path is:
35
+
36
+ 1. Express receives a request through `createCoreApp()` or `createCoreRouter()`.
37
+ 2. Core middleware parses JSON or XML and applies CORS defaults.
38
+ 3. Route handlers in `index.js` decode JWTs, gather analytics metadata, and call a shared handler.
39
+ 4. Handlers load the current user and connector, refresh auth if needed, and call the connector operation.
40
+ 5. Models persist linkage data such as user sessions, call log ids, cached account data, and plugin task state.
41
+ 6. Libraries compose payloads, normalize errors, emit analytics, and handle logging.
42
+
43
+ ## Connector-Centered Design
44
+
45
+ The package keeps route shapes and handler logic shared across platforms by pushing CRM-specific behavior behind the connector interface.
46
+
47
+ Important consequences:
48
+
49
+ - handlers decide when to load a connector and how to authenticate against it
50
+ - connectors decide how to talk to a CRM
51
+ - proxy connectors make many integrations data-driven instead of code-driven
52
+ - registry-level interface composition lets a platform add methods without mutating the original connector object
53
+
54
+ ## Persistence Layers
55
+
56
+ There are two storage styles in this package:
57
+
58
+ - Sequelize models for relational/shared application state
59
+ - Dynamoose models for selected operational state such as proxy connector definitions, distributed locks, and note cache entries
60
+
61
+ `AccountDataModel` also stores encrypted shared API-key auth values. Shared auth intentionally stays separate from `AdminConfigModel.userMappings`:
62
+
63
+ - `managed-auth-org` stores account-scoped encrypted auth field values
64
+ - `managed-auth-user` stores per-extension encrypted auth field values
65
+ - server-side logging user mapping continues to live in admin config and is not reused for managed auth
66
+
67
+ ## Cross-Cutting Concerns
68
+
69
+ Several concerns are applied in multiple modules:
70
+
71
+ - OAuth refresh via `lib/oauth.js`
72
+ - RingCentral admin and reporting helpers via `lib/ringcentral.js`
73
+ - response-safe error shaping via `lib/errorHandler.js`
74
+ - analytics events via `lib/analytics.js`
75
+ - opt-in debug traces via `lib/debugTracer.js`
76
+ - structured server logging via `lib/logger.js`
77
+
78
+ ## Important Environment Variables
79
+
80
+ | Variable | Why it matters |
81
+ | --- | --- |
82
+ | `DATABASE_URL` | Sequelize connection string |
83
+ | `DISABLE_SYNC_DB_TABLE` | Skips model sync in `initDB()` |
84
+ | `MIXPANEL_TOKEN` | Enables analytics tracking |
85
+ | `APP_SERVER_SECRET_KEY` | Signs and verifies JWTs and encrypts stored managed auth values |
86
+ | `HASH_KEY` | Hashes RingCentral account and extension identifiers |
87
+ | `DYNAMODB_LOCALHOST` | Points Dynamoose to a local endpoint |
88
+ | `IS_PROD` | Enables local-only logging and mock routes when set to `'false'` |
89
+ | `OVERRIDE_APP_SERVER` | Overrides manifest server URL in `GET /crmManifest` |
90
+ | `OVERRIDE_SERVER_SIDE_LOGGING_SERVER` | Overrides manifest server-side logging URL in `GET /crmManifest` |
91
+ | `RINGCENTRAL_SERVER` | Used by RingCentral OAuth and reporting helpers |
92
+ | `RINGCENTRAL_CLIENT_ID` | Used by RingCentral OAuth and reporting helpers |
93
+ | `RINGCENTRAL_CLIENT_SECRET` | Used by RingCentral OAuth and reporting helpers |
@@ -1,116 +1,116 @@
1
- # Connectors
2
-
3
- Connectors are the extension seam that lets the shared framework support multiple CRMs.
4
-
5
- ## Registry
6
-
7
- `connector/registry.js` exports a singleton `ConnectorRegistry`.
8
-
9
- ### Responsibilities
10
-
11
- - register connector implementations by platform name
12
- - store manifests by platform
13
- - store release notes
14
- - register extra interface methods per platform
15
- - compose registered interfaces onto a connector at read time
16
- - fall back to the `proxy` connector when a platform-specific connector is missing
17
-
18
- ### Important behavior
19
-
20
- | Method | Notes |
21
- | --- | --- |
22
- | `registerConnector()` | Validates that the connector implements `createCallLog` and `updateCallLog` |
23
- | `getConnector()` | Returns the original connector, an interface-only connector, a composed connector, or the proxy connector fallback |
24
- | `registerConnectorInterface()` | Adds methods without mutating the original connector object |
25
- | `getManifest(platform, fallbackToDefault)` | Throws if no manifest exists |
26
- | `getConnectorCapabilities()` | Summarizes original methods, composed methods, registered interfaces, and auth type |
27
-
28
- ## Proxy Connector
29
-
30
- The proxy connector makes integrations configurable through stored connector metadata instead of custom connector code.
31
-
32
- ### Files
33
-
34
- | File | Role |
35
- | --- | --- |
36
- | `connector/proxy/index.js` | User-facing connector implementation for auth, contacts, call logs, message logs, dispositions, and logout |
37
- | `connector/proxy/engine.js` | Low-level request templating, auth header creation, and response mapping |
38
-
39
- ### What `proxy/index.js` does
40
-
41
- - loads proxy config from `models/dynamo/connectorSchema.js`
42
- - resolves auth type from config, defaulting to `apiKey`
43
- - builds `getOauthInfo()` for OAuth-style proxy integrations
44
- - performs `getUserInfo()`, `findContact()`, `createContact()`, `findContactWithName()`, `createCallLog()`, `getCallLog()`, `updateCallLog()`, `createMessageLog()`, `updateMessageLog()`, `upsertCallDisposition()`, and `getUserList()`
45
- - clears stored tokens in `unAuthorize()`
46
- - exposes connector-specific log format through `meta.logFormat`
47
-
48
- ### What `proxy/engine.js` does
49
-
50
- - resolves dot-path expressions with `getByPath()`
51
- - renders template strings like `{{ user.accessToken }}`
52
- - recursively renders query params, headers, and bodies
53
- - composes auth headers from operation-specific or global auth config
54
- - performs axios requests from the rendered config
55
- - maps contact and call-log responses into App Connect's shared shape
56
-
57
- ## Developer Portal Helpers
58
-
59
- `connector/developerPortal.js` wraps public API calls to the App Connect Developer Portal.
60
-
61
- Exports:
62
-
63
- - `getPublicConnectorList()`
64
- - `getConnectorManifest()`
65
-
66
- These functions are small fetch helpers and return `null` on failure after logging.
67
-
68
- ## Mock Connector Helpers
69
-
70
- `connector/mock.js` is not a full connector implementation. It is a development helper used by the dev-only mock routes.
71
-
72
- Exports:
73
-
74
- - `createUser()`
75
- - `deleteUser()`
76
- - `getCallLog()`
77
- - `createCallLog()`
78
- - `cleanUpMockLogs()`
79
-
80
- ## Connector Contract In Practice
81
-
82
- The shared framework expects these methods most often:
83
-
84
- - `getAuthType()`
85
- - `getOauthInfo()` or `getBasicAuth()`
86
- - `getUserInfo()`
87
- - `authValidation()`
88
- - `createCallLog()`
89
- - `updateCallLog()`
90
- - `getCallLog()`
91
- - `createMessageLog()`
92
- - `updateMessageLog()`
93
- - `findContact()`
94
- - `createContact()`
95
- - `findContactWithName()`
96
- - `unAuthorize()`
97
- - optional methods such as `getUserList()`, `getLicenseStatus()`, `upsertCallDisposition()`, `getServerLoggingSettings()`, `updateServerLoggingSettings()`, and `onUpdateUserSettings()`
98
-
99
- ## API-Key Managed Auth Fields
100
-
101
- `apiKey` connector manifests can now annotate auth fields in `platform.auth.apiKey.page.content[]` with:
102
-
103
- - `managed?: boolean`
104
- - `managedScope?: 'account' | 'user'`
105
- - `hidden?: boolean`
106
-
107
- Behavior:
108
-
109
- - `managed: true` marks a field as eligible for admin-managed storage and server-side auto-fill
110
- - `managedScope: 'account'` stores one encrypted value per RingCentral account
111
- - `managedScope: 'user'` stores encrypted values per RingCentral extension inside that account
112
- - `hidden: true` hides input field from users
113
- - stored managed auth values are encrypted at rest by default
114
-
115
- This does not change the connector runtime contract. `handlers/auth.onApiKeyLogin()` still resolves the manifest-driven auth payload and passes the final field map through `additionalInfo` into connector `getUserInfo()`. Existing connectors like Redtail that already read extra API-key fields from `additionalInfo` remain compatible.
116
-
1
+ # Connectors
2
+
3
+ Connectors are the extension seam that lets the shared framework support multiple CRMs.
4
+
5
+ ## Registry
6
+
7
+ `connector/registry.js` exports a singleton `ConnectorRegistry`.
8
+
9
+ ### Responsibilities
10
+
11
+ - register connector implementations by platform name
12
+ - store manifests by platform
13
+ - store release notes
14
+ - register extra interface methods per platform
15
+ - compose registered interfaces onto a connector at read time
16
+ - fall back to the `proxy` connector when a platform-specific connector is missing
17
+
18
+ ### Important behavior
19
+
20
+ | Method | Notes |
21
+ | --- | --- |
22
+ | `registerConnector()` | Validates that the connector implements `createCallLog` and `updateCallLog` |
23
+ | `getConnector()` | Returns the original connector, an interface-only connector, a composed connector, or the proxy connector fallback |
24
+ | `registerConnectorInterface()` | Adds methods without mutating the original connector object |
25
+ | `getManifest(platform, fallbackToDefault)` | Throws if no manifest exists |
26
+ | `getConnectorCapabilities()` | Summarizes original methods, composed methods, registered interfaces, and auth type |
27
+
28
+ ## Proxy Connector
29
+
30
+ The proxy connector makes integrations configurable through stored connector metadata instead of custom connector code.
31
+
32
+ ### Files
33
+
34
+ | File | Role |
35
+ | --- | --- |
36
+ | `connector/proxy/index.js` | User-facing connector implementation for auth, contacts, call logs, message logs, dispositions, and logout |
37
+ | `connector/proxy/engine.js` | Low-level request templating, auth header creation, and response mapping |
38
+
39
+ ### What `proxy/index.js` does
40
+
41
+ - loads proxy config from `models/dynamo/connectorSchema.js`
42
+ - resolves auth type from config, defaulting to `apiKey`
43
+ - builds `getOauthInfo()` for OAuth-style proxy integrations
44
+ - performs `getUserInfo()`, `findContact()`, `createContact()`, `findContactWithName()`, `createCallLog()`, `getCallLog()`, `updateCallLog()`, `createMessageLog()`, `updateMessageLog()`, `upsertCallDisposition()`, and `getUserList()`
45
+ - clears stored tokens in `unAuthorize()`
46
+ - exposes connector-specific log format through `meta.logFormat`
47
+
48
+ ### What `proxy/engine.js` does
49
+
50
+ - resolves dot-path expressions with `getByPath()`
51
+ - renders template strings like `{{ user.accessToken }}`
52
+ - recursively renders query params, headers, and bodies
53
+ - composes auth headers from operation-specific or global auth config
54
+ - performs axios requests from the rendered config
55
+ - maps contact and call-log responses into App Connect's shared shape
56
+
57
+ ## Developer Portal Helpers
58
+
59
+ `connector/developerPortal.js` wraps public API calls to the App Connect Developer Portal.
60
+
61
+ Exports:
62
+
63
+ - `getPublicConnectorList()`
64
+ - `getConnectorManifest()`
65
+
66
+ These functions are small fetch helpers and return `null` on failure after logging.
67
+
68
+ ## Mock Connector Helpers
69
+
70
+ `connector/mock.js` is not a full connector implementation. It is a development helper used by the dev-only mock routes.
71
+
72
+ Exports:
73
+
74
+ - `createUser()`
75
+ - `deleteUser()`
76
+ - `getCallLog()`
77
+ - `createCallLog()`
78
+ - `cleanUpMockLogs()`
79
+
80
+ ## Connector Contract In Practice
81
+
82
+ The shared framework expects these methods most often:
83
+
84
+ - `getAuthType()`
85
+ - `getOauthInfo()` or `getBasicAuth()`
86
+ - `getUserInfo()`
87
+ - `authValidation()`
88
+ - `createCallLog()`
89
+ - `updateCallLog()`
90
+ - `getCallLog()`
91
+ - `createMessageLog()`
92
+ - `updateMessageLog()`
93
+ - `findContact()`
94
+ - `createContact()`
95
+ - `findContactWithName()`
96
+ - `unAuthorize()`
97
+ - optional methods such as `getUserList()`, `getLicenseStatus()`, `upsertCallDisposition()`, `getServerLoggingSettings()`, `updateServerLoggingSettings()`, and `onUpdateUserSettings()`
98
+
99
+ ## API-Key Managed Auth Fields
100
+
101
+ `apiKey` connector manifests can now annotate auth fields in `platform.auth.apiKey.page.content[]` with:
102
+
103
+ - `managed?: boolean`
104
+ - `managedScope?: 'account' | 'user'`
105
+ - `hidden?: boolean`
106
+
107
+ Behavior:
108
+
109
+ - `managed: true` marks a field as eligible for admin-managed storage and server-side auto-fill
110
+ - `managedScope: 'account'` stores one encrypted value per RingCentral account
111
+ - `managedScope: 'user'` stores encrypted values per RingCentral extension inside that account
112
+ - `hidden: true` hides input field from users
113
+ - stored managed auth values are encrypted at rest by default
114
+
115
+ This does not change the connector runtime contract. `handlers/auth.onApiKeyLogin()` still resolves the manifest-driven auth payload and passes the final field map through `additionalInfo` into connector `getUserInfo()`. Existing connectors like Redtail that already read extra API-key fields from `additionalInfo` remain compatible.
116
+