@aifabrix/builder 2.44.6 → 2.45.5

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 (257) hide show
  1. package/.cursor/rules/cli-layout.mdc +7 -3
  2. package/.cursor/rules/docs-rules.mdc +3 -1
  3. package/integration/hubspot-test/test-artifacts/wizard-hubspot-credential-real.yaml +1 -1
  4. package/integration/hubspot-test/test-artifacts/wizard-hubspot-env-vars.yaml +1 -1
  5. package/integration/hubspot-test/wizard-hubspot-e2e.yaml +1 -1
  6. package/jest.projects.js +100 -1
  7. package/lib/api/agent-metadata-validation.api.js +93 -0
  8. package/lib/api/audit-api-helpers.js +68 -0
  9. package/lib/api/audit.api.js +119 -0
  10. package/lib/api/auth-cache.api.js +44 -0
  11. package/lib/api/certificates.api.js +4 -4
  12. package/lib/api/credential.api.js +2 -2
  13. package/lib/api/dataplane-health.api.js +137 -0
  14. package/lib/api/dataplane-sync.api.js +27 -0
  15. package/lib/api/datasources-core.api.js +21 -18
  16. package/lib/api/datasources-extended.api.js +22 -22
  17. package/lib/api/dimensions.api.js +3 -0
  18. package/lib/api/external-systems.api.js +13 -13
  19. package/lib/api/governance-scenarios.api.js +39 -0
  20. package/lib/api/groups.api.js +79 -0
  21. package/lib/api/index.js +45 -2
  22. package/lib/api/pipeline.api.js +4 -4
  23. package/lib/api/protection.api.js +157 -0
  24. package/lib/api/records-bulk.api.js +30 -0
  25. package/lib/api/records-search-parse.js +49 -0
  26. package/lib/api/records-search.api.js +29 -0
  27. package/lib/api/types/agent-metadata-validation.types.js +67 -0
  28. package/lib/api/types/audit.types.js +72 -0
  29. package/lib/api/types/dataplane-health.types.js +27 -0
  30. package/lib/api/types/dimensions.types.js +2 -0
  31. package/lib/api/types/governance-scenarios.types.js +39 -0
  32. package/lib/api/types/protection.types.js +69 -0
  33. package/lib/api/types/records-bulk.types.js +35 -0
  34. package/lib/api/types/records-search.types.js +28 -0
  35. package/lib/api/user-groups.api.js +50 -0
  36. package/lib/api/users.api.js +95 -0
  37. package/lib/api/validation-run.api.js +3 -3
  38. package/lib/api/validation-runner.js +3 -3
  39. package/lib/api/wizard-platform.api.js +3 -3
  40. package/lib/api/wizard.api.js +21 -21
  41. package/lib/app/deploy.js +34 -19
  42. package/lib/app/helpers.js +3 -3
  43. package/lib/app/index.js +3 -3
  44. package/lib/app/register.js +7 -6
  45. package/lib/app/restart-display.js +52 -21
  46. package/lib/app/rotate-secret.js +7 -6
  47. package/lib/app/run-helpers.js +15 -8
  48. package/lib/app/run.js +57 -9
  49. package/lib/app/show-display.js +7 -0
  50. package/lib/app/show.js +87 -5
  51. package/lib/build/index.js +9 -5
  52. package/lib/cli/index.js +4 -2
  53. package/lib/cli/infra-guided.js +62 -28
  54. package/lib/cli/installation-log-command.js +73 -0
  55. package/lib/cli/setup-app.help.js +50 -2
  56. package/lib/cli/setup-app.js +44 -25
  57. package/lib/cli/setup-app.test-commands.js +80 -21
  58. package/lib/cli/setup-auth.js +124 -52
  59. package/lib/cli/setup-external-system.js +37 -3
  60. package/lib/cli/setup-infra-up-dataplane-action.js +111 -0
  61. package/lib/cli/setup-infra-up-platform-action.js +131 -0
  62. package/lib/cli/setup-infra.js +60 -119
  63. package/lib/cli/setup-platform.js +1 -1
  64. package/lib/cli/setup-utility-help-after.js +45 -0
  65. package/lib/cli/setup-utility-resolve.js +132 -0
  66. package/lib/cli/setup-utility.js +148 -116
  67. package/lib/commands/app-logs.js +81 -33
  68. package/lib/commands/auth-config.js +116 -18
  69. package/lib/commands/auth-status-dataplane-version.js +231 -0
  70. package/lib/commands/auth-status-display.js +94 -0
  71. package/lib/commands/auth-status.js +70 -6
  72. package/lib/commands/credential-push.js +10 -5
  73. package/lib/commands/datasource-load-export-cli.js +178 -0
  74. package/lib/commands/datasource-test-trust-cli.js +114 -0
  75. package/lib/commands/datasource-unified-test-cli.js +25 -17
  76. package/lib/commands/datasource-unified-test-cli.options.js +18 -3
  77. package/lib/commands/datasource-unified-test-e2e-cli-helpers.js +5 -5
  78. package/lib/commands/datasource-verify-audit-cli.js +96 -0
  79. package/lib/commands/datasource.js +68 -1
  80. package/lib/commands/dimension-value.js +43 -13
  81. package/lib/commands/dimension.js +38 -7
  82. package/lib/commands/identity-apply-sync.js +131 -0
  83. package/lib/commands/identity-group-cli.js +146 -0
  84. package/lib/commands/identity-membership-role-cache.js +175 -0
  85. package/lib/commands/identity-shared.js +94 -0
  86. package/lib/commands/identity-user-cli.js +158 -0
  87. package/lib/commands/identity.js +43 -0
  88. package/lib/commands/login.js +46 -16
  89. package/lib/commands/protection-cli-leaves.js +286 -0
  90. package/lib/commands/protection.js +50 -0
  91. package/lib/commands/repair.js +13 -3
  92. package/lib/commands/setup-modes.js +19 -6
  93. package/lib/commands/setup-prompts.js +41 -8
  94. package/lib/commands/setup.js +114 -9
  95. package/lib/commands/teardown.js +54 -5
  96. package/lib/commands/test-e2e-external.js +40 -9
  97. package/lib/commands/test-governance-cli-options.js +47 -0
  98. package/lib/commands/test-governance-command-action.js +55 -0
  99. package/lib/commands/test-governance-external.js +88 -0
  100. package/lib/commands/test-trust-cli-options.js +32 -0
  101. package/lib/commands/test-trust-command-action.js +118 -0
  102. package/lib/commands/test-trust-external.js +127 -0
  103. package/lib/commands/up-common.js +48 -14
  104. package/lib/commands/up-dataplane.js +21 -18
  105. package/lib/commands/up-miso.js +12 -8
  106. package/lib/commands/upload.js +38 -15
  107. package/lib/commands/wizard-core.js +3 -0
  108. package/lib/core/audit-logger.js +1 -34
  109. package/lib/core/config-admin-email.js +56 -0
  110. package/lib/core/config-device-dataplane.js +185 -0
  111. package/lib/core/config-normalize.js +60 -0
  112. package/lib/core/config-registered-controller-urls.js +54 -0
  113. package/lib/core/config.js +33 -50
  114. package/lib/core/secrets-ensure-infra.js +1 -1
  115. package/lib/core/secrets-env-content.js +86 -90
  116. package/lib/core/secrets-env-declarative-expand.js +170 -0
  117. package/lib/core/secrets-env-write.js +2 -0
  118. package/lib/core/secrets-load.js +106 -102
  119. package/lib/datasource/agent-trust-debug-log.js +45 -0
  120. package/lib/datasource/agent-trust-fetch.js +115 -0
  121. package/lib/datasource/agent-trust-map.js +101 -0
  122. package/lib/datasource/agent-trust-mock.js +44 -0
  123. package/lib/datasource/agent-trust-run.js +93 -0
  124. package/lib/datasource/agent-trust-timeout.js +25 -0
  125. package/lib/datasource/audit-evidence-display.js +80 -0
  126. package/lib/datasource/audit-evidence-extract-debug.js +103 -0
  127. package/lib/datasource/audit-evidence-extract.js +177 -0
  128. package/lib/datasource/audit-evidence-matrix-rows.js +158 -0
  129. package/lib/datasource/audit-evidence-operation-aliases.js +63 -0
  130. package/lib/datasource/audit-evidence-poll.js +109 -0
  131. package/lib/datasource/audit-evidence-run.js +177 -0
  132. package/lib/datasource/audit-evidence-verify-helpers.js +167 -0
  133. package/lib/datasource/audit-evidence-verify-matrix.js +177 -0
  134. package/lib/datasource/audit-evidence-verify.js +108 -0
  135. package/lib/datasource/bulk-loader-run-batches.js +88 -0
  136. package/lib/datasource/bulk-loader-service-retry.js +52 -0
  137. package/lib/datasource/bulk-loader-service.js +127 -0
  138. package/lib/datasource/capability/run-capability-dimension.js +2 -1
  139. package/lib/datasource/datasource-exporter-resolve.js +82 -0
  140. package/lib/datasource/datasource-exporter-service.js +144 -0
  141. package/lib/datasource/datasource-identifier.js +148 -0
  142. package/lib/datasource/datasource-load-export-context.js +92 -0
  143. package/lib/datasource/integration-context.js +6 -4
  144. package/lib/datasource/local-data-paths.js +145 -0
  145. package/lib/datasource/log-cleaner.js +241 -0
  146. package/lib/datasource/log-viewer.js +111 -6
  147. package/lib/datasource/record-file-parser.js +85 -0
  148. package/lib/datasource/record-mapper.js +129 -0
  149. package/lib/datasource/resolve-app.js +74 -55
  150. package/lib/datasource/test-e2e.js +26 -2
  151. package/lib/datasource/unified-validation-run-resolve.js +45 -12
  152. package/lib/datasource/unified-validation-run.js +43 -17
  153. package/lib/datasource/validate.js +37 -20
  154. package/lib/external-system/deploy.js +5 -1
  155. package/lib/external-system/test-system-level.js +25 -4
  156. package/lib/external-system/test.js +3 -1
  157. package/lib/governance/governance-pack-loader.js +70 -0
  158. package/lib/governance/governance-run-display.js +119 -0
  159. package/lib/identity/identity-apply-core.js +108 -0
  160. package/lib/identity/identity-apply-phases.js +244 -0
  161. package/lib/identity/identity-apply-service.js +77 -0
  162. package/lib/identity/identity-csv-parser.js +114 -0
  163. package/lib/internal/fs-real-sync.js +29 -1
  164. package/lib/internal/node-fs.js +2 -0
  165. package/lib/protection/auth-context.js +45 -0
  166. package/lib/protection/convert-batch.js +90 -0
  167. package/lib/protection/load.js +41 -0
  168. package/lib/protection/paths.js +158 -0
  169. package/lib/protection/preflight-datasource-ready.js +46 -0
  170. package/lib/protection/protection-create-probe-lines.js +142 -0
  171. package/lib/protection/protection-create-probes.js +95 -0
  172. package/lib/protection/protection-create-scaffold.js +281 -0
  173. package/lib/protection/protection-display-helpers.js +445 -0
  174. package/lib/protection/protection-display.js +215 -0
  175. package/lib/protection/protection-preset-registry.js +97 -0
  176. package/lib/protection/report-exit.js +62 -0
  177. package/lib/protection/resolve.js +202 -0
  178. package/lib/protection/run-commands-validate.js +130 -0
  179. package/lib/protection/run-commands.js +216 -0
  180. package/lib/protection/run-protection-create-helpers.js +134 -0
  181. package/lib/protection/run-protection-create-probes-flow.js +43 -0
  182. package/lib/protection/run-protection-create.js +191 -0
  183. package/lib/protection/scope.js +22 -0
  184. package/lib/protection/sync-after-upload.js +64 -0
  185. package/lib/protection/upload-batch.js +127 -0
  186. package/lib/protection/validate-batch.js +113 -0
  187. package/lib/protection/validate-local.js +65 -0
  188. package/lib/resolvers/dimension-file.js +29 -4
  189. package/lib/schema/application-schema.json +4 -0
  190. package/lib/schema/external-datasource.schema.json +47 -13
  191. package/lib/schema/flag-map-validation-run.json +2 -2
  192. package/lib/schema/infra.parameter.yaml +10 -0
  193. package/lib/schema/protection.schema.json +374 -0
  194. package/lib/schema/type/credential-field-registry.json +636 -0
  195. package/lib/schema/wizard-config.schema.json +1 -1
  196. package/lib/utils/agent-trust-run-display.js +231 -0
  197. package/lib/utils/agent-trust-run-exit.js +59 -0
  198. package/lib/utils/agent-trust-wait-ui.js +94 -0
  199. package/lib/utils/app-config-resolver.js +24 -1
  200. package/lib/utils/applications-config-defaults.js +206 -0
  201. package/lib/utils/auth-config-validator.js +2 -12
  202. package/lib/utils/bash-secret-env.js +1 -1
  203. package/lib/utils/cli-exit-codes.js +30 -0
  204. package/lib/utils/cli-sync-options.js +33 -0
  205. package/lib/utils/compose-generate-docker-compose.js +111 -6
  206. package/lib/utils/compose-generator.js +17 -8
  207. package/lib/utils/controller-url.js +50 -7
  208. package/lib/utils/credential-push-ui.js +90 -0
  209. package/lib/utils/dataplane-cli-version-gate.js +202 -0
  210. package/lib/utils/dataplane-cli-version-help.js +74 -0
  211. package/lib/utils/datasource-export-display.js +137 -0
  212. package/lib/utils/datasource-load-display.js +174 -0
  213. package/lib/utils/datasource-load-export-ui.js +120 -0
  214. package/lib/utils/datasource-test-run-capability-scope.js +3 -3
  215. package/lib/utils/datasource-test-run-display.js +3 -3
  216. package/lib/utils/datasource-test-run-tty-log.js +5 -1
  217. package/lib/utils/env-copy.js +99 -14
  218. package/lib/utils/env-template.js +5 -1
  219. package/lib/utils/health-check-url.js +18 -15
  220. package/lib/utils/health-check.js +7 -5
  221. package/lib/utils/help-builder.js +30 -24
  222. package/lib/utils/infra-optional-service-flags.js +69 -0
  223. package/lib/utils/installation-log-core.js +282 -0
  224. package/lib/utils/installation-log-record.js +237 -0
  225. package/lib/utils/installation-log.js +123 -0
  226. package/lib/utils/log-redaction.js +105 -0
  227. package/lib/utils/manifest-location.js +164 -0
  228. package/lib/utils/manifest-source-emit.js +184 -0
  229. package/lib/utils/paths.js +238 -89
  230. package/lib/utils/remote-secrets-loader.js +7 -1
  231. package/lib/utils/run-cli-flags.js +29 -0
  232. package/lib/utils/secrets-canonical.js +10 -3
  233. package/lib/utils/secrets-path.js +3 -4
  234. package/lib/utils/secrets-utils.js +20 -10
  235. package/lib/utils/semver-compare.js +127 -0
  236. package/lib/utils/system-builder-root.js +10 -2
  237. package/lib/utils/upload-pipeline-ui.js +91 -0
  238. package/lib/utils/url-declarative-public-base.js +80 -12
  239. package/lib/utils/url-declarative-resolve-build-urls.js +238 -0
  240. package/lib/utils/url-declarative-resolve-build.js +24 -393
  241. package/lib/utils/url-declarative-resolve-expand-token.js +189 -0
  242. package/lib/utils/url-declarative-resolve-load-doc.js +12 -3
  243. package/lib/utils/url-declarative-resolve-surface-state.js +102 -0
  244. package/lib/utils/url-declarative-resolve.js +47 -7
  245. package/lib/utils/url-declarative-runtime-base-path.js +21 -1
  246. package/lib/utils/urls-local-registry-scan.js +103 -0
  247. package/lib/utils/urls-local-registry.js +161 -90
  248. package/lib/utils/validation-poll-ui.js +14 -7
  249. package/lib/validation/wizard-config-validator.js +58 -19
  250. package/package.json +3 -1
  251. package/templates/applications/dataplane/application.yaml +4 -0
  252. package/templates/applications/dataplane/env.template +13 -1
  253. package/templates/applications/dataplane/rbac.yaml +4 -0
  254. package/templates/applications/miso-controller/application.yaml +2 -0
  255. package/templates/applications/miso-controller/env.template +27 -29
  256. package/templates/external-system/README.md.hbs +56 -8
  257. package/.npmrc.token +0 -1
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Dataplane health (public) — read dataplane `version` and optional
3
+ * `minBuilderCliVersion` for the Builder CLI compatibility gate (plan 142.0).
4
+ *
5
+ * Reads `GET /api/v1/health` first (canonical, plan 403.0) and falls back to
6
+ * `GET /health` for older dataplanes during rollout. The endpoint is public
7
+ * (`security: []`); no auth header is sent.
8
+ *
9
+ * @fileoverview Read dataplane health JSON without authentication
10
+ * @author AI Fabrix Team
11
+ * @version 2.0.0
12
+ * @requiresPermission none — public dataplane health endpoint (security: [])
13
+ */
14
+
15
+ 'use strict';
16
+
17
+ require('./types/dataplane-health.types');
18
+ const { ApiClient } = require('./index');
19
+
20
+ const PRIMARY_ENDPOINT = '/api/v1/health';
21
+ const FALLBACK_ENDPOINT = '/health';
22
+
23
+ /**
24
+ * Extract the inner JSON body from the harmonized ApiClient response shape.
25
+ * @private
26
+ * @param {Object} response
27
+ * @returns {Object|null}
28
+ */
29
+ function unwrapBody(response) {
30
+ if (!response || response.success === false || response.data === null || response.data === undefined) {
31
+ return null;
32
+ }
33
+ const outer = response.data;
34
+ if (!outer || typeof outer !== 'object') {
35
+ return null;
36
+ }
37
+ // Some dataplane shapes return `{ data: { ... } }`; the general health route
38
+ // returns the payload directly. Accept both.
39
+ const inner = outer.data !== undefined && outer.data !== null && typeof outer.data === 'object'
40
+ ? outer.data
41
+ : outer;
42
+ if (!inner || typeof inner !== 'object') {
43
+ return null;
44
+ }
45
+ return inner;
46
+ }
47
+
48
+ /**
49
+ * Parse a raw ApiClient response into a normalized health snapshot.
50
+ *
51
+ * @param {Object} response - ApiClient.get response (`{ success, data, ... }`)
52
+ * @param {string} [endpoint] - Endpoint that produced the response (recorded on snapshot)
53
+ * @returns {import('./types/dataplane-health.types').DataplaneHealthSnapshot|null}
54
+ * Snapshot, or null when the response is not parseable
55
+ */
56
+ function parseGeneralHealthResponse(response, endpoint) {
57
+ const body = unwrapBody(response);
58
+ if (!body) return null;
59
+
60
+ const status = typeof body.status === 'string' ? body.status : 'unknown';
61
+ const version = typeof body.version === 'string' && body.version.trim()
62
+ ? body.version.trim()
63
+ : undefined;
64
+
65
+ let minBuilderCliVersion;
66
+ if (typeof body.minBuilderCliVersion === 'string') {
67
+ const trimmed = body.minBuilderCliVersion.trim();
68
+ if (trimmed) minBuilderCliVersion = trimmed;
69
+ }
70
+
71
+ return {
72
+ status,
73
+ version,
74
+ minBuilderCliVersion,
75
+ endpoint: endpoint || null
76
+ };
77
+ }
78
+
79
+ /**
80
+ * Fetch dataplane general health (public endpoint, no auth).
81
+ *
82
+ * Tries `/api/v1/health` first; on failure falls back to `/health` (compatibility
83
+ * with older dataplanes that did not expose the v1 health route during rollout).
84
+ *
85
+ * @async
86
+ * @param {string} dataplaneUrl - Dataplane base URL (e.g. `http://localhost:3201`)
87
+ * @param {Object} [options]
88
+ * @param {number} [options.timeoutMs] - Optional timeout in milliseconds
89
+ * @returns {Promise<import('./types/dataplane-health.types').DataplaneHealthSnapshot|null>}
90
+ * Snapshot, or null when both endpoints fail
91
+ * @throws {Error} When dataplaneUrl is missing or not a string
92
+ */
93
+ async function fetchDataplaneGeneralHealth(dataplaneUrl, options = {}) {
94
+ if (!dataplaneUrl || typeof dataplaneUrl !== 'string') {
95
+ throw new Error('dataplaneUrl is required and must be a string');
96
+ }
97
+ const client = new ApiClient(dataplaneUrl);
98
+ const requestOpts = {};
99
+ if (options.timeoutMs !== undefined && options.timeoutMs !== null) {
100
+ requestOpts.timeoutMs = options.timeoutMs;
101
+ }
102
+
103
+ const primary = await safeGet(client, PRIMARY_ENDPOINT, requestOpts);
104
+ const primarySnapshot = parseGeneralHealthResponse(primary, PRIMARY_ENDPOINT);
105
+ if (primarySnapshot) return primarySnapshot;
106
+
107
+ const fallback = await safeGet(client, FALLBACK_ENDPOINT, requestOpts);
108
+ const fallbackSnapshot = parseGeneralHealthResponse(fallback, FALLBACK_ENDPOINT);
109
+ if (fallbackSnapshot) return fallbackSnapshot;
110
+
111
+ return null;
112
+ }
113
+
114
+ /**
115
+ * GET that swallows transport errors (timeouts / DNS / ECONNREFUSED) so callers
116
+ * can attempt a fallback endpoint without try/catch noise.
117
+ * @private
118
+ * @async
119
+ * @param {ApiClient} client
120
+ * @param {string} endpoint
121
+ * @param {Object} options
122
+ * @returns {Promise<Object|null>}
123
+ */
124
+ async function safeGet(client, endpoint, options) {
125
+ try {
126
+ return await client.get(endpoint, options);
127
+ } catch (_error) {
128
+ return null;
129
+ }
130
+ }
131
+
132
+ module.exports = {
133
+ fetchDataplaneGeneralHealth,
134
+ parseGeneralHealthResponse,
135
+ PRIMARY_ENDPOINT,
136
+ FALLBACK_ENDPOINT
137
+ };
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @fileoverview Dataplane sync API (Controller)
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const { ApiClient } = require('./index');
10
+
11
+ /**
12
+ * Trigger full identity sync to dataplane for an environment
13
+ * @requiresPermission {Controller} admin:sync
14
+ * @async
15
+ * @param {string} controllerUrl
16
+ * @param {Object} authConfig
17
+ * @param {string} envKey
18
+ * @returns {Promise<Object>}
19
+ */
20
+ async function fullSyncToDataplane(controllerUrl, authConfig, envKey) {
21
+ const client = new ApiClient(controllerUrl, authConfig);
22
+ return await client.post(`/api/v1/sync/dataplane/${encodeURIComponent(envKey)}/full`);
23
+ }
24
+
25
+ module.exports = {
26
+ fullSyncToDataplane
27
+ };
@@ -4,81 +4,84 @@
4
4
  * @version 2.0.0
