@skedulo/integration-sdk 0.9.0 → 0.10.0

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 (127) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/actions/action-registry.d.ts.map +1 -1
  3. package/dist/actions/action-registry.js +1 -0
  4. package/dist/actions/action-registry.js.map +1 -1
  5. package/dist/actions/data-flow.action.d.ts +62 -0
  6. package/dist/actions/data-flow.action.d.ts.map +1 -0
  7. package/dist/actions/data-flow.action.js +217 -0
  8. package/dist/actions/data-flow.action.js.map +1 -0
  9. package/dist/actions/event/on-skedulo.action.d.ts.map +1 -1
  10. package/dist/actions/event/on-skedulo.action.js +12 -1
  11. package/dist/actions/event/on-skedulo.action.js.map +1 -1
  12. package/dist/actions/event/types.d.ts +2 -0
  13. package/dist/actions/event/types.d.ts.map +1 -1
  14. package/dist/actions/event.action.d.ts +32 -0
  15. package/dist/actions/event.action.d.ts.map +1 -0
  16. package/dist/actions/event.action.js +113 -0
  17. package/dist/actions/event.action.js.map +1 -0
  18. package/dist/actions/metadata.action.d.ts +44 -0
  19. package/dist/actions/metadata.action.d.ts.map +1 -0
  20. package/dist/actions/metadata.action.js +96 -0
  21. package/dist/actions/metadata.action.js.map +1 -0
  22. package/dist/actions/scheduled-job.action.d.ts +73 -0
  23. package/dist/actions/scheduled-job.action.d.ts.map +1 -0
  24. package/dist/actions/scheduled-job.action.js +355 -0
  25. package/dist/actions/scheduled-job.action.js.map +1 -0
  26. package/dist/actions/sync/index.d.ts +1 -0
  27. package/dist/actions/sync/index.d.ts.map +1 -1
  28. package/dist/actions/sync/index.js +3 -1
  29. package/dist/actions/sync/index.js.map +1 -1
  30. package/dist/actions/sync/retry-failed.action.d.ts +10 -0
  31. package/dist/actions/sync/retry-failed.action.d.ts.map +1 -0
  32. package/dist/actions/sync/retry-failed.action.js +61 -0
  33. package/dist/actions/sync/retry-failed.action.js.map +1 -0
  34. package/dist/actions/sync/types.d.ts +11 -0
  35. package/dist/actions/sync/types.d.ts.map +1 -1
  36. package/dist/actions/sync.action.d.ts +26 -0
  37. package/dist/actions/sync.action.d.ts.map +1 -0
  38. package/dist/actions/sync.action.js +81 -0
  39. package/dist/actions/sync.action.js.map +1 -0
  40. package/dist/actions/utils/action-names.d.ts +1 -0
  41. package/dist/actions/utils/action-names.d.ts.map +1 -1
  42. package/dist/actions/utils/action-names.js +1 -0
  43. package/dist/actions/utils/action-names.js.map +1 -1
  44. package/dist/actions/utils/types.d.ts +2 -0
  45. package/dist/actions/utils/types.d.ts.map +1 -1
  46. package/dist/adapters/base-adapter-handler.d.ts +2 -0
  47. package/dist/adapters/base-adapter-handler.d.ts.map +1 -1
  48. package/dist/adapters/base-adapter-handler.js +4 -1
  49. package/dist/adapters/base-adapter-handler.js.map +1 -1
  50. package/dist/adapters/capabilities-defaults.d.ts.map +1 -1
  51. package/dist/adapters/capabilities-defaults.js +7 -1
  52. package/dist/adapters/capabilities-defaults.js.map +1 -1
  53. package/dist/adapters/skedulo-mutation-result.d.ts +18 -0
  54. package/dist/adapters/skedulo-mutation-result.d.ts.map +1 -0
  55. package/dist/adapters/skedulo-mutation-result.js +124 -0
  56. package/dist/adapters/skedulo-mutation-result.js.map +1 -0
  57. package/dist/adapters/skedulo.adapter.d.ts +5 -0
  58. package/dist/adapters/skedulo.adapter.d.ts.map +1 -1
  59. package/dist/adapters/skedulo.adapter.js +139 -35
  60. package/dist/adapters/skedulo.adapter.js.map +1 -1
  61. package/dist/clients/failed-record.client.d.ts +37 -0
  62. package/dist/clients/failed-record.client.d.ts.map +1 -0
  63. package/dist/clients/failed-record.client.js +48 -0
  64. package/dist/clients/failed-record.client.js.map +1 -0
  65. package/dist/constants.d.ts +6 -0
  66. package/dist/constants.d.ts.map +1 -1
  67. package/dist/constants.js +8 -1
  68. package/dist/constants.js.map +1 -1
  69. package/dist/context.d.ts +3 -0
  70. package/dist/context.d.ts.map +1 -1
  71. package/dist/context.js +5 -0
  72. package/dist/context.js.map +1 -1
  73. package/dist/interfaces/adapter.interface.d.ts +13 -0
  74. package/dist/interfaces/adapter.interface.d.ts.map +1 -1
  75. package/dist/interfaces/integration-capabilities.interface.d.ts +22 -0
  76. package/dist/interfaces/integration-capabilities.interface.d.ts.map +1 -1
  77. package/dist/interfaces/sync-pipeline.interface.d.ts +11 -0
  78. package/dist/interfaces/sync-pipeline.interface.d.ts.map +1 -1
  79. package/dist/services/artifact-builder.d.ts +95 -0
  80. package/dist/services/artifact-builder.d.ts.map +1 -0
  81. package/dist/services/artifact-builder.js +142 -0
  82. package/dist/services/artifact-builder.js.map +1 -0
  83. package/dist/services/external-id-sync.strategy.d.ts.map +1 -1
  84. package/dist/services/external-id-sync.strategy.js +23 -24
  85. package/dist/services/external-id-sync.strategy.js.map +1 -1
  86. package/dist/services/id-mapping-sync.strategy.d.ts.map +1 -1
  87. package/dist/services/id-mapping-sync.strategy.js +35 -21
  88. package/dist/services/id-mapping-sync.strategy.js.map +1 -1
  89. package/dist/services/id-mapping.service.d.ts +2 -0
  90. package/dist/services/id-mapping.service.d.ts.map +1 -1
  91. package/dist/services/id-mapping.service.js +57 -2
  92. package/dist/services/id-mapping.service.js.map +1 -1
  93. package/dist/services/run-log-builder.d.ts +4 -5
  94. package/dist/services/run-log-builder.d.ts.map +1 -1
  95. package/dist/services/run-log-builder.js +4 -5
  96. package/dist/services/run-log-builder.js.map +1 -1
  97. package/dist/services/sync-pipeline-errors.d.ts +24 -0
  98. package/dist/services/sync-pipeline-errors.d.ts.map +1 -0
  99. package/dist/services/sync-pipeline-errors.js +52 -0
  100. package/dist/services/sync-pipeline-errors.js.map +1 -0
  101. package/dist/services/sync-runner.d.ts +15 -0
  102. package/dist/services/sync-runner.d.ts.map +1 -1
  103. package/dist/services/sync-runner.js +250 -10
  104. package/dist/services/sync-runner.js.map +1 -1
  105. package/dist/services/sync.service.d.ts +4 -1
  106. package/dist/services/sync.service.d.ts.map +1 -1
  107. package/dist/services/sync.service.js +3 -2
  108. package/dist/services/sync.service.js.map +1 -1
  109. package/package.json +2 -2
  110. package/yarn.lock +4 -4
  111. package/.claude/worktrees/agent-a16acadaf5412dffd/jest.config.js +0 -12
  112. package/.claude/worktrees/agent-a33c3e4636d488e49/jest.config.js +0 -12
  113. package/.claude/worktrees/agent-a5b1d2ffa4ceef4a6/jest.config.js +0 -12
  114. package/.claude/worktrees/agent-aa1db4c22eabbde8e/jest.config.js +0 -12
  115. package/.claude/worktrees/agent-ac197ae8c69d7061c/jest.config.js +0 -12
  116. package/dist/handlers/metadata.handler.d.ts +0 -17
  117. package/dist/handlers/metadata.handler.d.ts.map +0 -1
  118. package/dist/handlers/metadata.handler.js +0 -50
  119. package/dist/handlers/metadata.handler.js.map +0 -1
  120. package/dist/utils/normalizeDataFlow.d.ts +0 -3
  121. package/dist/utils/normalizeDataFlow.d.ts.map +0 -1
  122. package/dist/utils/normalizeDataFlow.js +0 -37
  123. package/dist/utils/normalizeDataFlow.js.map +0 -1
  124. package/dist/utils.d.ts +0 -2
  125. package/dist/utils.d.ts.map +0 -1
  126. package/dist/utils.js +0 -10
  127. package/dist/utils.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.10.0] - 2026-08-07
