@skedulo/integration-sdk 0.6.0 → 0.8.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.
- package/CHANGELOG.md +21 -0
- package/dist/actions/action-registry.d.ts.map +1 -1
- package/dist/actions/action-registry.js +1 -0
- package/dist/actions/action-registry.js.map +1 -1
- package/dist/actions/data-flow/index.d.ts +1 -0
- package/dist/actions/data-flow/index.d.ts.map +1 -1
- package/dist/actions/data-flow/index.js +3 -1
- package/dist/actions/data-flow/index.js.map +1 -1
- package/dist/actions/data-flow/preview.action.d.ts +14 -0
- package/dist/actions/data-flow/preview.action.d.ts.map +1 -0
- package/dist/actions/data-flow/preview.action.js +85 -0
- package/dist/actions/data-flow/preview.action.js.map +1 -0
- package/dist/actions/data-flow/types.d.ts +21 -0
- package/dist/actions/data-flow/types.d.ts.map +1 -1
- package/dist/actions/metadata/get-sample-records.action.d.ts.map +1 -1
- package/dist/actions/metadata/get-sample-records.action.js +9 -3
- package/dist/actions/metadata/get-sample-records.action.js.map +1 -1
- package/dist/actions/metadata/types.d.ts +6 -0
- package/dist/actions/metadata/types.d.ts.map +1 -1
- package/dist/actions/utils/action-names.d.ts +1 -0
- package/dist/actions/utils/action-names.d.ts.map +1 -1
- package/dist/actions/utils/action-names.js +1 -0
- package/dist/actions/utils/action-names.js.map +1 -1
- package/dist/actions/utils/middleware.d.ts.map +1 -1
- package/dist/actions/utils/middleware.js +10 -2
- package/dist/actions/utils/middleware.js.map +1 -1
- package/dist/adapters/skedulo.adapter.d.ts +8 -0
- package/dist/adapters/skedulo.adapter.d.ts.map +1 -1
- package/dist/adapters/skedulo.adapter.js +51 -7
- package/dist/adapters/skedulo.adapter.js.map +1 -1
- package/dist/browser.d.ts +1 -0
- package/dist/browser.d.ts.map +1 -1
- package/dist/constants.d.ts +7 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +8 -1
- package/dist/constants.js.map +1 -1
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +4 -0
- package/dist/context.js.map +1 -1
- package/dist/services/external-id-sync.strategy.d.ts.map +1 -1
- package/dist/services/external-id-sync.strategy.js +15 -3
- package/dist/services/external-id-sync.strategy.js.map +1 -1
- package/dist/services/field-mapping.service.d.ts +27 -3
- package/dist/services/field-mapping.service.d.ts.map +1 -1
- package/dist/services/field-mapping.service.js +80 -30
- package/dist/services/field-mapping.service.js.map +1 -1
- package/dist/services/id-mapping-sync.strategy.d.ts.map +1 -1
- package/dist/services/id-mapping-sync.strategy.js +15 -3
- package/dist/services/id-mapping-sync.strategy.js.map +1 -1
- package/dist/services/id-mapping.service.d.ts.map +1 -1
- package/dist/services/id-mapping.service.js +26 -21
- package/dist/services/id-mapping.service.js.map +1 -1
- package/dist/services/preview.service.d.ts +4 -2
- package/dist/services/preview.service.d.ts.map +1 -1
- package/dist/services/preview.service.js +12 -11
- package/dist/services/preview.service.js.map +1 -1
- package/dist/services/sync.service.d.ts.map +1 -1
- package/dist/services/sync.service.js +31 -24
- package/dist/services/sync.service.js.map +1 -1
- package/dist/utils/artifact-builder.d.ts.map +1 -1
- package/dist/utils/artifact-builder.js +5 -6
- package/dist/utils/artifact-builder.js.map +1 -1
- package/dist/utils/helpers.d.ts +1 -0
- package/dist/utils/helpers.d.ts.map +1 -1
- package/dist/utils/helpers.js +8 -0
- package/dist/utils/helpers.js.map +1 -1
- package/package.json +2 -2
- package/yarn.lock +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.8.0] - 2026-06-18
|
|
4
|
+
|
|
5
|
+
**Data flow preview + mapping-aware field selection (COR-386 / COR-385).**
|
|
6
|
+
|
|
7
|
+
- New `data-flow.preview` action wired to `PreviewService` — loads sample records and maps them (no write), returning a per-record verdict. Accepts an inline draft flow.
|
|
8
|
+
- Source fields are derived from mapping expressions via `getReferencedFields` (shared `deriveSourceFields`) in preview, the Skedulo adapter fetch, and the artifact builder — fixes the preview "URI too long" error. `metadata.get-sample-records` also accepts an optional `fields` list.
|
|
9
|
+
- Mapping errors are no longer counted as "filtered": `filterAndMapBatch` and both realtime strategies separate a mapping ERROR from a SKIP and surface errors to the run log.
|
|
10
|
+
- Bumps `@skedulo/field-mapping-engine` to 1.2.0.
|
|
11
|
+
|
|
12
|
+
## [0.7.0] - 2026-06-12
|
|
13
|
+
|
|
14
|
+
**Fixes**
|
|
15
|
+
|
|
16
|
+
- Cap each `processBatch` at `MAX_MUTATION_BATCH_SIZE` (200) so a source batch larger than Skedulo's 500-record mutation limit no longer triggers `too_many_mutations`. `SyncService.run` splits each batch into sub-batches, bounding every downstream write. `IdMappingService.upsertMappings` and `deleteReservations` also chunk at the cap as defense in depth.
|
|
17
|
+
- `skeduloAdapter` IdMapping updates now use a true `update` mutation instead of `upsert`. The `upsert` input type requires every non-null field (e.g. `Availabilities.ResourceId` is `ID!`), which can't be supplied on update when the field is insert-only — a catch-22. `update<Obj>(input:{UID,…})` identifies by UID and only writes the provided fields. Combined with stripping insert-only/read-only fields from update payloads (which Skedulo otherwise rejects with `field_write_access`), updates to objects with required insert-only fields now succeed. Stripped fields remain on the create path; object metadata is cached per object.
|
|
18
|
+
|
|
19
|
+
**Other**
|
|
20
|
+
|
|
21
|
+
- `ctx.logger` now tags every record with `execution_id` (the request id) so a single run's logs are searchable in Datadog.
|
|
22
|
+
- The `[action.end]` log line now carries `execution_metrics` (`totalCalls`, `peakConcurrentRequests`), emitted centrally from `withLogging` — no per-handler wiring.
|
|
23
|
+
|
|
3
24
|
## [0.6.0]
|
|
4
25
|
|
|
5
26
|
**Integration run logs — observable data-flow runs (COR-243).**
|
|
@@ -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;
|
|
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"}
|
|
@@ -25,6 +25,7 @@ function buildActionRegistry({ adapter, registry, }) {
|
|
|
25
25
|
(0, metadata_1.makeGetTemplatesAction)(adapter),
|
|
26
26
|
(0, metadata_1.makeGetSampleApisAction)(adapter),
|
|
27
27
|
(0, metadata_1.makeGetSampleRecordsAction)(adapter),
|
|
28
|
+
(0, data_flow_1.makeDataFlowPreviewAction)(adapter),
|
|
28
29
|
// Skedulo bootstrap.
|
|
29
30
|
(0, setup_action_1.makeSetupStatusAction)(),
|
|
30
31
|
(0, setup_action_1.makeSetupCreateAction)(adapter),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-registry.js","sourceRoot":"","sources":["../../src/actions/action-registry.ts"],"names":[],"mappings":";;
|
|
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"}
|
|
@@ -6,4 +6,5 @@ export { makeDataFlowActivateAction } from './activate.action';
|
|
|
6
6
|
export { makeDataFlowDeactivateAction } from './deactivate.action';
|
|
7
7
|
export { makeDataFlowGetAction } from './get.action';
|
|
8
8
|
export { makeDataFlowListAction } from './list.action';
|
|
9
|
+
export { makeDataFlowPreviewAction } from './preview.action';
|
|
9
10
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/actions/data-flow/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/actions/data-flow/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAC/D,OAAO,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -14,7 +14,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.makeDataFlowListAction = exports.makeDataFlowGetAction = exports.makeDataFlowDeactivateAction = exports.makeDataFlowActivateAction = exports.makeDataFlowDeleteAction = exports.makeDataFlowUpdateAction = exports.makeDataFlowCreateAction = void 0;
|
|
17
|
+
exports.makeDataFlowPreviewAction = exports.makeDataFlowListAction = exports.makeDataFlowGetAction = exports.makeDataFlowDeactivateAction = exports.makeDataFlowActivateAction = exports.makeDataFlowDeleteAction = exports.makeDataFlowUpdateAction = exports.makeDataFlowCreateAction = void 0;
|
|
18
18
|
__exportStar(require("./types"), exports);
|
|
19
19
|
var create_action_1 = require("./create.action");
|
|
20
20
|
Object.defineProperty(exports, "makeDataFlowCreateAction", { enumerable: true, get: function () { return create_action_1.makeDataFlowCreateAction; } });
|
|
@@ -30,4 +30,6 @@ var get_action_1 = require("./get.action");
|
|
|
30
30
|
Object.defineProperty(exports, "makeDataFlowGetAction", { enumerable: true, get: function () { return get_action_1.makeDataFlowGetAction; } });
|
|
31
31
|
var list_action_1 = require("./list.action");
|
|
32
32
|
Object.defineProperty(exports, "makeDataFlowListAction", { enumerable: true, get: function () { return list_action_1.makeDataFlowListAction; } });
|
|
33
|
+
var preview_action_1 = require("./preview.action");
|
|
34
|
+
Object.defineProperty(exports, "makeDataFlowPreviewAction", { enumerable: true, get: function () { return preview_action_1.makeDataFlowPreviewAction; } });
|
|
33
35
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/actions/data-flow/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,iDAA2D;AAAlD,yHAAA,wBAAwB,OAAA;AACjC,iDAA2D;AAAlD,yHAAA,wBAAwB,OAAA;AACjC,iDAA2D;AAAlD,yHAAA,wBAAwB,OAAA;AACjC,qDAA+D;AAAtD,6HAAA,0BAA0B,OAAA;AACnC,yDAAmE;AAA1D,iIAAA,4BAA4B,OAAA;AACrC,2CAAqD;AAA5C,mHAAA,qBAAqB,OAAA;AAC9B,6CAAuD;AAA9C,qHAAA,sBAAsB,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/actions/data-flow/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,iDAA2D;AAAlD,yHAAA,wBAAwB,OAAA;AACjC,iDAA2D;AAAlD,yHAAA,wBAAwB,OAAA;AACjC,iDAA2D;AAAlD,yHAAA,wBAAwB,OAAA;AACjC,qDAA+D;AAAtD,6HAAA,0BAA0B,OAAA;AACnC,yDAAmE;AAA1D,iIAAA,4BAA4B,OAAA;AACrC,2CAAqD;AAA5C,mHAAA,qBAAqB,OAAA;AAC9B,6CAAuD;AAA9C,qHAAA,sBAAsB,OAAA;AAC/B,mDAA6D;AAApD,2HAAA,yBAAyB,OAAA"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Adapter } from '../../interfaces/adapter.interface';
|
|
2
|
+
import type { Action } from '../utils/types';
|
|
3
|
+
import type { DataFlowPreviewInput, DataFlowPreviewOutput } from './types';
|
|
4
|
+
/**
|
|
5
|
+
* Preview a draft data flow: load sample records (requesting only the fields the
|
|
6
|
+
* mapping references — see deriveSourceFields) and run them through the mapping
|
|
7
|
+
* engine, returning a per-record will_sync / filtered_out / missing_required_field
|
|
8
|
+
* / transform_error verdict. Read-only; never writes to the target.
|
|
9
|
+
*
|
|
10
|
+
* Works on an unsaved draft (input carries the flow config inline) so the UI can
|
|
11
|
+
* preview before persisting.
|
|
12
|
+
*/
|
|
13
|
+
export declare function makeDataFlowPreviewAction(adapter: Adapter): Action<DataFlowPreviewInput, DataFlowPreviewOutput>;
|
|
14
|
+
//# sourceMappingURL=preview.action.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview.action.d.ts","sourceRoot":"","sources":["../../../src/actions/data-flow/preview.action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAC;AAWlE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,SAAS,CAAC;AAE3E;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,OAAO,GACf,MAAM,CAAC,oBAAoB,EAAE,qBAAqB,CAAC,CAkDrD"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.makeDataFlowPreviewAction = makeDataFlowPreviewAction;
|
|
4
|
+
const preview_service_1 = require("../../services/preview.service");
|
|
5
|
+
const field_mapping_service_1 = require("../../services/field-mapping.service");
|
|
6
|
+
const constants_1 = require("../../constants");
|
|
7
|
+
const action_names_1 = require("../utils/action-names");
|
|
8
|
+
const errors_1 = require("../utils/errors");
|
|
9
|
+
const helpers_1 = require("../utils/helpers");
|
|
10
|
+
const shared_1 = require("../metadata/shared");
|
|
11
|
+
/**
|
|
12
|
+
* Preview a draft data flow: load sample records (requesting only the fields the
|
|
13
|
+
* mapping references — see deriveSourceFields) and run them through the mapping
|
|
14
|
+
* engine, returning a per-record will_sync / filtered_out / missing_required_field
|
|
15
|
+
* / transform_error verdict. Read-only; never writes to the target.
|
|
16
|
+
*
|
|
17
|
+
* Works on an unsaved draft (input carries the flow config inline) so the UI can
|
|
18
|
+
* preview before persisting.
|
|
19
|
+
*/
|
|
20
|
+
function makeDataFlowPreviewAction(adapter) {
|
|
21
|
+
return {
|
|
22
|
+
name: action_names_1.ACTIONS.dataFlow.preview,
|
|
23
|
+
parseInput(raw) {
|
|
24
|
+
var _a;
|
|
25
|
+
const obj = (raw !== null && raw !== void 0 ? raw : {});
|
|
26
|
+
const sourceObject = obj.sourceObject;
|
|
27
|
+
if (typeof sourceObject !== 'string' || !sourceObject) {
|
|
28
|
+
throw new errors_1.InvalidInputError('sourceObject is required');
|
|
29
|
+
}
|
|
30
|
+
const limit = obj.limit === undefined ? shared_1.DEFAULT_SAMPLE_RECORD_LIMIT : Number(obj.limit);
|
|
31
|
+
if (!Number.isInteger(limit) || limit <= 0) {
|
|
32
|
+
throw new errors_1.InvalidInputError('limit must be a positive integer');
|
|
33
|
+
}
|
|
34
|
+
// Guard object-shaped inputs so a primitive/array from the wire can't slip
|
|
35
|
+
// past the type assertion into PreviewService.
|
|
36
|
+
const asRecord = (v) => v && typeof v === 'object' && !Array.isArray(v)
|
|
37
|
+
? v
|
|
38
|
+
: undefined;
|
|
39
|
+
return {
|
|
40
|
+
sourceSystem: typeof obj.sourceSystem === 'string' ? obj.sourceSystem : undefined,
|
|
41
|
+
sourceObject,
|
|
42
|
+
targetSystem: typeof obj.targetSystem === 'string' ? obj.targetSystem : undefined,
|
|
43
|
+
targetObject: typeof obj.targetObject === 'string' ? obj.targetObject : undefined,
|
|
44
|
+
mappingConfig: (_a = asRecord(obj.mappingConfig)) !== null && _a !== void 0 ? _a : null,
|
|
45
|
+
filter: asRecord(obj.filter),
|
|
46
|
+
limit,
|
|
47
|
+
sampleRecord: asRecord(obj.sampleRecord),
|
|
48
|
+
};
|
|
49
|
+
},
|
|
50
|
+
async handler(input, ctx) {
|
|
51
|
+
var _a;
|
|
52
|
+
const flow = buildPreviewFlow(input, adapter);
|
|
53
|
+
// Inbound (vendor source) preview fetches via the adapter; outbound
|
|
54
|
+
// (Skedulo source) falls through to PreviewService's default query fetcher.
|
|
55
|
+
const inbound = ((_a = input.sourceSystem) !== null && _a !== void 0 ? _a : adapter.integrationType) !== constants_1.SKEDULO_SYSTEM;
|
|
56
|
+
const sampleFetcher = inbound
|
|
57
|
+
? async (f, size, c) => {
|
|
58
|
+
var _a;
|
|
59
|
+
const { adapter: source } = (0, helpers_1.resolveSystem)(adapter, (_a = f.sourceSystem) !== null && _a !== void 0 ? _a : undefined);
|
|
60
|
+
return source.fetchSampleRecords(c, f.sourceObject, (0, field_mapping_service_1.deriveSourceFields)(f), size);
|
|
61
|
+
}
|
|
62
|
+
: undefined;
|
|
63
|
+
const results = await new preview_service_1.PreviewService().run({ flow, sampleSize: input.limit, sampleRecord: input.sampleRecord, sampleFetcher }, ctx);
|
|
64
|
+
return { results };
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/** Build an ephemeral (unsaved) DataFlow from inline preview input. */
|
|
69
|
+
function buildPreviewFlow(input, adapter) {
|
|
70
|
+
var _a, _b, _c;
|
|
71
|
+
return {
|
|
72
|
+
id: 0,
|
|
73
|
+
name: 'preview',
|
|
74
|
+
tenantIntegrationId: 0,
|
|
75
|
+
integrationType: adapter.integrationType,
|
|
76
|
+
sourceSystem: (_a = input.sourceSystem) !== null && _a !== void 0 ? _a : null,
|
|
77
|
+
targetSystem: (_b = input.targetSystem) !== null && _b !== void 0 ? _b : null,
|
|
78
|
+
sourceObject: input.sourceObject,
|
|
79
|
+
targetObject: (_c = input.targetObject) !== null && _c !== void 0 ? _c : '',
|
|
80
|
+
mappingConfig: input.mappingConfig,
|
|
81
|
+
filter: input.filter,
|
|
82
|
+
matchKeyField: '',
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=preview.action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preview.action.js","sourceRoot":"","sources":["../../../src/actions/data-flow/preview.action.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import type { UpdateDataFlowPatch } from '../../clients/dataflow.client';
|
|
2
|
+
import type { MappingConfigDto } from '../../interfaces/field-mapping.interface';
|
|
3
|
+
import type { FilterSpec } from '../../interfaces/filter.interface';
|
|
4
|
+
import type { PreviewResult } from '../../interfaces/sync-result.interface';
|
|
2
5
|
export interface DataFlowUpdateInput {
|
|
3
6
|
id: number;
|
|
4
7
|
patch: UpdateDataFlowPatch;
|
|
@@ -18,4 +21,22 @@ export interface DataFlowGetInput {
|
|
|
18
21
|
export interface DataFlowListInput {
|
|
19
22
|
filter?: import('../../clients/dataflow.client').DataFlowListParams;
|
|
20
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* Preview an unsaved draft flow: load sample records (using only the fields the
|
|
26
|
+
* mapping references) and run them through the mapping engine without writing.
|
|
27
|
+
*/
|
|
28
|
+
export interface DataFlowPreviewInput {
|
|
29
|
+
sourceSystem?: string;
|
|
30
|
+
sourceObject: string;
|
|
31
|
+
targetSystem?: string;
|
|
32
|
+
targetObject?: string;
|
|
33
|
+
mappingConfig: MappingConfigDto | null;
|
|
34
|
+
filter?: FilterSpec;
|
|
35
|
+
limit: number;
|
|
36
|
+
/** Preview a single caller-supplied record instead of fetching samples. */
|
|
37
|
+
sampleRecord?: Record<string, unknown>;
|
|
38
|
+
}
|
|
39
|
+
export interface DataFlowPreviewOutput {
|
|
40
|
+
results: PreviewResult[];
|
|
41
|
+
}
|
|
21
42
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/actions/data-flow/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/actions/data-flow/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAE5E,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,mBAAmB,CAAC;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,OAAO,+BAA+B,EAAE,kBAAkB,CAAC;CACrE;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACvC,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-sample-records.action.d.ts","sourceRoot":"","sources":["../../../src/actions/metadata/get-sample-records.action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAC;AAIlE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,KAAK,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAE7E,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,GACf,MAAM,CAAC,qBAAqB,EAAE,sBAAsB,CAAC,
|
|
1
|
+
{"version":3,"file":"get-sample-records.action.d.ts","sourceRoot":"","sources":["../../../src/actions/metadata/get-sample-records.action.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oCAAoC,CAAC;AAIlE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,KAAK,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAE7E,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,GACf,MAAM,CAAC,qBAAqB,EAAE,sBAAsB,CAAC,CAoCvD"}
|
|
@@ -19,12 +19,18 @@ function makeGetSampleRecordsAction(adapter) {
|
|
|
19
19
|
if (!Number.isInteger(limit) || limit <= 0) {
|
|
20
20
|
throw new errors_1.InvalidInputError('limit must be a positive integer');
|
|
21
21
|
}
|
|
22
|
-
|
|
22
|
+
const fields = Array.isArray(obj.fields)
|
|
23
|
+
? obj.fields.filter((f) => typeof f === 'string')
|
|
24
|
+
: undefined;
|
|
25
|
+
return { system, objectType, limit, fields };
|
|
23
26
|
},
|
|
24
27
|
async handler(input, ctx) {
|
|
25
28
|
const { adapter: resolved } = (0, helpers_1.resolveSystem)(adapter, input.system);
|
|
26
|
-
|
|
27
|
-
|
|
29
|
+
// Use the caller-supplied fields when provided; otherwise fall back to all
|
|
30
|
+
// fields (can overflow the vendor URI limit on wide objects — COR-386).
|
|
31
|
+
const properties = input.fields && input.fields.length > 0
|
|
32
|
+
? input.fields
|
|
33
|
+
: (await resolved.getFields(ctx, input.objectType)).map((f) => f.name);
|
|
28
34
|
const records = await resolved.fetchSampleRecords(ctx, input.objectType, properties, input.limit);
|
|
29
35
|
return { records };
|
|
30
36
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-sample-records.action.js","sourceRoot":"","sources":["../../../src/actions/metadata/get-sample-records.action.ts"],"names":[],"mappings":";;AAQA,
|
|
1
|
+
{"version":3,"file":"get-sample-records.action.js","sourceRoot":"","sources":["../../../src/actions/metadata/get-sample-records.action.ts"],"names":[],"mappings":";;AAQA,gEAsCC;AA7CD,wDAAgD;AAChD,8CAAiD;AACjD,4CAAoD;AAEpD,qCAAuD;AAGvD,SAAgB,0BAA0B,CACxC,OAAgB;IAEhB,OAAO;QACL,IAAI,EAAE,sBAAO,CAAC,QAAQ,CAAC,gBAAgB;QACvC,UAAU,CAAC,GAAG;YACZ,MAAM,GAAG,GAAG,CAAC,GAAG,aAAH,GAAG,cAAH,GAAG,GAAI,EAAE,CAA4B,CAAC;YACnD,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;YACvE,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;YAClC,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,CAAC,UAAU,EAAE,CAAC;gBAClD,MAAM,IAAI,0BAAiB,CAAC,wBAAwB,CAAC,CAAC;YACxD,CAAC;YACD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,oCAA2B,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACxF,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,CAAC;gBAC3C,MAAM,IAAI,0BAAiB,CAAC,kCAAkC,CAAC,CAAC;YAClE,CAAC;YACD,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC;gBACtC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;gBAC9D,CAAC,CAAC,SAAS,CAAC;YACd,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAC/C,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;YACtB,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAA,uBAAa,EAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YACnE,2EAA2E;YAC3E,wEAAwE;YACxE,MAAM,UAAU,GACd,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;gBACrC,CAAC,CAAC,KAAK,CAAC,MAAM;gBACd,CAAC,CAAC,CAAC,MAAM,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC3E,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,kBAAkB,CAC/C,GAAG,EACH,KAAK,CAAC,UAAU,EAChB,UAAU,EACV,KAAK,CAAC,KAAK,CACZ,CAAC;YACF,OAAO,EAAE,OAAO,EAAE,CAAC;QACrB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -31,6 +31,12 @@ export interface GetSampleRecordsInput {
|
|
|
31
31
|
system?: string;
|
|
32
32
|
objectType: string;
|
|
33
33
|
limit: number;
|
|
34
|
+
/**
|
|
35
|
+
* Restrict the fetch to these fields. When omitted, falls back to all fields
|
|
36
|
+
* from getFields() — which can overflow the vendor's URI length limit, so
|
|
37
|
+
* callers should pass the fields they actually need (COR-386).
|
|
38
|
+
*/
|
|
39
|
+
fields?: string[];
|
|
34
40
|
}
|
|
35
41
|
export interface GetSampleRecordsOutput {
|
|
36
42
|
records: SampleRecord[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/actions/metadata/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,SAAS,EACT,UAAU,EACV,SAAS,EACT,YAAY,EACb,MAAM,oCAAoC,CAAC;AAE5C,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,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,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AACD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,gBAAgB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AACD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,SAAS,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/actions/metadata/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,SAAS,EACT,UAAU,EACV,SAAS,EACT,YAAY,EACb,MAAM,oCAAoC,CAAC;AAE5C,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,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,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AACD,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,gBAAgB,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AACD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,SAAS,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AACD,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,YAAY,EAAE,CAAC;CACzB"}
|
|
@@ -59,6 +59,7 @@ export declare const ACTIONS: Readonly<{
|
|
|
59
59
|
deactivate: "data-flow.deactivate";
|
|
60
60
|
get: "data-flow.get";
|
|
61
61
|
list: "data-flow.list";
|
|
62
|
+
preview: "data-flow.preview";
|
|
62
63
|
}>;
|
|
63
64
|
}>;
|
|
64
65
|
export type ActionName = typeof ACTIONS.capabilities | (typeof ACTIONS.setup)[keyof typeof ACTIONS.setup] | (typeof ACTIONS.metadata)[keyof typeof ACTIONS.metadata] | (typeof ACTIONS.sync)[keyof typeof ACTIONS.sync] | (typeof ACTIONS.scheduledJob)[keyof typeof ACTIONS.scheduledJob] | (typeof ACTIONS.event)[keyof typeof ACTIONS.event] | (typeof ACTIONS.dataFlow)[keyof typeof ACTIONS.dataFlow];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-names.d.ts","sourceRoot":"","sources":["../../../src/actions/utils/action-names.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,aAAa,4BAA4B,CAAC;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,sBAAsB,CAAC;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,4BAA4B,CAAC;AAEnE;;;;;GAKG;AACH,eAAO,MAAM,OAAO
|
|
1
|
+
{"version":3,"file":"action-names.d.ts","sourceRoot":"","sources":["../../../src/actions/utils/action-names.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,aAAa,4BAA4B,CAAC;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,sBAAsB,CAAC;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,4BAA4B,CAAC;AAEnE;;;;;GAKG;AACH,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsCT,CAAC;AAEZ,MAAM,MAAM,UAAU,GAClB,OAAO,OAAO,CAAC,YAAY,GAC3B,CAAC,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,OAAO,CAAC,KAAK,CAAC,GAClD,CAAC,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,OAAO,OAAO,CAAC,QAAQ,CAAC,GACxD,CAAC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,OAAO,OAAO,CAAC,IAAI,CAAC,GAChD,CAAC,OAAO,OAAO,CAAC,YAAY,CAAC,CAAC,MAAM,OAAO,OAAO,CAAC,YAAY,CAAC,GAChE,CAAC,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,OAAO,OAAO,CAAC,KAAK,CAAC,GAClD,CAAC,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-names.js","sourceRoot":"","sources":["../../../src/actions/utils/action-names.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACU,QAAA,aAAa,GAAG,yBAAyB,CAAC;AAEvD;;;;;GAKG;AACU,QAAA,mBAAmB,GAAG,mBAAmB,CAAC;AAEvD;;;;;GAKG;AACU,QAAA,yBAAyB,GAAG,yBAAyB,CAAC;AAEnE;;;;;GAKG;AACU,QAAA,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;IACnC,YAAY,EAAE,cAAc;IAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QACnB,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,cAAc;KACvB,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;QACtB,UAAU,EAAE,sBAAsB;QAClC,SAAS,EAAE,qBAAqB;QAChC,YAAY,EAAE,wBAAwB;QACtC,aAAa,EAAE,0BAA0B;QACzC,gBAAgB,EAAE,6BAA6B;KAChD,CAAC;IACF,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;QAClB,OAAO,EAAE,eAAe;QACxB,MAAM,EAAE,cAAc;KACvB,CAAC;IACF,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC;QAC1B,MAAM,EAAE,sBAAsB;QAC9B,MAAM,EAAE,sBAAsB;QAC9B,MAAM,EAAE,sBAAsB;QAC9B,IAAI,EAAE,oBAAoB;QAC1B,GAAG,EAAE,mBAAmB;KACzB,CAAC;IACF,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QACnB,SAAS,EAAE,kBAAkB;QAC7B,QAAQ,EAAE,iBAAiB;KAC5B,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;QACtB,MAAM,EAAE,kBAAkB;QAC1B,MAAM,EAAE,kBAAkB;QAC1B,MAAM,EAAE,kBAAkB;QAC1B,QAAQ,EAAE,oBAAoB;QAC9B,UAAU,EAAE,sBAAsB;QAClC,GAAG,EAAE,eAAe;QACpB,IAAI,EAAE,gBAAgB;
|
|
1
|
+
{"version":3,"file":"action-names.js","sourceRoot":"","sources":["../../../src/actions/utils/action-names.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACU,QAAA,aAAa,GAAG,yBAAyB,CAAC;AAEvD;;;;;GAKG;AACU,QAAA,mBAAmB,GAAG,mBAAmB,CAAC;AAEvD;;;;;GAKG;AACU,QAAA,yBAAyB,GAAG,yBAAyB,CAAC;AAEnE;;;;;GAKG;AACU,QAAA,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;IACnC,YAAY,EAAE,cAAc;IAC5B,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QACnB,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,cAAc;KACvB,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;QACtB,UAAU,EAAE,sBAAsB;QAClC,SAAS,EAAE,qBAAqB;QAChC,YAAY,EAAE,wBAAwB;QACtC,aAAa,EAAE,0BAA0B;QACzC,gBAAgB,EAAE,6BAA6B;KAChD,CAAC;IACF,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;QAClB,OAAO,EAAE,eAAe;QACxB,MAAM,EAAE,cAAc;KACvB,CAAC;IACF,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC;QAC1B,MAAM,EAAE,sBAAsB;QAC9B,MAAM,EAAE,sBAAsB;QAC9B,MAAM,EAAE,sBAAsB;QAC9B,IAAI,EAAE,oBAAoB;QAC1B,GAAG,EAAE,mBAAmB;KACzB,CAAC;IACF,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC;QACnB,SAAS,EAAE,kBAAkB;QAC7B,QAAQ,EAAE,iBAAiB;KAC5B,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;QACtB,MAAM,EAAE,kBAAkB;QAC1B,MAAM,EAAE,kBAAkB;QAC1B,MAAM,EAAE,kBAAkB;QAC1B,QAAQ,EAAE,oBAAoB;QAC9B,UAAU,EAAE,sBAAsB;QAClC,GAAG,EAAE,eAAe;QACpB,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,mBAAmB;KAC7B,CAAC;CACM,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../src/actions/utils/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAIxD,gEAAgE;AAChE,MAAM,MAAM,aAAa,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,kBAAkB,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AAEpF,2EAA2E;AAC3E,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,UAAU,EAAE,OAAO,CAAC;IACpB,yCAAyC;IACzC,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC,EAC5B,IAAI,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EACzB,IAAI,EAAE,cAAc,KACjB,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAEzB,wBAAgB,OAAO,CAAC,CAAC,EAAE,CAAC,EAC1B,WAAW,EAAE,aAAa,CAAC,UAAU,CAAC,EACtC,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EAC5B,IAAI,EAAE,cAAc,GACnB,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAErB;AAID;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../src/actions/utils/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAIxD,gEAAgE;AAChE,MAAM,MAAM,aAAa,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,kBAAkB,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC;AAEpF,2EAA2E;AAC3E,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,UAAU,EAAE,OAAO,CAAC;IACpB,yCAAyC;IACzC,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC,EAC5B,IAAI,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EACzB,IAAI,EAAE,cAAc,KACjB,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAEzB,wBAAgB,OAAO,CAAC,CAAC,EAAE,CAAC,EAC1B,WAAW,EAAE,aAAa,CAAC,UAAU,CAAC,EACtC,OAAO,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EAC5B,IAAI,EAAE,cAAc,GACnB,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAErB;AAID;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,UA0BzB,CAAC;AAWF;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,UAezB,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,SAAS,EAAE,UAUvB,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,YAAY,EAAE,UAK1B,CAAC"}
|
|
@@ -19,19 +19,27 @@ const withLogging = (next, meta) => async (input, ctx) => {
|
|
|
19
19
|
`idempotent=${meta.idempotent}`);
|
|
20
20
|
try {
|
|
21
21
|
const result = await next(input, ctx);
|
|
22
|
+
// Attach the run's execution metrics to the end line so they land as searchable
|
|
23
|
+
// fields in Datadog, scoped to this run.
|
|
22
24
|
ctx.logger.info(`[action.end] name=${meta.actionName} requestId=${ctx.requestId} ` +
|
|
23
|
-
`status=ok duration_ms=${Date.now() - startedAt}
|
|
25
|
+
`status=ok duration_ms=${Date.now() - startedAt}`, { execution_metrics: executionMetrics(ctx) });
|
|
24
26
|
return result;
|
|
25
27
|
}
|
|
26
28
|
catch (err) {
|
|
27
29
|
const e = err;
|
|
28
30
|
ctx.logger.warn(`[action.end] name=${meta.actionName} requestId=${ctx.requestId} ` +
|
|
29
31
|
`status=error duration_ms=${Date.now() - startedAt} ` +
|
|
30
|
-
`code=${(_a = e.code) !== null && _a !== void 0 ? _a : 'INTERNAL'} message=${(_b = e.message) !== null && _b !== void 0 ? _b : String(err)}
|
|
32
|
+
`code=${(_a = e.code) !== null && _a !== void 0 ? _a : 'INTERNAL'} message=${(_b = e.message) !== null && _b !== void 0 ? _b : String(err)}`, { execution_metrics: executionMetrics(ctx) });
|
|
31
33
|
throw err;
|
|
32
34
|
}
|
|
33
35
|
};
|
|
34
36
|
exports.withLogging = withLogging;
|
|
37
|
+
// Just the two fields we track in Datadog — the full snapshot's per-method maps are noise.
|
|
38
|
+
function executionMetrics(ctx) {
|
|
39
|
+
var _a;
|
|
40
|
+
const { totalCalls = 0, peakConcurrentRequests = 0 } = (_a = ctx.getExecutionMetrics()) !== null && _a !== void 0 ? _a : {};
|
|
41
|
+
return { totalCalls, peakConcurrentRequests };
|
|
42
|
+
}
|
|
35
43
|
/**
|
|
36
44
|
* Emit a counter per (action, status[, code]) and a duration histogram. Tags
|
|
37
45
|
* stay low-cardinality — `code` is bounded by the error taxonomy.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../src/actions/utils/middleware.ts"],"names":[],"mappings":";;;AAyBA,0BAMC;AA9BD,iDAAqD;AACrD,qCAA0C;AAuB1C,SAAgB,OAAO,CACrB,WAAsC,EACtC,OAA4B,EAC5B,IAAoB;IAEpB,OAAO,WAAW,CAAC,WAAW,CAAsB,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;AAC7F,CAAC;AAED,gFAAgF;AAEhF;;;GAGG;AACI,MAAM,WAAW,GAAe,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;;IAC1E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,GAAG,CAAC,MAAM,CAAC,IAAI,CACb,uBAAuB,IAAI,CAAC,UAAU,cAAc,GAAG,CAAC,SAAS,GAAG;QAClE,cAAc,IAAI,CAAC,UAAU,EAAE,CAClC,CAAC;IACF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACtC,GAAG,CAAC,MAAM,CAAC,IAAI,CACb,qBAAqB,IAAI,CAAC,UAAU,cAAc,GAAG,CAAC,SAAS,GAAG;YAChE,yBAAyB,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../src/actions/utils/middleware.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,7 @@ export declare class SkeduloAdapter implements Adapter<Record<string, unknown>>
|
|
|
12
12
|
readonly allowNewDataFlows: true;
|
|
13
13
|
readonly hasDataFlows: true;
|
|
14
14
|
};
|
|
15
|
+
private readonly _nonUpdatableByObject;
|
|
15
16
|
checkBootstrap(ctx: IntegrationContext): Promise<BootstrapStatus>;
|
|
16
17
|
bootstrap(ctx: IntegrationContext): Promise<void>;
|
|
17
18
|
fetch(ctx: IntegrationContext, flow: DataFlow, since: Date | null, _filter: FilterSpec | null): AsyncIterable<Record<string, unknown>[]>;
|
|
@@ -29,6 +30,13 @@ export declare class SkeduloAdapter implements Adapter<Record<string, unknown>>
|
|
|
29
30
|
getObjects(ctx: IntegrationContext): Promise<ObjectInfo[]>;
|
|
30
31
|
getFields(ctx: IntegrationContext, objectName: string): Promise<FieldInfo[]>;
|
|
31
32
|
fetchSampleRecords(ctx: IntegrationContext, objectName: string, properties: string[], limit: number): Promise<SampleRecord[]>;
|
|
33
|
+
/**
|
|
34
|
+
* Field names that can't be written on update — accessMode insert-only or
|
|
35
|
+
* read-only in the object's metadata. Cached per object (metadata is stable).
|
|
36
|
+
* On a metadata fetch failure, returns empty (no stripping) without caching, so
|
|
37
|
+
* a transient error doesn't permanently disable stripping for the process.
|
|
38
|
+
*/
|
|
39
|
+
private _nonUpdatableFields;
|
|
32
40
|
private _batchLookup;
|
|
33
41
|
}
|
|
34
42
|
export declare const skeduloAdapter: SkeduloAdapter;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skedulo.adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/skedulo.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wCAAwC,CAAC;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,SAAS,EACT,UAAU,EACV,YAAY,EACZ,aAAa,EACd,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"skedulo.adapter.d.ts","sourceRoot":"","sources":["../../src/adapters/skedulo.adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wCAAwC,CAAC;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AACjE,OAAO,KAAK,EACV,OAAO,EACP,cAAc,EACd,SAAS,EACT,UAAU,EACV,YAAY,EACZ,aAAa,EACd,MAAM,iCAAiC,CAAC;AAQzC,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,OAAO,CAAC;CACnB;AAKD,qBAAa,cAAe,YAAW,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrE,QAAQ,CAAC,eAAe,aAAkB;IAE1C,QAAQ,CAAC,YAAY;;;;MAIV;IAIX,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAkC;IAMlE,cAAc,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,eAAe,CAAC;IAIjE,SAAS,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAMhD,KAAK,CACV,GAAG,EAAE,kBAAkB,EACvB,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,IAAI,GAAG,IAAI,EAClB,OAAO,EAAE,UAAU,GAAG,IAAI,GACzB,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAoCrC,cAAc,CAClB,GAAG,EAAE,kBAAkB,EACvB,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,cAAc,EAAE,GACtB,OAAO,CAAC,IAAI,CAAC;IAyCV,MAAM,CACV,GAAG,EAAE,kBAAkB,EACvB,IAAI,EAAE,QAAQ,EACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GACjC,OAAO,CAAC,aAAa,EAAE,CAAC;YA4Db,OAAO;IA2Cf,MAAM,CAAC,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBnF,iGAAiG;IAC3F,UAAU,CAAC,GAAG,EAAE,kBAAkB,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAWvF,gBAAgB,IAAI,MAAM;IAI1B,mBAAmB,CACjB,SAAS,EAAE,MAAM,EAAE,EACnB,QAAQ,EAAE,aAAa,EAAE,GACxB,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAQ1C,UAAU,CAAC,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAO1D,SAAS,CAAC,GAAG,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAe5E,kBAAkB,CACtB,GAAG,EAAE,kBAAkB,EACvB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAAE,EACpB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,YAAY,EAAE,CAAC;IAa1B;;;;;OAKG;YACW,mBAAmB;YA4BnB,YAAY;CA+B3B;AASD,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
|
|
@@ -28,6 +28,7 @@ exports.skeduloAdapter = exports.SkeduloAdapter = void 0;
|
|
|
28
28
|
const constants_1 = require("../constants");
|
|
29
29
|
const helpers_1 = require("../utils/helpers");
|
|
30
30
|
const id_mapping_service_1 = require("../services/id-mapping.service");
|
|
31
|
+
const field_mapping_service_1 = require("../services/field-mapping.service");
|
|
31
32
|
const SKEDULO_PAGE_SIZE = 200;
|
|
32
33
|
// Skedulo adapter covers both source (fetch from Skedulo for outbound batch sync)
|
|
33
34
|
// and target (upsert/delete into Skedulo for inbound sync) roles.
|
|
@@ -40,6 +41,9 @@ class SkeduloAdapter {
|
|
|
40
41
|
allowNewDataFlows: true,
|
|
41
42
|
hasDataFlows: true,
|
|
42
43
|
};
|
|
44
|
+
// Cache of field names that can't be written on update (insert-only/read-only),
|
|
45
|
+
// keyed by object name. Object metadata is stable within a process.
|
|
46
|
+
this._nonUpdatableByObject = new Map();
|
|
43
47
|
}
|
|
44
48
|
// ── Bootstrap ───────────────────────────────────────────────────────────────
|
|
45
49
|
// The Skedulo side owns the IntegrationIdMapping custom object that backs the
|
|
@@ -53,9 +57,8 @@ class SkeduloAdapter {
|
|
|
53
57
|
// ── Source role ─────────────────────────────────────────────────────────────
|
|
54
58
|
fetch(ctx, flow, since, _filter) {
|
|
55
59
|
return __asyncGenerator(this, arguments, function* fetch_1() {
|
|
56
|
-
var _a, _b
|
|
57
|
-
const
|
|
58
|
-
const fields = [...new Set(['UID', 'LastModifiedDate', ...sourceFields])];
|
|
60
|
+
var _a, _b;
|
|
61
|
+
const fields = [...new Set(['UID', 'LastModifiedDate', ...(0, field_mapping_service_1.deriveSourceFields)(flow)])];
|
|
59
62
|
let lastUID = null;
|
|
60
63
|
while (true) {
|
|
61
64
|
const clauses = [];
|
|
@@ -74,13 +77,13 @@ class SkeduloAdapter {
|
|
|
74
77
|
if (eqlFilter)
|
|
75
78
|
query.withFilter(eqlFilter);
|
|
76
79
|
const result = yield __await(query.execute());
|
|
77
|
-
const records = ((
|
|
80
|
+
const records = ((_a = result === null || result === void 0 ? void 0 : result.records) !== null && _a !== void 0 ? _a : []);
|
|
78
81
|
if (records.length === 0)
|
|
79
82
|
break;
|
|
80
83
|
yield yield __await(records);
|
|
81
84
|
if (records.length < SKEDULO_PAGE_SIZE)
|
|
82
85
|
break;
|
|
83
|
-
lastUID = String((
|
|
86
|
+
lastUID = String((_b = records[records.length - 1]['UID']) !== null && _b !== void 0 ? _b : '');
|
|
84
87
|
if (!lastUID)
|
|
85
88
|
break;
|
|
86
89
|
}
|
|
@@ -141,11 +144,22 @@ class SkeduloAdapter {
|
|
|
141
144
|
}
|
|
142
145
|
const outcomes = new Array(records.length);
|
|
143
146
|
if (updateIndices.length > 0) {
|
|
147
|
+
// Skedulo rejects writes to insert-only/read-only fields on update
|
|
148
|
+
// (field_write_access) — e.g. Availabilities.ResourceId is insert-only.
|
|
149
|
+
// Strip them so an update only carries the fields it's allowed to change;
|
|
150
|
+
// they remain on the create path below.
|
|
151
|
+
const nonUpdatable = await this._nonUpdatableFields(ctx, flow.targetObject);
|
|
144
152
|
const updateRecords = updateIndices.map((i) => {
|
|
145
153
|
const _a = records[i], { __targetUID } = _a, rest = __rest(_a, ["__targetUID"]);
|
|
154
|
+
for (const field of nonUpdatable)
|
|
155
|
+
delete rest[field];
|
|
146
156
|
return Object.assign(Object.assign({}, rest), { UID: String(__targetUID) });
|
|
147
157
|
});
|
|
148
|
-
|
|
158
|
+
// Use a true update (not upsert): the upsert input type requires every non-null
|
|
159
|
+
// field (e.g. Availabilities.ResourceId is ID!), which we can't supply on update
|
|
160
|
+
// since it's insert-only. update<Obj>(input:{UID,…}) identifies by UID and only
|
|
161
|
+
// writes the fields provided.
|
|
162
|
+
const updateOutcomes = await this._mutate(ctx, flow, updateRecords, 'update');
|
|
149
163
|
updateIndices.forEach((origIdx, batchIdx) => {
|
|
150
164
|
outcomes[origIdx] = updateOutcomes[batchIdx];
|
|
151
165
|
});
|
|
@@ -173,7 +187,9 @@ class SkeduloAdapter {
|
|
|
173
187
|
};
|
|
174
188
|
const result = operation === 'insert'
|
|
175
189
|
? await ctx.graphqlService.insert(params)
|
|
176
|
-
:
|
|
190
|
+
: operation === 'update'
|
|
191
|
+
? await ctx.graphqlService.update(params)
|
|
192
|
+
: await ctx.graphqlService.upsert(params);
|
|
177
193
|
if (result.errors && result.errors.length > 0) {
|
|
178
194
|
// Bound length here so the message stays sane in every downstream sink (console + DB log).
|
|
179
195
|
const message = (0, helpers_1.truncate)(JSON.stringify(result.errors));
|
|
@@ -268,6 +284,34 @@ class SkeduloAdapter {
|
|
|
268
284
|
return ((_a = result === null || result === void 0 ? void 0 : result.records) !== null && _a !== void 0 ? _a : []);
|
|
269
285
|
}
|
|
270
286
|
// ── Private helpers ──────────────────────────────────────────────────────────
|
|
287
|
+
/**
|
|
288
|
+
* Field names that can't be written on update — accessMode insert-only or
|
|
289
|
+
* read-only in the object's metadata. Cached per object (metadata is stable).
|
|
290
|
+
* On a metadata fetch failure, returns empty (no stripping) without caching, so
|
|
291
|
+
* a transient error doesn't permanently disable stripping for the process.
|
|
292
|
+
*/
|
|
293
|
+
async _nonUpdatableFields(ctx, objectName) {
|
|
294
|
+
var _a, _b;
|
|
295
|
+
const cached = this._nonUpdatableByObject.get(objectName);
|
|
296
|
+
if (cached)
|
|
297
|
+
return cached;
|
|
298
|
+
try {
|
|
299
|
+
const all = await ctx.metadataClient.fetchAllMetadata();
|
|
300
|
+
const entry = (all !== null && all !== void 0 ? all : []).find((m) => m.name === objectName || m.mapping === objectName);
|
|
301
|
+
const lookupKey = (_a = entry === null || entry === void 0 ? void 0 : entry.mapping) !== null && _a !== void 0 ? _a : objectName;
|
|
302
|
+
const metadata = await ctx.metadataClient.fetchObjectMetadata(lookupKey);
|
|
303
|
+
const set = new Set(((_b = metadata.fields) !== null && _b !== void 0 ? _b : [])
|
|
304
|
+
.filter((f) => f.accessMode === 'insert_only' || f.accessMode === 'read_only')
|
|
305
|
+
.map((f) => f.name));
|
|
306
|
+
this._nonUpdatableByObject.set(objectName, set);
|
|
307
|
+
return set;
|
|
308
|
+
}
|
|
309
|
+
catch (err) {
|
|
310
|
+
ctx.logger.warn(`skedulo_metadata_unavailable: object=${objectName} — not stripping insert-only fields on update ` +
|
|
311
|
+
`(${err instanceof Error ? err.message : String(err)})`);
|
|
312
|
+
return new Set();
|
|
313
|
+
}
|
|
314
|
+
}
|
|
271
315
|
async _batchLookup(ctx, objectName, keyField, values) {
|
|
272
316
|
var _a, _b, _c;
|
|
273
317
|
const result = new Map();
|