5
5
  */
6
6
 
7
- const { ApiClient } = require('./index');
7
+ const { createDataplaneApiClient } = require('./index');
8
8
 
9
9
  /** @requiresPermission {Dataplane} external-system:read (datasource list) */
10
10
  async function listDatasources(dataplaneUrl, authConfig, options = {}) {
11
- const client = new ApiClient(dataplaneUrl, authConfig);
11
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
12
12
  return await client.get('/api/v1/external', { params: options });
13
13
  }
14
14
  /** @requiresPermission {Dataplane} external-system:create */
15
15
  async function createDatasource(dataplaneUrl, authConfig, datasourceData) {
16
- const client = new ApiClient(dataplaneUrl, authConfig);
16
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
17
17
  return await client.post('/api/v1/external', { body: datasourceData });
18
18
  }
19
19
  /** @requiresPermission {Dataplane} external-system:read */
20
20
  async function getDatasource(dataplaneUrl, sourceIdOrKey, authConfig) {
21
- const client = new ApiClient(dataplaneUrl, authConfig);
21
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
22
22
  return await client.get(`/api/v1/external/${sourceIdOrKey}`);
23
23
  }
24
24
  /** @requiresPermission {Dataplane} external-system:update */
25
25
  async function updateDatasource(dataplaneUrl, sourceIdOrKey, authConfig, updateData) {
26
- const client = new ApiClient(dataplaneUrl, authConfig);
26
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
27
27
  return await client.put(`/api/v1/external/${sourceIdOrKey}`, { body: updateData });
28
28
  }