4
+
5
+ **Sync error handling & retry — a failed record no longer wedges the flow behind it (COR-818, fixes SOL-1198).**
6
+
7
+ Previously one bad record (e.g. a deactivated Salesforce picklist value) failed its whole batch and froze the cursor, so every later record — including valid ones modified afterwards — silently stopped syncing until someone fixed the data by hand and re-ran. Failures are now isolated per record, recorded to a dead-letter store, and the cursor always advances so healthy records keep flowing.
8
+
9
+ - **Per-record write attribution.** `parseMutationResult` maps each Skedulo bulk-mutation outcome back to its record by alias key (never positionally), so one rejected record no longer fails its batch-mates. On an unattributable response the adapter falls back to one-at-a-time writes, with a circuit breaker that stops after 10 consecutive single-write failures. `classifySkeduloError` tags each failure `transient` or `permanent`.
10
+ - **Always-advance cursor.** `decideCursor` is a pure rule: record every failure durably, then advance — holding only when a retained failure couldn't be turned into a row (fail-closed) or the run looks like an outage (zero successes and every failure transient). A permanent 100%-failure (bad mapping) records and advances rather than wedging.
11
+ - **Dead-letter store.** New `FailedRecordClient` (`ctx.failedRecordClient`) writes one row per failed record to integration-service, keyed `(tenant, flow, source_id)` and linked to the run log by `execution_id`. Requires integration-service's failed-record table + API.
12
+ - **Closed silent-drop paths** where a record could vanish without being recorded (stranded create-claims, `onMissing: 'error'` lookup misses, batch-level throws) — these now capture per-record failures instead of skipping.
13
+ - **Retry.** New admin action `sync.retry-failed { flowId, sourceIds }` re-fetches the given records via a new optional `Adapter.fetchByIds` (re-reads *current* source state, so a source-side fix takes effect), re-runs the pipeline, then reconciles — resolve the passers, re-record the still-failing. Integrations without `fetchByIds` are view-only.
14
+ - **New `errorHandling` capability** (`{ retryable }`, derived from `fetchByIds` presence) so the UI can gate the retry control per integration.
15
+ - New browser-safe export: `ACTIONS.sync.retryFailed`.
16
+
17
+ ## [0.9.1] - 2026-07-09
18
+
19
+ **Incremental inbound sync fires tenant Triggered Actions without re-introducing the echo loop (COR-648).**
20
+
21
+ - Inbound writes are now attributed via a shared `_attribution` helper: initial backfill stays fully suppressed, while incremental writes emit a change event tagged `source: integration:<integrationType>`. Applied symmetrically to upserts/inserts/updates **and** deletes.
22
+ - Realtime CDC inbound upserts are attributed as incremental (EVENT semantics) rather than misclassified as backfill — `SyncService.processBatch` takes an optional `syncMode` and the realtime event-batch path passes `EVENT`.
23
+ - The dispatcher lifts the `Skedulo-Change-Event-Source` header into `ParseMeta.changeEventSource`.
24
+ - The `on-skedulo` handler no-ops (with a counter + log) when a delivery's source is its own integration, breaking the inbound-sync → outbound-push loop; symmetric for deletes.
25
+ - Requires PSS `0.0.26` (adds the `source` mutation param → `X-Skedulo-Source` header) and connected-function-service forwarding `skedulo-*` headers. Precondition: `useChangeEventsV2` enabled on the tenant.
26
+
3
27
  ## [0.9.0] - 2026-07-03
4
28
 
5
29
  **Typed filter values matched consistently across preview and live sync (COR-602 follow-up).**