29
29
  /** @requiresPermission {Dataplane} external-system:delete */
30
30
  async function deleteDatasource(dataplaneUrl, sourceIdOrKey, authConfig) {
31
- const client = new ApiClient(dataplaneUrl, authConfig);
31
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
32
32
  return await client.delete(`/api/v1/external/${sourceIdOrKey}`);
33
33
  }
34
34
  /** @requiresPermission {Dataplane} external-system:read */
35
35
  async function getDatasourceConfig(dataplaneUrl, sourceIdOrKey, authConfig) {
36
- const client = new ApiClient(dataplaneUrl, authConfig);
36
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
37
37
  return await client.get(`/api/v1/external/${sourceIdOrKey}/config`);
38
38
  }
39
39
  /** @requiresPermission {Dataplane} external-system:update */
40
40
  async function publishDatasource(dataplaneUrl, sourceIdOrKey, authConfig, publishData = {}) {
41
- const client = new ApiClient(dataplaneUrl, authConfig);
41
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
42
42
  return await client.post(`/api/v1/external/${sourceIdOrKey}/publish`, { body: publishData });
43
43
  }
44
44
  /** @requiresPermission {Dataplane} external-system:update */
45
45
  async function rollbackDatasource(dataplaneUrl, sourceIdOrKey, authConfig, rollbackData) {
46
- const client = new ApiClient(dataplaneUrl, authConfig);
46
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
47
47
  return await client.post(`/api/v1/external/${sourceIdOrKey}/rollback`, { body: rollbackData });
48
48
  }
49
49
  /** @requiresPermission {Dataplane} external-system:read */
50
50
  async function testDatasource(dataplaneUrl, sourceIdOrKey, authConfig, testData = {}) {
51
- const client = new ApiClient(dataplaneUrl, authConfig);
51
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
52
52
  return await client.post(`/api/v1/external/${sourceIdOrKey}/test`, { body: testData });
53
53
  }
54
54
  /** @requiresPermission {Dataplane} external-system:read */
55
55
  async function listDatasourceOpenAPIEndpoints(dataplaneUrl, sourceIdOrKey, authConfig, options = {}) {
56
- const client = new ApiClient(dataplaneUrl, authConfig);
56
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
57
57
  return await client.get(`/api/v1/external/${sourceIdOrKey}/openapi-endpoints`, { params: options });
58
58
  }
59
59
  /** @requiresPermission {Dataplane} audit:read or external-system:read */
60
60
  async function listExecutionLogs(dataplaneUrl, sourceIdOrKey, authConfig, options = {}) {
61
- const client = new ApiClient(dataplaneUrl, authConfig);
61
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
62
62
  return await client.get(`/api/v1/external/${sourceIdOrKey}/executions`, { params: options });
63
63
  }
64
64
  /** @requiresPermission {Dataplane} audit:read or external-system:read */