@@ -1 +1 @@
1
- {"version":3,"file":"action-registry.d.ts","sourceRoot":"","sources":["../../src/actions/action-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AA6BpE,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE5D,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,eAAe,CAAC;CAC3B;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,OAAO,EACP,QAAQ,GACT,EAAE,uBAAuB,GAAG,cAAc,CAkC1C;AAED,qEAAqE;AACrE,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,cAAc,CAOxF"}
1
+ {"version":3,"file":"action-registry.d.ts","sourceRoot":"","sources":["../../src/actions/action-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AA6BpE,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE5D,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,eAAe,CAAC;CAC3B;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,OAAO,EACP,QAAQ,GACT,EAAE,uBAAuB,GAAG,cAAc,CAmC1C;AAED,qEAAqE;AACrE,wBAAgB,eAAe,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,cAAc,CAOxF"}
@@ -32,6 +32,7 @@ function buildActionRegistry({ adapter, registry, }) {
32
32
  // Sync + scheduled jobs + event — need source/target lookup via registry.
33
33
  (0, sync_1.makeRunFlowAction)(syncDeps),
34
34
  (0, sync_1.makeRunJobAction)(syncDeps),
35
+ (0, sync_1.makeRetryFailedAction)(syncDeps),
35
36
  (0, scheduled_job_1.makeScheduledJobListAction)(syncDeps),
36
37
  (0, scheduled_job_1.makeScheduledJobGetAction)(syncDeps),
37
38
  (0, scheduled_job_1.makeScheduledJobCreateAction)(syncDeps),
@@ -1 +1 @@
1
- {"version":3,"file":"action-registry.js","sourceRoot":"","sources":["../../src/actions/action-registry.ts"],"names":[],"mappings":";;AA2CA,kDAqCC;AAGD,0CAOC;AAxFD,+DAA+D;AAC/D,iDAA8E;AAC9E,yCAMoB;AACpB,iCAA6D;AAC7D,mDAMyB;AACzB,mCAA4E;AAC5E,2CASqB;AAQrB;;;;;GAKG;AACH,SAAgB,mBAAmB,CAAC,EAClC,OAAO,EACP,QAAQ,GACgB;IACxB,MAAM,QAAQ,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAEvC,OAAO,eAAe,CAAC;QACrB,sCAAsC;QACtC,IAAA,4CAAsB,EAAC,OAAO,CAAC;QAC/B,IAAA,+BAAoB,EAAC,OAAO,CAAC;QAC7B,IAAA,8BAAmB,EAAC,OAAO,CAAC;QAC5B,IAAA,iCAAsB,EAAC,OAAO,CAAC;QAC/B,IAAA,kCAAuB,EAAC,OAAO,CAAC;QAChC,IAAA,qCAA0B,EAAC,OAAO,CAAC;QACnC,IAAA,qCAAyB,EAAC,OAAO,CAAC;QAClC,qBAAqB;QACrB,IAAA,oCAAqB,GAAE;QACvB,IAAA,oCAAqB,EAAC,OAAO,CAAC;QAC9B,0EAA0E;QAC1E,IAAA,wBAAiB,EAAC,QAAQ,CAAC;QAC3B,IAAA,uBAAgB,EAAC,QAAQ,CAAC;QAC1B,IAAA,0CAA0B,EAAC,QAAQ,CAAC;QACpC,IAAA,yCAAyB,EAAC,QAAQ,CAAC;QACnC,IAAA,4CAA4B,EAAC,QAAQ,CAAC;QACtC,IAAA,4CAA4B,EAAC,QAAQ,CAAC;QACtC,IAAA,4CAA4B,EAAC,QAAQ,CAAC;QACtC,IAAA,gCAAwB,EAAC,QAAQ,CAAC;QAClC,IAAA,+BAAuB,EAAC,QAAQ,CAAC;QACjC,oCAAoC;QACpC,IAAA,oCAAwB,GAAE;QAC1B,IAAA,oCAAwB,GAAE;QAC1B,IAAA,oCAAwB,GAAE;QAC1B,IAAA,sCAA0B,GAAE;QAC5B,IAAA,wCAA4B,GAAE;QAC9B,IAAA,iCAAqB,GAAE;QACvB,IAAA,kCAAsB,GAAE;KACzB,CAAC,CAAC;AACL,CAAC;AAED,qEAAqE;AACrE,SAAgB,eAAe,CAAC,OAAwC;IACtE,MAAM,CAAC,GAAmB,IAAI,GAAG,EAAE,CAAC;IACpC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3E,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
1
+ {"version":3,"file":"action-registry.js","sourceRoot":"","sources":["../../src/actions/action-registry.ts"],"names":[],"mappings":";;AA2CA,kDAsCC;AAGD,0CAOC;AAzFD,+DAA+D;AAC/D,iDAA8E;AAC9E,yCAMoB;AACpB,iCAAoF;AACpF,mDAMyB;AACzB,mCAA4E;AAC5E,2CASqB;AAQrB;;;;;GAKG;AACH,SAAgB,mBAAmB,CAAC,EAClC,OAAO,EACP,QAAQ,GACgB;IACxB,MAAM,QAAQ,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAEvC,OAAO,eAAe,CAAC;QACrB,sCAAsC;QACtC,IAAA,4CAAsB,EAAC,OAAO,CAAC;QAC/B,IAAA,+BAAoB,EAAC,OAAO,CAAC;QAC7B,IAAA,8BAAmB,EAAC,OAAO,CAAC;QAC5B,IAAA,iCAAsB,EAAC,OAAO,CAAC;QAC/B,IAAA,kCAAuB,EAAC,OAAO,CAAC;QAChC,IAAA,qCAA0B,EAAC,OAAO,CAAC;QACnC,IAAA,qCAAyB,EAAC,OAAO,CAAC;QAClC,qBAAqB;QACrB,IAAA,oCAAqB,GAAE;QACvB,IAAA,oCAAqB,EAAC,OAAO,CAAC;QAC9B,0EAA0E;QAC1E,IAAA,wBAAiB,EAAC,QAAQ,CAAC;QAC3B,IAAA,uBAAgB,EAAC,QAAQ,CAAC;QAC1B,IAAA,4BAAqB,EAAC,QAAQ,CAAC;QAC/B,IAAA,0CAA0B,EAAC,QAAQ,CAAC;QACpC,IAAA,yCAAyB,EAAC,QAAQ,CAAC;QACnC,IAAA,4CAA4B,EAAC,QAAQ,CAAC;QACtC,IAAA,4CAA4B,EAAC,QAAQ,CAAC;QACtC,IAAA,4CAA4B,EAAC,QAAQ,CAAC;QACtC,IAAA,gCAAwB,EAAC,QAAQ,CAAC;QAClC,IAAA,+BAAuB,EAAC,QAAQ,CAAC;QACjC,oCAAoC;QACpC,IAAA,oCAAwB,GAAE;QAC1B,IAAA,oCAAwB,GAAE;QAC1B,IAAA,oCAAwB,GAAE;QAC1B,IAAA,sCAA0B,GAAE;QAC5B,IAAA,wCAA4B,GAAE;QAC9B,IAAA,iCAAqB,GAAE;QACvB,IAAA,kCAAsB,GAAE;KACzB,CAAC,CAAC;AACL,CAAC;AAED,qEAAqE;AACrE,SAAgB,eAAe,CAAC,OAAwC;IACtE,MAAM,CAAC,GAAmB,IAAI,GAAG,EAAE,CAAC;IACpC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3E,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,62 @@
1
+ import type { CreateDataFlowInput, DataFlowListParams, UpdateDataFlowPatch } from '../clients/dataflow.client';
2
+ import { type DataFlow } from '../interfaces/data-flow-spec.interface';
3
+ import type { Action } from './utils/types';
4
+ /**
5
+ * Create a new data flow. New flows start INACTIVE per IS schema — no ES
6
+ * artifact is created here. Call `data-flow.activate` to provision the ES side.
7
+ */
8
+ export declare function makeDataFlowCreateAction(): Action<CreateDataFlowInput, DataFlow>;
9
+ export interface DataFlowUpdateInput {
10
+ id: number;
11
+ patch: UpdateDataFlowPatch;
12
+ }
13
+ /**
14
+ * Update an existing data flow.
15
+ *
16
+ * Constraints (business rules):
17
+ * - `sourceSystem` / `targetSystem` (direction) are immutable after create.
18
+ * Reject with `DIRECTION_IS_IMMUTABLE`.
19
+ * - If the flow is currently ACTIVE (its `sync_config` carries a
20
+ * `trigger_name`) AND the patch changes `strategy` or `interval_minutes`,
21
+ * the artifact would need to be recreated. v1 requires the caller to
22
+ * deactivate first and rejects with `DEACTIVATE_BEFORE_STRATEGY_CHANGE`.
23
+ */
24
+ export declare function makeDataFlowUpdateAction(): Action<DataFlowUpdateInput, DataFlow>;
25
+ export interface DataFlowDeleteInput {
26
+ id: number;
27
+ }
28
+ /**
29
+ * Delete a data flow. If currently ACTIVE (has a provisioned artifact),
30
+ * deactivate first so the artifact is cleaned up, then delete from IS.
31
+ */
32
+ export declare function makeDataFlowDeleteAction(): Action<DataFlowDeleteInput, {
33
+ id: number;
34
+ }>;
35
+ export interface DataFlowActivateInput {
36
+ id: number;
37
+ }
38
+ /**
39
+ * Activate a data flow. Two-phase fail-closed: ES artifact created first,
40
+ * then IS PATCH; if PATCH fails the ES artifact is compensatingly deleted.
41
+ * See `DataFlowService.activate` for full semantics.
42
+ */
43
+ export declare function makeDataFlowActivateAction(): Action<DataFlowActivateInput, DataFlow>;
44
+ export interface DataFlowDeactivateInput {
45
+ id: number;
46
+ }
47
+ /**
48
+ * Deactivate a data flow. Deletes the artifact (404 = success) and clears
49
+ * `trigger_name`/`trigger_type` from `sync_config` in IS.
50
+ */
51
+ export declare function makeDataFlowDeactivateAction(): Action<DataFlowDeactivateInput, DataFlow>;
52
+ export interface DataFlowGetInput {
53
+ id: number;
54
+ }
55
+ export declare function makeDataFlowGetAction(): Action<DataFlowGetInput, DataFlow>;
56
+ export interface DataFlowListInput {
57
+ filter?: DataFlowListParams;
58
+ }
59
+ export declare function makeDataFlowListAction(): Action<DataFlowListInput, Array<{
60
+ id: number;
61
+ }>>;
62
+ //# sourceMappingURL=data-flow.action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-flow.action.d.ts","sourceRoot":"","sources":["../../src/actions/data-flow.action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,wCAAwC,CAAC;AAGrF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAmD5C;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAUhF;AAID,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,mBAAmB,CAAC;CAC5B;AAcD;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAyChF;AAID,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAAC,mBAAmB,EAAE;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAmBtF;AAID,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,IAAI,MAAM,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAUpF;AAID,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,IAAI,MAAM,CAAC,uBAAuB,EAAE,QAAQ,CAAC,CAUxF;AAID,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,wBAAgB,qBAAqB,IAAI,MAAM,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAc1E;AAID,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAAC,iBAAiB,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAoBzF"}
@@ -0,0 +1,217 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeDataFlowCreateAction = makeDataFlowCreateAction;
4
+ exports.makeDataFlowUpdateAction = makeDataFlowUpdateAction;
5
+ exports.makeDataFlowDeleteAction = makeDataFlowDeleteAction;
6
+ exports.makeDataFlowActivateAction = makeDataFlowActivateAction;
7
+ exports.makeDataFlowDeactivateAction = makeDataFlowDeactivateAction;
8
+ exports.makeDataFlowGetAction = makeDataFlowGetAction;
9
+ exports.makeDataFlowListAction = makeDataFlowListAction;
10
+ const data_flow_spec_interface_1 = require("../interfaces/data-flow-spec.interface");
11
+ const action_names_1 = require("./utils/action-names");
12
+ const errors_1 = require("./utils/errors");
13
+ function isNonEmptyString(v) {
14
+ return typeof v === 'string' && v.length > 0;
15
+ }
16
+ function parseId(raw) {
17
+ const obj = (raw !== null && raw !== void 0 ? raw : {});
18
+ if (!Number.isInteger(obj.id) || obj.id <= 0) {
19
+ throw new errors_1.InvalidInputError('id must be a positive integer');
20
+ }
21
+ return obj.id;
22
+ }
23
+ // ── data-flow.create ─────────────────────────────────────────────────────────
24
+ function parseCreateInput(raw) {
25
+ var _a, _b, _c, _d, _e, _f, _g;
26
+ const obj = (raw !== null && raw !== void 0 ? raw : {});
27
+ const { name, sourceObject, targetObject, matchKeyField } = obj;
28
+ if (!isNonEmptyString(name)) {
29
+ throw new errors_1.InvalidInputError('name must be a non-empty string');
30
+ }
31
+ if (!isNonEmptyString(sourceObject)) {
32
+ throw new errors_1.InvalidInputError('sourceObject must be a non-empty string');
33
+ }
34
+ if (!isNonEmptyString(targetObject)) {
35
+ throw new errors_1.InvalidInputError('targetObject must be a non-empty string');
36
+ }
37
+ if (!isNonEmptyString(matchKeyField)) {
38
+ throw new errors_1.InvalidInputError('matchKeyField must be a non-empty string');
39
+ }
40
+ return {
41
+ // Authoritative integrationType is injected by the handler from context;
42
+ // placeholder here keeps the parsed shape well-typed.
43
+ integrationType: '',
44
+ name,
45
+ description: (_a = obj.description) !== null && _a !== void 0 ? _a : null,
46
+ sourceSystem: (_b = obj.sourceSystem) !== null && _b !== void 0 ? _b : null,
47
+ targetSystem: (_c = obj.targetSystem) !== null && _c !== void 0 ? _c : null,
48
+ sourceObject,
49
+ targetObject,
50
+ triggerConfig: (_d = obj.triggerConfig) !== null && _d !== void 0 ? _d : null,
51
+ mappingConfig: (_e = obj.mappingConfig) !== null && _e !== void 0 ? _e : null,
52
+ filter: (_f = obj.filter) !== null && _f !== void 0 ? _f : null,
53
+ matchKeyField,
54
+ executionOrder: (_g = obj.executionOrder) !== null && _g !== void 0 ? _g : null,
55
+ };
56
+ }
57
+ /**
58
+ * Create a new data flow. New flows start INACTIVE per IS schema — no ES
59
+ * artifact is created here. Call `data-flow.activate` to provision the ES side.
60
+ */
61
+ function makeDataFlowCreateAction() {
62
+ return {
63
+ name: action_names_1.ACTIONS.dataFlow.create,
64
+ parseInput: parseCreateInput,
65
+ async handler(input, ctx) {
66
+ // IS resolves tenantIntegrationId from integrationType + tenantId (token);
67
+ // take integrationType authoritatively from this function's context.
68
+ return ctx.dataFlowService.create(Object.assign(Object.assign({}, input), { integrationType: ctx.integrationType }));
69
+ },
70
+ };
71
+ }
72
+ function parseUpdateInput(raw) {
73
+ const obj = (raw !== null && raw !== void 0 ? raw : {});
74
+ const { id, patch } = obj;
75
+ if (!Number.isInteger(id) || id <= 0) {
76
+ throw new errors_1.InvalidInputError('id must be a positive integer');
77
+ }
78
+ if (!patch || typeof patch !== 'object' || Array.isArray(patch)) {
79
+ throw new errors_1.InvalidInputError('patch must be an object');
80
+ }
81
+ return { id: id, patch: patch };
82
+ }
83
+ /**
84
+ * Update an existing data flow.
85
+ *
86
+ * Constraints (business rules):
87
+ * - `sourceSystem` / `targetSystem` (direction) are immutable after create.
88
+ * Reject with `DIRECTION_IS_IMMUTABLE`.
89
+ * - If the flow is currently ACTIVE (its `sync_config` carries a
90
+ * `trigger_name`) AND the patch changes `strategy` or `interval_minutes`,
91
+ * the artifact would need to be recreated. v1 requires the caller to
92
+ * deactivate first and rejects with `DEACTIVATE_BEFORE_STRATEGY_CHANGE`.
93
+ */
94
+ function makeDataFlowUpdateAction() {
95
+ return {
96
+ name: action_names_1.ACTIONS.dataFlow.update,
97
+ parseInput: parseUpdateInput,
98
+ async handler(input, ctx) {
99
+ var _a;
100
+ const { id, patch } = input;
101
+ const patchRecord = patch;
102
+ if (Object.prototype.hasOwnProperty.call(patchRecord, 'sourceSystem') ||
103
+ Object.prototype.hasOwnProperty.call(patchRecord, 'targetSystem')) {
104
+ throw new errors_1.ActionError('DIRECTION_IS_IMMUTABLE', 'Direction is locked after creation. To change direction, delete this flow and create a new one.');
105
+ }
106
+ const incomingTrigger = patch.triggerConfig;
107
+ if (incomingTrigger) {
108
+ const incoming = (0, data_flow_spec_interface_1.asSyncConfig)(incomingTrigger);
109
+ if (incoming) {
110
+ const flow = await ctx.dataFlowService.getFlowById(id);
111
+ if (!flow) {
112
+ throw new errors_1.ActionError('FLOW_NOT_FOUND', `Flow ${id} not found`);
113
+ }
114
+ // Normalize both sides so a legacy-shaped DB row compares correctly
115
+ // against the new-shaped patch.
116
+ const existing = (0, data_flow_spec_interface_1.asSyncConfig)((_a = flow.triggerConfig) !== null && _a !== void 0 ? _a : null);
117
+ const isActive = !!(existing === null || existing === void 0 ? void 0 : existing.trigger_name);
118
+ if (isActive && existing && incoming.strategy !== existing.strategy) {
119
+ throw new errors_1.ActionError('DEACTIVATE_BEFORE_STRATEGY_CHANGE', 'Deactivate the flow before changing the sync strategy');
120
+ }
121
+ }
122
+ }
123
+ return ctx.dataFlowService.update(id, patch);
124
+ },
125
+ };
126
+ }
127
+ /**
128
+ * Delete a data flow. If currently ACTIVE (has a provisioned artifact),
129
+ * deactivate first so the artifact is cleaned up, then delete from IS.
130
+ */
131
+ function makeDataFlowDeleteAction() {
132
+ return {
133
+ name: action_names_1.ACTIONS.dataFlow.delete,
134
+ parseInput(raw) {
135
+ return { id: parseId(raw) };
136
+ },
137
+ async handler(input, ctx) {
138
+ var _a;
139
+ const flow = await ctx.dataFlowService.getFlowById(input.id);
140
+ if (!flow) {
141
+ throw new errors_1.ActionError('FLOW_NOT_FOUND', `Flow ${input.id} not found`);
142
+ }
143
+ const sc = (0, data_flow_spec_interface_1.asSyncConfig)((_a = flow.triggerConfig) !== null && _a !== void 0 ? _a : null);
144
+ if (sc === null || sc === void 0 ? void 0 : sc.trigger_name) {
145
+ await ctx.dataFlowService.deactivate(input.id, ctx);
146
+ }
147
+ await ctx.dataFlowService.delete(input.id);
148
+ return { id: input.id };
149
+ },
150
+ };
151
+ }
152
+ /**
153
+ * Activate a data flow. Two-phase fail-closed: ES artifact created first,
154
+ * then IS PATCH; if PATCH fails the ES artifact is compensatingly deleted.
155
+ * See `DataFlowService.activate` for full semantics.
156
+ */
157
+ function makeDataFlowActivateAction() {
158
+ return {
159
+ name: action_names_1.ACTIONS.dataFlow.activate,
160
+ parseInput(raw) {
161
+ return { id: parseId(raw) };
162
+ },
163
+ async handler(input, ctx) {
164
+ return ctx.dataFlowService.activate(input.id, ctx);
165
+ },
166
+ };
167
+ }
168
+ /**
169
+ * Deactivate a data flow. Deletes the artifact (404 = success) and clears
170
+ * `trigger_name`/`trigger_type` from `sync_config` in IS.
171
+ */
172
+ function makeDataFlowDeactivateAction() {
173
+ return {
174
+ name: action_names_1.ACTIONS.dataFlow.deactivate,
175
+ parseInput(raw) {
176
+ return { id: parseId(raw) };
177
+ },
178
+ async handler(input, ctx) {
179
+ return ctx.dataFlowService.deactivate(input.id, ctx);
180
+ },
181
+ };
182
+ }
183
+ function makeDataFlowGetAction() {
184
+ return {
185
+ name: action_names_1.ACTIONS.dataFlow.get,
186
+ parseInput(raw) {
187
+ return { id: parseId(raw) };
188
+ },
189
+ async handler(input, ctx) {
190
+ const flow = await ctx.dataFlowService.getFlowById(input.id);
191
+ if (!flow) {
192
+ throw new errors_1.ActionError('FLOW_NOT_FOUND', `Flow ${input.id} not found`);
193
+ }
194
+ return flow;
195
+ },
196
+ };
197
+ }
198
+ function makeDataFlowListAction() {
199
+ return {
200
+ name: action_names_1.ACTIONS.dataFlow.list,
201
+ parseInput(raw) {
202
+ const obj = (raw !== null && raw !== void 0 ? raw : {});
203
+ const filter = obj.filter;
204
+ if (filter !== undefined &&
205
+ (filter === null || typeof filter !== 'object' || Array.isArray(filter))) {
206
+ throw new errors_1.InvalidInputError('filter must be an object when provided');
207
+ }
208
+ return { filter: filter };
209
+ },
210
+ async handler(input, ctx) {
211
+ // Scope to this function's own integration type so a vendor function
212
+ // never lists another vendor's flows.
213
+ return ctx.dataFlowService.list(Object.assign(Object.assign({}, input.filter), { integrationType: ctx.integrationType }));
214
+ },
215
+ };
216
+ }
217
+ //# sourceMappingURL=data-flow.action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-flow.action.js","sourceRoot":"","sources":["../../src/actions/data-flow.action.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"on-skedulo.action.d.ts","sourceRoot":"","sources":["../../../src/actions/event/on-skedulo.action.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,mBAAmB,EAAE,oBAAoB,EAAiB,MAAM,SAAS,CAAC;AAkCnG,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,SAAS,GACd,MAAM,CAAC,mBAAmB,EAAE,oBAAoB,CAAC,CA+CnD"}
1
+ {"version":3,"file":"on-skedulo.action.d.ts","sourceRoot":"","sources":["../../../src/actions/event/on-skedulo.action.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,mBAAmB,EAAE,oBAAoB,EAAiB,MAAM,SAAS,CAAC;AAkCnG,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,SAAS,GACd,MAAM,CAAC,mBAAmB,EAAE,oBAAoB,CAAC,CA2DnD"}
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.makeOnSkeduloEventAction = makeOnSkeduloEventAction;
4
4
  const sync_runner_1 = require("../../services/sync-runner");
5
+ const constants_1 = require("../../constants");
5
6
  const action_names_1 = require("../utils/action-names");
6
7
  const helpers_1 = require("../utils/helpers");
7
8
  const errors_1 = require("../utils/errors");
@@ -50,10 +51,20 @@ function makeOnSkeduloEventAction(deps) {
50
51
  throw new errors_1.InvalidInputError('expected an array of Skedulo change events');
51
52
  }
52
53
  const changes = raw.map(parseSkeduloChange);
53
- return { dataFlowId: dataFlowId, changes };
54
+ return {
55
+ dataFlowId: dataFlowId,
56
+ changes,
57
+ changeEventSource: meta === null || meta === void 0 ? void 0 : meta.changeEventSource,
58
+ };
54
59
  },
55
60
  async handler(input, ctx) {
56
61
  const integrationType = deps.adapter.integrationType;
62
+ if (input.changeEventSource === (0, constants_1.integrationSource)(integrationType)) {
63
+ // Echo of our own inbound sync write — do not push it back out.
64
+ ctx.metrics.counter('on_skedulo.own_source_skipped', 1, { integrationType });
65
+ ctx.logger.info(`on_skedulo skipped: own integration change (source=${input.changeEventSource} dataFlowId=${input.dataFlowId})`);
66
+ return { message: 'Skipped: own integration change', results: [] };
67
+ }
57
68
  const lookupStrategy = (0, helpers_1.resolveLookupStrategy)(deps.adapter);
58
69
  const runner = new sync_runner_1.SyncRunner(deps.registry);
59
70
  // One delivery can carry many record changes — process them as a batch so
@@ -1 +1 @@
1
- {"version":3,"file":"on-skedulo.action.js","sourceRoot":"","sources":["../../../src/actions/event/on-skedulo.action.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"on-skedulo.action.js","sourceRoot":"","sources":["../../../src/actions/event/on-skedulo.action.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,8 @@ export interface OnSkeduloEventInput {
15
15
  /** Resolved from the `sked-data-flow-id` header (passed by the dispatcher as parse meta). */
16
16
  dataFlowId: number;
17
17
  changes: SkeduloChange[];
18
+ /** Resolved from the `Skedulo-Change-Event-Source` header; used to skip own-integration echo. */
19
+ changeEventSource?: string;
18
20
  }
19
21
  export interface OnSkeduloEventOutput {
20
22
  message: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/actions/event/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAEzE,MAAM,MAAM,SAAS,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,eAAe,CAAA;CAAE,CAAC;AAExE,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE9D,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,gBAAgB,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,mBAAmB;IAClC,6FAA6F;IAC7F,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AACD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC;AACzC,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/actions/event/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAC;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,wCAAwC,CAAC;AAEzE,MAAM,MAAM,SAAS,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,eAAe,CAAA;CAAE,CAAC;AAExE,MAAM,MAAM,gBAAgB,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE9D,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,gBAAgB,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,mBAAmB;IAClC,6FAA6F;IAC7F,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,iGAAiG;IACjG,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AACD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC;AACzC,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB"}
@@ -0,0 +1,32 @@
1
+ import type { Adapter } from '../interfaces/adapter.interface';
2
+ import type { AdapterRegistry } from '../adapters/adapter-registry';
3
+ import type { SyncResult } from '../interfaces/sync-result.interface';
4
+ import type { Action } from './utils/types';
5
+ type EventDeps = {
6
+ adapter: Adapter;
7
+ registry: AdapterRegistry;
8
+ };
9
+ type SkeduloOperation = 'INSERT' | 'UPDATE' | 'DELETE';
10
+ interface SkeduloChange {
11
+ operation: SkeduloOperation;
12
+ recordId: string;
13
+ payload: Record<string, unknown>;
14
+ }
15
+ export interface OnSkeduloEventInput {
16
+ /** Resolved from the `sked-data-flow-id` header (passed by the dispatcher as parse meta). */
17
+ dataFlowId: number;
18
+ changes: SkeduloChange[];
19
+ }
20
+ export interface OnSkeduloEventOutput {
21
+ message: string;
22
+ results: SyncResult[];
23
+ }
24
+ export declare function makeOnSkeduloEventAction(deps: EventDeps): Action<OnSkeduloEventInput, OnSkeduloEventOutput>;
25
+ export type OnVendorEventInput = unknown;
26
+ export interface OnVendorEventOutput {
27
+ message: string;
28
+ results: SyncResult[];
29
+ }
30
+ export declare function makeOnVendorEventAction(deps: EventDeps): Action<OnVendorEventInput, OnVendorEventOutput>;
31
+ export {};
32
+ //# sourceMappingURL=event.action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.action.d.ts","sourceRoot":"","sources":["../../src/actions/event.action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEpE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAItE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAE5C,KAAK,SAAS,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,eAAe,CAAA;CAAE,CAAC;AAIjE,KAAK,gBAAgB,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEvD,UAAU,aAAa;IACrB,SAAS,EAAE,gBAAgB,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,mBAAmB;IAClC,6FAA6F;IAC7F,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AACD,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAkCD,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,SAAS,GACd,MAAM,CAAC,mBAAmB,EAAE,oBAAoB,CAAC,CA8CnD;AAID,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAC;AACzC,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,SAAS,GACd,MAAM,CAAC,kBAAkB,EAAE,mBAAmB,CAAC,CA2CjD"}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.makeOnSkeduloEventAction = makeOnSkeduloEventAction;
4
+ exports.makeOnVendorEventAction = makeOnVendorEventAction;
5
+ const sync_runner_1 = require("../services/sync-runner");
6
+ const action_names_1 = require("./utils/action-names");
7
+ const helpers_1 = require("./utils/helpers");
8
+ const errors_1 = require("./utils/errors");
9
+ /**
10
+ * Parse one element of the ElasticServer triggered-action `call_url` body. Each
11
+ * element is the GraphQL query result wrapped under a single subscription-name
12
+ * key inside `data`, plus an `operation`, e.g.
13
+ * `{ "data": { "contacts": { "UID": "…", "Email": … } }, "operation": "INSERT" }`
14
+ */
15
+ function parseSkeduloChange(raw, index) {
16
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
17
+ throw new errors_1.InvalidInputError(`change[${index}] must be an object`);
18
+ }
19
+ const obj = raw;
20
+ const operation = obj.operation;
21
+ if (operation !== 'INSERT' && operation !== 'UPDATE' && operation !== 'DELETE') {
22
+ throw new errors_1.InvalidInputError(`change[${index}] has unsupported operation: ${String(operation)}`);
23
+ }
24
+ // The record sits under the single key inside `data` (its name is the schema's
25
+ // GraphQL subscription name, which we don't know statically).
26
+ const container = obj.data;
27
+ const record = container && typeof container === 'object' && !Array.isArray(container)
28
+ ? Object.values(container)[0]
29
+ : undefined;
30
+ if (!record || typeof record !== 'object') {
31
+ throw new errors_1.InvalidInputError(`change[${index}] is missing a record under "data"`);
32
+ }
33
+ const recordId = record.UID;
34
+ if (typeof recordId !== 'string' || !recordId) {
35
+ throw new errors_1.InvalidInputError(`change[${index}] record is missing a UID`);
36
+ }
37
+ return { operation, recordId, payload: record };
38
+ }
39
+ function makeOnSkeduloEventAction(deps) {
40
+ return {
41
+ name: action_names_1.ACTIONS.event.onSkedulo,
42
+ parseInput(raw, meta) {
43
+ var _a;
44
+ const dataFlowId = (_a = meta === null || meta === void 0 ? void 0 : meta.dataFlowId) !== null && _a !== void 0 ? _a : raw === null || raw === void 0 ? void 0 : raw.dataFlowId;
45
+ if (!Number.isInteger(dataFlowId) || dataFlowId <= 0) {
46
+ throw new errors_1.InvalidInputError('dataFlowId must be a positive integer');
47
+ }
48
+ // ES posts an array; tolerate `{ changes: [...] }` or a single object for
49
+ // manual / testing calls.
50
+ const obj = (raw !== null && raw !== void 0 ? raw : {});
51
+ const elements = Array.isArray(raw) ? raw : Array.isArray(obj.changes) ? obj.changes : [raw];
52
+ const changes = elements.map(parseSkeduloChange);
53
+ return { dataFlowId: dataFlowId, changes };
54
+ },
55
+ async handler(input, ctx) {
56
+ const integrationType = deps.adapter.integrationType;
57
+ const lookupStrategy = (0, helpers_1.resolveLookupStrategy)(deps.adapter);
58
+ const runner = new sync_runner_1.SyncRunner(deps.registry);
59
+ const results = [];
60
+ for (const change of input.changes) {
61
+ const result = await runner.handleFlowEvent({
62
+ flowId: input.dataFlowId,
63
+ event: {
64
+ integrationType,
65
+ objectType: '',
66
+ operation: change.operation,
67
+ recordId: change.recordId,
68
+ payload: change.payload,
69
+ dataFlowId: input.dataFlowId,
70
+ },
71
+ options: { lookupStrategy },
72
+ }, ctx);
73
+ results.push(result);
74
+ }
75
+ if (results.some((r) => r.status === 'failed')) {
76
+ throw new errors_1.ActionError('PROCESSING_FAILED', 'Skedulo event processing failed', results);
77
+ }
78
+ return { message: 'Skedulo event processed', results };
79
+ },
80
+ };
81
+ }
82
+ function makeOnVendorEventAction(deps) {
83
+ return {
84
+ name: action_names_1.ACTIONS.event.onVendor,
85
+ parseInput(raw) {
86
+ // Vendor payload is opaque — adapter.parseChangeEvent validates inside handler.
87
+ return raw;
88
+ },
89
+ async handler(input, ctx) {
90
+ const adapter = deps.adapter;
91
+ const lookupStrategy = (0, helpers_1.resolveLookupStrategy)(adapter);
92
+ if (!adapter.parseChangeEvent) {
93
+ throw new errors_1.ActionError('NOT_IMPLEMENTED', `${adapter.integrationType} adapter does not implement parseChangeEvent`);
94
+ }
95
+ const parsed = adapter.parseChangeEvent(input);
96
+ if (!('event' in parsed)) {
97
+ throw new errors_1.InvalidInputError(parsed.error);
98
+ }
99
+ const results = await new sync_runner_1.SyncRunner(deps.registry).handleEvent({ event: parsed.event, options: { lookupStrategy } }, ctx);
100
+ if (results.some((r) => r.status === 'precondition_failed')) {
101
+ throw new errors_1.ActionError('PRECONDITION_FAILED', 'Integration not bootstrapped — run /setup then /run-all-flows', results);
102
+ }
103
+ if (results.some((r) => r.status === 'failed')) {
104
+ throw new errors_1.ActionError('PROCESSING_FAILED', 'Event processing failed', results);
105
+ }
106
+ return {
107
+ message: `${parsed.event.objectType} ${parsed.event.operation.toLowerCase()} processed`,
108
+ results,
109
+ };
110
+ },
111
+ };
112
+ }
113
+ //# sourceMappingURL=event.action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.action.js","sourceRoot":"","sources":["../../src/actions/event.action.ts"],"names":[],"mappings":";;AA+DA,4DAgDC;AAUD,0DA6CC;AApKD,yDAAqD;AAErD,uDAA+C;AAC/C,6CAAwD;AACxD,2CAAgE;AAyBhE;;;;;GAKG;AACH,SAAS,kBAAkB,CAAC,GAAY,EAAE,KAAa;IACrD,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,IAAI,0BAAiB,CAAC,UAAU,KAAK,qBAAqB,CAAC,CAAC;IACpE,CAAC;IACD,MAAM,GAAG,GAAG,GAA8B,CAAC;IAC3C,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;IAChC,IAAI,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC/E,MAAM,IAAI,0BAAiB,CAAC,UAAU,KAAK,gCAAgC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAClG,CAAC;IACD,+EAA+E;IAC/E,8DAA8D;IAC9D,MAAM,SAAS,GAAG,GAAG,CAAC,IAA2C,CAAC;IAClE,MAAM,MAAM,GACV,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC;QACrE,CAAC,CAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAyC;QACtE,CAAC,CAAC,SAAS,CAAC;IAChB,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,IAAI,0BAAiB,CAAC,UAAU,KAAK,oCAAoC,CAAC,CAAC;IACnF,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC;IAC5B,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9C,MAAM,IAAI,0BAAiB,CAAC,UAAU,KAAK,2BAA2B,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAClD,CAAC;AAED,SAAgB,wBAAwB,CACtC,IAAe;IAEf,OAAO;QACL,IAAI,EAAE,sBAAO,CAAC,KAAK,CAAC,SAAS;QAC7B,UAAU,CAAC,GAAG,EAAE,IAAI;;YAClB,MAAM,UAAU,GAAG,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,mCAAK,GAA+B,aAA/B,GAAG,uBAAH,GAAG,CAA8B,UAAU,CAAC;YACpF,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAK,UAAqB,IAAI,CAAC,EAAE,CAAC;gBACjE,MAAM,IAAI,0BAAiB,CAAC,uCAAuC,CAAC,CAAC;YACvE,CAAC;YACD,0EAA0E;YAC1E,0BAA0B;YAC1B,MAAM,GAAG,GAAG,CAAC,GAAG,aAAH,GAAG,cAAH,GAAG,GAAI,EAAE,CAA4B,CAAC;YACnD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC7F,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YACjD,OAAO,EAAE,UAAU,EAAE,UAAoB,EAAE,OAAO,EAAE,CAAC;QACvD,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;YACtB,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;YACrD,MAAM,cAAc,GAAG,IAAA,+BAAqB,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3D,MAAM,MAAM,GAAG,IAAI,wBAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAE7C,MAAM,OAAO,GAAiB,EAAE,CAAC;YACjC,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBACnC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,eAAe,CACzC;oBACE,MAAM,EAAE,KAAK,CAAC,UAAU;oBACxB,KAAK,EAAE;wBACL,eAAe;wBACf,UAAU,EAAE,EAAE;wBACd,SAAS,EAAE,MAAM,CAAC,SAAS;wBAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;wBACzB,OAAO,EAAE,MAAM,CAAC,OAAO;wBACvB,UAAU,EAAE,KAAK,CAAC,UAAU;qBAC7B;oBACD,OAAO,EAAE,EAAE,cAAc,EAAE;iBAC5B,EACD,GAAG,CACJ,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACvB,CAAC;YAED,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,EAAE,CAAC;gBAC/C,MAAM,IAAI,oBAAW,CAAC,mBAAmB,EAAE,iCAAiC,EAAE,OAAO,CAAC,CAAC;YACzF,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,yBAAyB,EAAE,OAAO,EAAE,CAAC;QACzD,CAAC;KACF,CAAC;AACJ,CAAC;AAUD,SAAgB,uBAAuB,CACrC,IAAe;IAEf,OAAO;QACL,IAAI,EAAE,sBAAO,CAAC,KAAK,CAAC,QAAQ;QAC5B,UAAU,CAAC,GAAG;YACZ,gFAAgF;YAChF,OAAO,GAAG,CAAC;QACb,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;YACtB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YAC7B,MAAM,cAAc,GAAG,IAAA,+BAAqB,EAAC,OAAO,CAAC,CAAC;YAEtD,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;gBAC9B,MAAM,IAAI,oBAAW,CACnB,iBAAiB,EACjB,GAAG,OAAO,CAAC,eAAe,8CAA8C,CACzE,CAAC;YACJ,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAC/C,IAAI,CAAC,CAAC,OAAO,IAAI,MAAM,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,0BAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC5C,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,IAAI,wBAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,CAC7D,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,cAAc,EAAE,EAAE,EACpD,GAAG,CACJ,CAAC;YAEF,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,qBAAqB,CAAC,EAAE,CAAC;gBAC5D,MAAM,IAAI,oBAAW,CACnB,qBAAqB,EACrB,+DAA+D,EAC/D,OAAO,CACR,CAAC;YACJ,CAAC;YACD,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,EAAE,CAAC;gBAC/C,MAAM,IAAI,oBAAW,CAAC,mBAAmB,EAAE,yBAAyB,EAAE,OAAO,CAAC,CAAC;YACjF,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,IAAI,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE,YAAY;gBACvF,OAAO;aACR,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,44 @@
1
+ import type { Adapter, DataFlowTemplate, FieldInfo, ObjectInfo, SampleAPI, SampleRecord } from '../interfaces/adapter.interface';
2
+ import type { Action } from './utils/types';
3
+ export interface GetObjectsInput {
4
+ system?: string;
5
+ }
6
+ export interface GetObjectsOutput {
7
+ system: string;
8
+ objects: ObjectInfo[];
9
+ }
10
+ export declare function makeGetObjectsAction(adapter: Adapter): Action<GetObjectsInput, GetObjectsOutput>;
11
+ export interface GetFieldsInput {
12
+ system?: string;
13
+ object: string;
14
+ }
15
+ export interface GetFieldsOutput {
16
+ system: string;
17
+ object: string;
18
+ fields: FieldInfo[];
19
+ }
20
+ export declare function makeGetFieldsAction(adapter: Adapter): Action<GetFieldsInput, GetFieldsOutput>;
21
+ export interface GetTemplatesInput {
22
+ system?: string;
23
+ }
24
+ export interface GetTemplatesOutput {
25
+ templates: DataFlowTemplate[];
26
+ }
27
+ export declare function makeGetTemplatesAction(adapter: Adapter): Action<GetTemplatesInput, GetTemplatesOutput>;
28
+ export interface GetSampleApisInput {
29
+ system?: string;
30
+ }
31
+ export interface GetSampleApisOutput {
32
+ apis: SampleAPI[];
33
+ }
34
+ export declare function makeGetSampleApisAction(adapter: Adapter): Action<GetSampleApisInput, GetSampleApisOutput>;
35
+ export interface GetSampleRecordsInput {
36
+ system?: string;
37
+ objectType: string;
38
+ limit: number;
39
+ }
40
+ export interface GetSampleRecordsOutput {
41
+ records: SampleRecord[];
42
+ }
43
+ export declare function makeGetSampleRecordsAction(adapter: Adapter): Action<GetSampleRecordsInput, GetSampleRecordsOutput>;
44
+ //# sourceMappingURL=metadata.action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.action.d.ts","sourceRoot":"","sources":["../../src/actions/metadata.action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,gBAAgB,EAChB,SAAS,EACT,UAAU,EACV,SAAS,EACT,YAAY,EACb,MAAM,iCAAiC,CAAC;AAIzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAY5C,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AACD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC,CAUhG;AAID,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AACD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,CAAC,cAAc,EAAE,eAAe,CAAC,CAkB7F;AAID,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AACD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,gBAAgB,EAAE,CAAC;CAC/B;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,OAAO,GACf,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,CAU/C;AAID,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AACD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,SAAS,EAAE,CAAC;CACnB;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,OAAO,GACf,MAAM,CAAC,kBAAkB,EAAE,mBAAmB,CAAC,CAUjD;AAID,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf;AACD,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,GACf,MAAM,CAAC,qBAAqB,EAAE,sBAAsB,CAAC,CA6BvD"}