65
65
  async function getExecutionLog(dataplaneUrl, sourceIdOrKey, executionId, authConfig) {
66
- const client = new ApiClient(dataplaneUrl, authConfig);
66
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
67
67
  return await client.get(`/api/v1/external/${sourceIdOrKey}/executions/${executionId}`);
68
68
  }
69
69
  /** @requiresPermission {Dataplane} audit:read */
70
70
  async function listAllExecutionLogs(dataplaneUrl, authConfig, options = {}) {
71
- const client = new ApiClient(dataplaneUrl, authConfig);
71
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
72
72
  return await client.get('/api/v1/external/executions', { params: options });
73
73
  }
74
- /** @requiresPermission {Dataplane} external-system:update */
74
+ /**
75
+ * @deprecated Prefer {@link module:lib/api/records-bulk.api.bulkSyncRecords}.
76
+ * @requiresPermission {Dataplane} external-data-source:sync
77
+ */
75
78
  async function bulkOperation(dataplaneUrl, sourceIdOrKey, authConfig, bulkData) {
76
- const client = new ApiClient(dataplaneUrl, authConfig);
77
- return await client.post(`/api/v1/external/${sourceIdOrKey}/bulk`, { body: bulkData });
79
+ const { bulkSyncRecords } = require('./records-bulk.api');
80
+ return await bulkSyncRecords(dataplaneUrl, sourceIdOrKey, authConfig, bulkData);
78
81
  }
79
82
  /** @requiresPermission {Dataplane} external-system:read */
80
83
  async function getDatasourceStatus(dataplaneUrl, sourceIdOrKey, authConfig) {
81
- const client = new ApiClient(dataplaneUrl, authConfig);
84
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
82
85
  return await client.get(`/api/v1/external/${sourceIdOrKey}/status`);
83
86
  }
84
87
 
@@ -4,107 +4,107 @@
4
4
  * @version 2.0.0
5
5
  */
6
6
 
7
- const { ApiClient } = require('./index');
7
+ const { createDataplaneApiClient } = require('./index');
8
8
 
9
9
  /** @requiresPermission {Dataplane} external-system:read (records) */
10
10
  async function listRecords(dataplaneUrl, sourceIdOrKey, authConfig, options = {}) {
11
- const client = new ApiClient(dataplaneUrl, authConfig);
11
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
12
12
  return await client.get(`/api/v1/external/${sourceIdOrKey}/records`, { params: options });
13
13
  }
14
14
  /** @requiresPermission {Dataplane} external-system:create */
15
15
  async function createRecord(dataplaneUrl, sourceIdOrKey, authConfig, recordData) {
16
- const client = new ApiClient(dataplaneUrl, authConfig);
16
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
17
17
  return await client.post(`/api/v1/external/${sourceIdOrKey}/records`, { body: recordData });
18
18
  }
19
19
  /** @requiresPermission {Dataplane} external-system:read */
20
20
  async function getRecord(dataplaneUrl, sourceIdOrKey, recordIdOrKey, authConfig) {
21
- const client = new ApiClient(dataplaneUrl, authConfig);
21
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
22
22
  return await client.get(`/api/v1/external/${sourceIdOrKey}/records/${recordIdOrKey}`);
23
23
  }
24
24
  /** @requiresPermission {Dataplane} external-system:update */
25
25
  async function updateRecord(dataplaneUrl, sourceIdOrKey, recordIdOrKey, authConfig, updateData) {
26
- const client = new ApiClient(dataplaneUrl, authConfig);
26
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
27
27
  return await client.put(`/api/v1/external/${sourceIdOrKey}/records/${recordIdOrKey}`, { body: updateData });
28
28
  }
29
29
  /** @requiresPermission {Dataplane} external-system:delete */
30
30
  async function deleteRecord(dataplaneUrl, sourceIdOrKey, recordIdOrKey, authConfig) {
31
- const client = new ApiClient(dataplaneUrl, authConfig);
31
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
32
32
  return await client.delete(`/api/v1/external/${sourceIdOrKey}/records/${recordIdOrKey}`);
33
33
  }
34
34
  /** @requiresPermission {Dataplane} external-system:read (grants) */
35
35
  async function listGrants(dataplaneUrl, sourceIdOrKey, authConfig, options = {}) {
36
- const client = new ApiClient(dataplaneUrl, authConfig);
36
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
37
37
  return await client.get(`/api/v1/external/${sourceIdOrKey}/grants`, { params: options });
38
38
  }
39
39
  /** @requiresPermission {Dataplane} external-system:update */
40
40
  async function createGrant(dataplaneUrl, sourceIdOrKey, authConfig, grantData) {
41
- const client = new ApiClient(dataplaneUrl, authConfig);
41
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
42
42
  return await client.post(`/api/v1/external/${sourceIdOrKey}/grants`, { body: grantData });
43
43
  }
44
44
  /** @requiresPermission {Dataplane} external-system:read */
45
45
  async function getGrant(dataplaneUrl, sourceIdOrKey, grantIdOrKey, authConfig) {
46
- const client = new ApiClient(dataplaneUrl, authConfig);
46
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
47
47
  return await client.get(`/api/v1/external/${sourceIdOrKey}/grants/${grantIdOrKey}`);
48
48
  }
49
49
  /** @requiresPermission {Dataplane} external-system:update */
50
50
  async function updateGrant(dataplaneUrl, sourceIdOrKey, grantIdOrKey, authConfig, updateData) {
51
- const client = new ApiClient(dataplaneUrl, authConfig);
51
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
52
52
  return await client.put(`/api/v1/external/${sourceIdOrKey}/grants/${grantIdOrKey}`, { body: updateData });
53
53
  }
54
54
  async function deleteGrant(dataplaneUrl, sourceIdOrKey, grantIdOrKey, authConfig) {
55
- const client = new ApiClient(dataplaneUrl, authConfig);
55
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
56
56
  return await client.delete(`/api/v1/external/${sourceIdOrKey}/grants/${grantIdOrKey}`);
57
57
  }
58
58
  /** @requiresPermission {Dataplane} external-system:read (policies) */
59
59
  async function listPolicies(dataplaneUrl, sourceIdOrKey, authConfig, options = {}) {
60
- const client = new ApiClient(dataplaneUrl, authConfig);
60
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
61
61
  return await client.get(`/api/v1/external/${sourceIdOrKey}/policies`, { params: options });
62
62
  }
63
63
  /** @requiresPermission {Dataplane} external-system:update */
64
64
  async function attachPolicy(dataplaneUrl, sourceIdOrKey, authConfig, policyData) {
65
- const client = new ApiClient(dataplaneUrl, authConfig);
65
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
66
66
  return await client.post(`/api/v1/external/${sourceIdOrKey}/policies`, { body: policyData });
67
67
  }
68
68
  async function detachPolicy(dataplaneUrl, sourceIdOrKey, policyIdOrKey, authConfig) {
69
- const client = new ApiClient(dataplaneUrl, authConfig);
69
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
70
70
  return await client.delete(`/api/v1/external/${sourceIdOrKey}/policies/${policyIdOrKey}`);
71
71
  }
72
72
  /** @requiresPermission {Dataplane} external-system:read (sync) */
73
73
  async function listSyncJobs(dataplaneUrl, sourceIdOrKey, authConfig, options = {}) {
74
- const client = new ApiClient(dataplaneUrl, authConfig);
74
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
75
75
  return await client.get(`/api/v1/external/${sourceIdOrKey}/sync`, { params: options });
76
76
  }
77
77
  async function createSyncJob(dataplaneUrl, sourceIdOrKey, authConfig, syncData) {
78
- const client = new ApiClient(dataplaneUrl, authConfig);
78
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
79
79
  return await client.post(`/api/v1/external/${sourceIdOrKey}/sync`, { body: syncData });
80
80
  }
81
81
  /** @requiresPermission {Dataplane} external-system:read */
82
82
  async function getSyncJob(dataplaneUrl, sourceIdOrKey, syncJobId, authConfig) {
83
- const client = new ApiClient(dataplaneUrl, authConfig);
83
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
84
84
  return await client.get(`/api/v1/external/${sourceIdOrKey}/sync/${syncJobId}`);
85
85
  }
86
86
  /** @requiresPermission {Dataplane} external-system:update */
87
87
  async function updateSyncJob(dataplaneUrl, sourceIdOrKey, syncJobId, authConfig, updateData) {
88
- const client = new ApiClient(dataplaneUrl, authConfig);
88
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
89
89
  return await client.put(`/api/v1/external/${sourceIdOrKey}/sync/${syncJobId}`, { body: updateData });
90
90
  }
91
91
  async function executeSyncJob(dataplaneUrl, sourceIdOrKey, syncJobId, authConfig) {
92
- const client = new ApiClient(dataplaneUrl, authConfig);
92
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
93
93
  return await client.post(`/api/v1/external/${sourceIdOrKey}/sync/${syncJobId}/execute`);
94
94
  }
95
95
  /** @requiresPermission {Dataplane} document-record or external-system scope */
96
96
  async function validateDocuments(dataplaneUrl, sourceIdOrKey, authConfig, validateData) {
97
- const client = new ApiClient(dataplaneUrl, authConfig);
97
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
98
98
  return await client.post(`/api/v1/external/data-sources/${sourceIdOrKey}/documents/validate`, { body: validateData });
99
99
  }
100
100
  /** @requiresPermission {Dataplane} document-record or external-system scope */
101
101
  async function bulkDocuments(dataplaneUrl, sourceIdOrKey, authConfig, bulkData) {
102
- const client = new ApiClient(dataplaneUrl, authConfig);
102
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
103
103
  return await client.post(`/api/v1/external/data-sources/${sourceIdOrKey}/documents/bulk`, { body: bulkData });
104
104
  }
105
105
  /** @requiresPermission {Dataplane} document-record:read or external-system:read */
106
106
  async function listDocuments(dataplaneUrl, sourceIdOrKey, authConfig, options = {}) {
107
- const client = new ApiClient(dataplaneUrl, authConfig);
107
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
108
108
  return await client.get(`/api/v1/external/data-sources/${sourceIdOrKey}/documents`, { params: options });
109
109
  }
110
110
 
@@ -68,6 +68,9 @@ async function createDimension(controllerUrl, authConfig, body) {
68
68
  displayName: body.displayName,
69
69
  dataType: body.dataType
70
70
  };
71
+ if (body.valueType !== undefined && body.valueType !== null && body.valueType !== '') {
72
+ payload.valueType = body.valueType;
73
+ }
71
74
  if (body.description !== undefined && body.description !== null && body.description !== '') {
72
75
  payload.description = body.description;
73
76
  }
@@ -4,7 +4,7 @@
4
4
  * @version 2.0.0
5
5
  */
6
6
 
7
- const { ApiClient } = require('./index');
7
+ const { createDataplaneApiClient } = require('./index');
8
8
 
9
9
  /**
10
10
  * List external systems
@@ -24,7 +24,7 @@ const { ApiClient } = require('./index');
24
24
  * @throws {Error} If request fails
25
25
  */
26
26
  async function listExternalSystems(dataplaneUrl, authConfig, options = {}) {
27
- const client = new ApiClient(dataplaneUrl, authConfig);
27
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
28
28
  return await client.get('/api/v1/external/systems', {
29
29
  params: options
30
30
  });
@@ -43,7 +43,7 @@ async function listExternalSystems(dataplaneUrl, authConfig, options = {}) {
43
43
  * @throws {Error} If creation fails
44
44
  */
45
45
  async function createExternalSystem(dataplaneUrl, authConfig, systemData) {
46
- const client = new ApiClient(dataplaneUrl, authConfig);
46
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
47
47
  return await client.post('/api/v1/external/systems', {
48
48
  body: systemData
49
49
  });
@@ -66,7 +66,7 @@ async function createExternalSystem(dataplaneUrl, authConfig, systemData) {
66
66
  * @throws {Error} If request fails
67
67
  */
68
68
  async function getExternalSystem(dataplaneUrl, systemIdOrKey, authConfig) {
69
- const client = new ApiClient(dataplaneUrl, authConfig);
69
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
70
70
  return await client.get(`/api/v1/external/systems/${systemIdOrKey}`);
71
71
  }
72
72
 
@@ -84,7 +84,7 @@ async function getExternalSystem(dataplaneUrl, systemIdOrKey, authConfig) {
84
84
  * @throws {Error} If update fails
85
85
  */
86
86
  async function updateExternalSystem(dataplaneUrl, systemIdOrKey, authConfig, updateData) {
87
- const client = new ApiClient(dataplaneUrl, authConfig);
87
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
88
88
  return await client.put(`/api/v1/external/systems/${systemIdOrKey}`, {
89
89
  body: updateData
90
90
  });
@@ -103,7 +103,7 @@ async function updateExternalSystem(dataplaneUrl, systemIdOrKey, authConfig, upd
103
103
  * @throws {Error} If deletion fails
104
104
  */
105
105
  async function deleteExternalSystem(dataplaneUrl, systemIdOrKey, authConfig) {
106
- const client = new ApiClient(dataplaneUrl, authConfig);
106
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
107
107
  return await client.delete(`/api/v1/external/systems/${systemIdOrKey}`);
108
108
  }
109
109
 
@@ -120,7 +120,7 @@ async function deleteExternalSystem(dataplaneUrl, systemIdOrKey, authConfig) {
120
120
  * @throws {Error} If request fails
121
121
  */
122
122
  async function getExternalSystemConfig(dataplaneUrl, systemIdOrKey, authConfig) {
123
- const client = new ApiClient(dataplaneUrl, authConfig);
123
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
124
124
  return await client.get(`/api/v1/external/systems/${systemIdOrKey}/config`);
125
125
  }
126
126
 
@@ -140,7 +140,7 @@ async function getExternalSystemConfig(dataplaneUrl, systemIdOrKey, authConfig)
140
140
  * @throws {Error} If creation fails
141
141
  */
142
142
  async function createFromTemplate(dataplaneUrl, authConfig, templateData) {
143
- const client = new ApiClient(dataplaneUrl, authConfig);
143
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
144
144
  return await client.post('/api/v1/external/systems/from-template', {
145
145
  body: templateData
146
146
  });
@@ -160,7 +160,7 @@ async function createFromTemplate(dataplaneUrl, authConfig, templateData) {
160
160
  * @throws {Error} If request fails
161
161
  */
162
162
  async function listOpenAPIFiles(dataplaneUrl, systemIdOrKey, authConfig, options = {}) {
163
- const client = new ApiClient(dataplaneUrl, authConfig);
163
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
164
164
  return await client.get(`/api/v1/external/systems/${systemIdOrKey}/openapi-files`, {
165
165
  params: options
166
166
  });
@@ -180,7 +180,7 @@ async function listOpenAPIFiles(dataplaneUrl, systemIdOrKey, authConfig, options
180
180
  * @throws {Error} If request fails
181
181
  */
182
182
  async function listOpenAPIEndpoints(dataplaneUrl, systemIdOrKey, authConfig, options = {}) {
183
- const client = new ApiClient(dataplaneUrl, authConfig);
183
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
184
184
  return await client.get(`/api/v1/external/systems/${systemIdOrKey}/openapi-endpoints`, {
185
185
  params: options
186
186
  });
@@ -201,7 +201,7 @@ async function listOpenAPIEndpoints(dataplaneUrl, systemIdOrKey, authConfig, opt
201
201
  * @throws {Error} If publish fails
202
202
  */
203
203
  async function publishExternalSystem(dataplaneUrl, systemIdOrKey, authConfig, publishData = {}) {
204
- const client = new ApiClient(dataplaneUrl, authConfig);
204
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
205
205
  return await client.post(`/api/v1/external/systems/${systemIdOrKey}/publish`, {
206
206
  body: publishData
207
207
  });
@@ -222,7 +222,7 @@ async function publishExternalSystem(dataplaneUrl, systemIdOrKey, authConfig, pu
222
222
  * @throws {Error} If rollback fails
223
223
  */
224
224
  async function rollbackExternalSystem(dataplaneUrl, systemIdOrKey, authConfig, rollbackData) {
225
- const client = new ApiClient(dataplaneUrl, authConfig);
225
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
226
226
  return await client.post(`/api/v1/external/systems/${systemIdOrKey}/rollback`, {
227
227
  body: rollbackData
228
228
  });
@@ -244,7 +244,7 @@ async function rollbackExternalSystem(dataplaneUrl, systemIdOrKey, authConfig, r
244
244
  * @throws {Error} If save fails
245
245
  */
246
246
  async function saveAsTemplate(dataplaneUrl, systemIdOrKey, authConfig, templateData) {
247
- const client = new ApiClient(dataplaneUrl, authConfig);
247
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
248
248
  return await client.post(`/api/v1/external/systems/${systemIdOrKey}/save-template`, {
249
249
  body: templateData
250
250
  });
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @fileoverview Dataplane governance scenario acceptance API
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ const { createDataplaneApiClient } = require('./index');
8
+ const { unwrapApiData } = require('../utils/external-system-readiness-core');
9
+
10
+ /**
11
+ * Run governance scenario pack (ABAC visibility proof).
12
+ * POST /api/v1/governance/scenarios/run
13
+ * @requiresPermission {Dataplane} governance:evaluate
14
+ * @async
15
+ * @param {string} dataplaneUrl
16
+ * @param {Object} authConfig
17
+ * @param {import('./types/governance-scenarios.types').GovernanceScenariosRunRequest} body
18
+ * @returns {Promise<import('./types/governance-scenarios.types').GovernanceScenariosRunResponse>}
19
+ */
20
+ async function runGovernanceScenarios(dataplaneUrl, authConfig, body) {
21
+ const client = createDataplaneApiClient(dataplaneUrl, authConfig);
22
+ const res = await client.post('/api/v1/governance/scenarios/run', { body });
23
+ if (res && res.success === false) {
24
+ const msg =
25
+ (res.error && (res.error.formattedError || res.error.error || res.error.message)) ||
26
+ res.formattedError ||
27
+ 'Governance scenario run failed';
28
+ throw new Error(msg);
29
+ }
30
+ const unwrapped = unwrapApiData(res);
31
+ if (!unwrapped || !unwrapped.summary) {
32
+ throw new Error('Governance scenario run returned an unexpected response shape');
33
+ }
34
+ return unwrapped;
35
+ }
36
+
37
+ module.exports = {
38
+ runGovernanceScenarios
39
+ };
@@ -0,0 +1,79 @@
1
+ /**
2
+ * @fileoverview Groups API (Controller /api/v1/groups)
3
+ * @author AI Fabrix Team
4
+ * @version 1.0.0
5
+ */
6
+
7
+ 'use strict';
8
+
9
+ const { ApiClient } = require('./index');
10
+
11
+ const BASE = '/api/v1/groups';
12
+
13
+ /**
14
+ * List groups (paginated)
15
+ * @requiresPermission {Controller} groups:read
16
+ * @async
17
+ * @param {string} controllerUrl
18
+ * @param {Object} authConfig
19
+ * @param {Object} [options]
20
+ * @returns {Promise<Object>}
21
+ */
22
+ async function listGroups(controllerUrl, authConfig, options = {}) {
23
+ const client = new ApiClient(controllerUrl, authConfig);
24
+ return await client.get(BASE, { params: options });
25
+ }
26
+
27
+ /**
28
+ * Get group by id or name
29
+ * @requiresPermission {Controller} groups:read
30
+ * @async
31
+ * @param {string} controllerUrl
32
+ * @param {Object} authConfig
33
+ * @param {string} groupIdOrName
34
+ * @param {Object} [options]
35
+ * @returns {Promise<Object>}
36
+ */
37
+ async function getGroup(controllerUrl, authConfig, groupIdOrName, options = {}) {
38
+ const client = new ApiClient(controllerUrl, authConfig);
39
+ const params = {};
40
+ if (options.includeMembers) {
41
+ params.includeMembers = 'true';
42
+ }
43
+ return await client.get(`${BASE}/${encodeURIComponent(groupIdOrName)}`, { params });
44
+ }
45
+
46
+ /**
47
+ * Create group
48
+ * @requiresPermission {Controller} groups:create
49
+ * @async
50
+ * @param {string} controllerUrl
51
+ * @param {Object} authConfig
52
+ * @param {Object} body
53
+ * @returns {Promise<Object>}
54
+ */
55
+ async function createGroup(controllerUrl, authConfig, body) {
56
+ const client = new ApiClient(controllerUrl, authConfig);
57
+ return await client.post(BASE, { body });
58
+ }
59
+
60
+ /**
61
+ * List group members
62
+ * @requiresPermission {Controller} groups:read
63
+ * @async
64
+ * @param {string} controllerUrl
65
+ * @param {Object} authConfig
66
+ * @param {string} groupIdOrName
67
+ * @returns {Promise<Object>}
68
+ */
69
+ async function listGroupMembers(controllerUrl, authConfig, groupIdOrName) {
70
+ const client = new ApiClient(controllerUrl, authConfig);
71
+ return await client.get(`${BASE}/${encodeURIComponent(groupIdOrName)}/members`);
72
+ }
73
+
74
+ module.exports = {
75
+ listGroups,
76
+ getGroup,
77
+ createGroup,
78
+ listGroupMembers
79
+ };