@fluentcommerce/fc-connect-sdk 0.1.54 → 0.1.55
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 +12 -0
- package/dist/cjs/clients/fluent-client.js +13 -6
- package/dist/cjs/utils/pagination-helpers.js +38 -2
- package/dist/cjs/versori/fluent-versori-client.js +11 -5
- package/dist/esm/clients/fluent-client.js +13 -6
- package/dist/esm/utils/pagination-helpers.js +38 -2
- package/dist/esm/versori/fluent-versori-client.js +11 -5
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/tsconfig.types.tsbuildinfo +1 -1
- package/docs/00-START-HERE/EXPORT-VALIDATION.md +158 -158
- package/docs/00-START-HERE/cli-analyze-source-structure-guide.md +655 -655
- package/docs/00-START-HERE/cli-documentation-index.md +202 -202
- package/docs/00-START-HERE/cli-quick-reference.md +252 -252
- package/docs/00-START-HERE/decision-tree.md +552 -552
- package/docs/00-START-HERE/getting-started.md +1070 -1070
- package/docs/00-START-HERE/mapper-quick-decision-guide.md +235 -235
- package/docs/00-START-HERE/readme.md +237 -237
- package/docs/00-START-HERE/retailerid-configuration.md +404 -404
- package/docs/00-START-HERE/sdk-philosophy.md +794 -794
- package/docs/00-START-HERE/troubleshooting-quick-reference.md +1086 -1086
- package/docs/01-TEMPLATES/faq.md +686 -686
- package/docs/01-TEMPLATES/patterns/pattern-templates-guide.md +68 -68
- package/docs/01-TEMPLATES/patterns/patterns-csv-schema-validation-and-rejection-report.md +233 -233
- package/docs/01-TEMPLATES/patterns/patterns-custom-resolvers.md +407 -407
- package/docs/01-TEMPLATES/patterns/patterns-error-handling-retry.md +511 -511
- package/docs/01-TEMPLATES/patterns/patterns-field-mapping-universal.md +701 -701
- package/docs/01-TEMPLATES/patterns/patterns-large-file-splitting.md +1430 -1430
- package/docs/01-TEMPLATES/patterns/patterns-master-data-etl.md +2399 -2399
- package/docs/01-TEMPLATES/patterns/patterns-pagination-streaming.md +447 -447
- package/docs/01-TEMPLATES/patterns/patterns-state-duplicate-prevention.md +385 -385
- package/docs/01-TEMPLATES/readme.md +957 -957
- package/docs/01-TEMPLATES/standalone/standalone-asn-inbound-processing.md +1209 -1209
- package/docs/01-TEMPLATES/standalone/standalone-graphql-query-export.md +1140 -1140
- package/docs/01-TEMPLATES/standalone/standalone-graphql-to-parquet-partitioned-s3.md +432 -432
- package/docs/01-TEMPLATES/standalone/standalone-multi-channel-inventory-sync.md +1185 -1185
- package/docs/01-TEMPLATES/standalone/standalone-multi-source-aggregation.md +1462 -1462
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-batch-api.md +1390 -1390
- package/docs/01-TEMPLATES/standalone/standalone-s3-csv-inventory-to-batch.md +330 -330
- package/docs/01-TEMPLATES/standalone/standalone-scripts-guide.md +87 -87
- package/docs/01-TEMPLATES/standalone/standalone-sftp-xml-graphql.md +1444 -1444
- package/docs/01-TEMPLATES/standalone/standalone-webhook-payload-processing.md +688 -688
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-dropship-order-routing.md +193 -193
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-graphql-parquet-extraction.md +518 -518
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-inter-location-transfers.md +2162 -2162
- package/docs/01-TEMPLATES/versori/business-examples/business-examples-pre-order-allocation.md +2226 -2226
- package/docs/01-TEMPLATES/versori/business-examples/business-scenarios-guide.md +87 -87
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-connection-validation-pattern.md +656 -656
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-dual-workflow-connector.md +835 -835
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-guide.md +108 -108
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-kv-state-management.md +1533 -1533
- package/docs/01-TEMPLATES/versori/patterns/versori-patterns-xml-response-patterns.md +1160 -1160
- package/docs/01-TEMPLATES/versori/versori-platform-guide.md +201 -201
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-asn-purchase-order.md +1906 -1906
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-dropship-routing.md +1074 -1074
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-flash-sale-reserve.md +1395 -1395
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-generic-xml-order.md +888 -888
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-payment-gateway-integration.md +2478 -2478
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-rma-returns-comprehensive.md +2240 -2240
- package/docs/01-TEMPLATES/versori/webhooks/template-webhook-xml-order-ingestion.md +2029 -2029
- package/docs/01-TEMPLATES/versori/webhooks/webhook-templates-guide.md +140 -140
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/inventory-mapping.json +20 -20
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/products_2025-01-22.csv +11 -11
- package/docs/01-TEMPLATES/versori/workflows/_examples/sample-data/sample-data-guide.md +34 -34
- package/docs/01-TEMPLATES/versori/workflows/_examples/workflow-examples-guide.md +36 -36
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-modes-guide.md +1038 -1038
- package/docs/01-TEMPLATES/versori/workflows/extraction/extraction-workflows-guide.md +138 -138
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/graphql-extraction-guide.md +63 -63
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-csv.md +2062 -2062
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-fulfillments-to-sftp-xml.md +2294 -2294
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-s3-csv.md +2461 -2461
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-positions-to-sftp-xml.md +2529 -2529
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-csv.md +2464 -2464
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-inventory-quantities-to-s3-json.md +1959 -1959
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-s3-csv.md +1953 -1953
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-orders-to-sftp-xml.md +2541 -2541
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-s3-json.md +2384 -2384
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-products-to-sftp-xml.md +2445 -2445
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-csv.md +2355 -2355
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-s3-json.md +2042 -2042
- package/docs/01-TEMPLATES/versori/workflows/extraction/graphql-queries/template-extraction-virtual-positions-to-sftp-xml.md +2726 -2726
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/batch-api-guide.md +206 -206
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-cycle-count-reconciliation.md +2030 -2030
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-multi-channel-inventory-sync.md +1882 -1882
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-csv-inventory-batch.md +2827 -2827
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-json-inventory-batch.md +1952 -1952
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-s3-xml-inventory-batch.md +3289 -3289
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-csv-inventory-batch.md +3064 -3064
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-json-inventory-batch.md +3238 -3238
- package/docs/01-TEMPLATES/versori/workflows/ingestion/batch-api/template-ingestion-sftp-xml-inventory-batch.md +2977 -2977
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/event-api-guide.md +321 -321
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-json-order-cancel-event.md +959 -959
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-payload-xml-order-cancel-event.md +1170 -1170
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-csv-product-event.md +2312 -2312
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-json-product-event.md +2999 -2999
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-parquet-product-event.md +2836 -2836
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-s3-xml-product-event.md +2395 -2395
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-csv-product-event.md +2295 -2295
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-json-product-event.md +2602 -2602
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-parquet-product-event.md +2589 -2589
- package/docs/01-TEMPLATES/versori/workflows/ingestion/event-api/template-ingestion-sftp-xml-product-event.md +3578 -3578
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/graphql-mutations-guide.md +93 -93
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-json-order-update-graphql.md +1260 -1260
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-payload-xml-order-update-graphql.md +1472 -1472
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-control-graphql.md +2417 -2417
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-location-graphql.md +2811 -2811
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-csv-price-graphql.md +2619 -2619
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-json-location-graphql.md +2807 -2807
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-s3-xml-location-graphql.md +2373 -2373
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-control-graphql.md +2740 -2740
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-csv-location-graphql.md +2760 -2760
- package/docs/01-TEMPLATES/versori/workflows/ingestion/graphql-mutations/template-ingestion-sftp-json-location-graphql.md +1710 -1710
- package/docs/01-TEMPLATES/versori/workflows/ingestion/ingestion-workflows-guide.md +136 -136
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/rubix-webhooks-guide.md +520 -520
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-inline.md +1418 -1418
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-fulfilment-to-sftp-xml-universal-mapper.md +1785 -1785
- package/docs/01-TEMPLATES/versori/workflows/rubix-webhooks/template-webhook-rubix-order-attribute-update.md +824 -824
- package/docs/01-TEMPLATES/versori/workflows/workflows-overview-guide.md +646 -646
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-batch-archival.md +724 -724
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-job-tracker.md +627 -627
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-partial-batch-recovery.md +561 -561
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-quick-reference.md +367 -367
- package/docs/02-CORE-GUIDES/advanced-services/advanced-services-readme.md +407 -407
- package/docs/02-CORE-GUIDES/advanced-services/readme.md +49 -49
- package/docs/02-CORE-GUIDES/api-reference/api-reference-quick-reference.md +548 -548
- package/docs/02-CORE-GUIDES/api-reference/event-api-input-output-reference.md +702 -1171
- package/docs/02-CORE-GUIDES/api-reference/examples/client-initialization.ts +286 -286
- package/docs/02-CORE-GUIDES/api-reference/graphql-error-classification.md +337 -337
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-01-client-api.md +399 -520
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-03-authentication.md +199 -199
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-04-graphql-mapping.md +925 -925
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-05-services.md +1198 -1198
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-06-data-sources.md +1083 -1083
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-07-parsers.md +1097 -1097
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-pagination.md +513 -513
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-08-types.md +545 -597
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-error-handling.md +527 -527
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-09-webhook-validation.md +514 -514
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-extraction.md +557 -557
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-10-utilities.md +412 -412
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-cli-tools.md +423 -423
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-11-error-handling.md +716 -716
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-analyze-source-structure.md +518 -518
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-partial-responses.md +212 -212
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-12-testing.md +300 -300
- package/docs/02-CORE-GUIDES/api-reference/modules/api-reference-13-resolver-builder.md +322 -322
- package/docs/02-CORE-GUIDES/api-reference/readme.md +279 -279
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-quick-reference.md +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/auto-pagination-readme.md +277 -277
- package/docs/02-CORE-GUIDES/auto-pagination/examples/auto-pagination-readme.md +178 -178
- package/docs/02-CORE-GUIDES/auto-pagination/examples/common-patterns.ts +351 -351
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-products.ts +384 -384
- package/docs/02-CORE-GUIDES/auto-pagination/examples/paginate-virtual-positions.ts +308 -308
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-01-foundations.md +470 -470
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-02-quick-start.md +713 -713
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-03-configuration.md +754 -754
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-04-advanced-patterns.md +732 -732
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-05-sdk-integration.md +847 -847
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-06-troubleshooting.md +359 -359
- package/docs/02-CORE-GUIDES/auto-pagination/modules/auto-pagination-07-api-reference.md +462 -462
- package/docs/02-CORE-GUIDES/auto-pagination/readme.md +54 -54
- package/docs/02-CORE-GUIDES/data-sources/data-sources-file-operations-error-handling.md +1487 -1487
- package/docs/02-CORE-GUIDES/data-sources/data-sources-quick-reference.md +836 -836
- package/docs/02-CORE-GUIDES/data-sources/data-sources-readme.md +276 -276
- package/docs/02-CORE-GUIDES/data-sources/data-sources-sftp-credential-access-security.md +553 -553
- package/docs/02-CORE-GUIDES/data-sources/examples/common-patterns.ts +409 -409
- package/docs/02-CORE-GUIDES/data-sources/examples/data-sources-readme.md +178 -178
- package/docs/02-CORE-GUIDES/data-sources/examples/s3-operations.ts +308 -308
- package/docs/02-CORE-GUIDES/data-sources/examples/sftp-operations.ts +371 -371
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-01-foundations.md +735 -735
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-02-s3-operations.md +1302 -1302
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-03-sftp-operations.md +1379 -1379
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-04-file-patterns.md +941 -941
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-05-advanced-topics.md +813 -813
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-06-integration-patterns.md +486 -486
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-07-troubleshooting.md +387 -387
- package/docs/02-CORE-GUIDES/data-sources/modules/data-sources-08-api-reference.md +417 -417
- package/docs/02-CORE-GUIDES/data-sources/readme.md +77 -77
- package/docs/02-CORE-GUIDES/error-handling-guide.md +936 -936
- package/docs/02-CORE-GUIDES/extraction/examples/02-core-guides-extraction-readme.md +116 -116
- package/docs/02-CORE-GUIDES/extraction/examples/common-patterns.ts +428 -428
- package/docs/02-CORE-GUIDES/extraction/examples/extract-inventory-basic.ts +187 -187
- package/docs/02-CORE-GUIDES/extraction/extraction-quick-reference.md +596 -596
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-01-foundations.md +514 -514
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-02-basic-extraction.md +823 -823
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-03-parquet-processing.md +507 -507
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-04-data-enrichment.md +546 -546
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-05-transformation.md +494 -494
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-export-formats.md +458 -458
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-06-performance.md +138 -138
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-api-reference.md +148 -148
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-07-optimization.md +692 -692
- package/docs/02-CORE-GUIDES/extraction/modules/02-core-guides-extraction-08-extraction-orchestrator.md +1008 -1008
- package/docs/02-CORE-GUIDES/extraction/readme.md +151 -151
- package/docs/02-CORE-GUIDES/ingestion/examples/_simple-kv-store.ts +40 -40
- package/docs/02-CORE-GUIDES/ingestion/examples/error-recovery.ts +728 -728
- package/docs/02-CORE-GUIDES/ingestion/examples/event-driven.ts +501 -501
- package/docs/02-CORE-GUIDES/ingestion/examples/local-file-ingestion.ts +88 -88
- package/docs/02-CORE-GUIDES/ingestion/examples/parquet-ingestion.ts +117 -117
- package/docs/02-CORE-GUIDES/ingestion/examples/performance-optimized.ts +647 -647
- package/docs/02-CORE-GUIDES/ingestion/examples/s3-csv-ingestion.ts +169 -169
- package/docs/02-CORE-GUIDES/ingestion/examples/sftp-csv-ingestion.ts +134 -134
- package/docs/02-CORE-GUIDES/ingestion/ingestion-quick-reference.md +546 -546
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-01-introduction.md +626 -626
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-02-quick-start.md +658 -658
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-03-data-sources.md +1052 -1052
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-04-field-mapping.md +763 -763
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-05-advanced-parsers.md +676 -676
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-06-batch-api.md +1295 -1295
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-api-reference.md +138 -138
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-07-state-management.md +1037 -1037
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-08-performance-optimization.md +1349 -1349
- package/docs/02-CORE-GUIDES/ingestion/modules/02-core-guides-ingestion-09-best-practices.md +1893 -1893
- package/docs/02-CORE-GUIDES/ingestion/readme.md +160 -160
- package/docs/02-CORE-GUIDES/logging-guide.md +585 -585
- package/docs/02-CORE-GUIDES/mapping/error-handling-patterns.md +401 -401
- package/docs/02-CORE-GUIDES/mapping/examples/02-core-guides-mapping-readme.md +128 -128
- package/docs/02-CORE-GUIDES/mapping/examples/common-patterns.ts +273 -273
- package/docs/02-CORE-GUIDES/mapping/examples/csv-location-ingestion.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/csv-mapping.ts +242 -242
- package/docs/02-CORE-GUIDES/mapping/examples/graphql-to-parquet-extraction.json +36 -36
- package/docs/02-CORE-GUIDES/mapping/examples/json-mapping.ts +213 -213
- package/docs/02-CORE-GUIDES/mapping/examples/json-product-to-mutation.json +48 -48
- package/docs/02-CORE-GUIDES/mapping/examples/xml-mapping.ts +291 -291
- package/docs/02-CORE-GUIDES/mapping/examples/xml-order-to-mutation.json +45 -45
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-quick-reference.md +463 -463
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/graphql-mutation-mapping-readme.md +227 -227
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-01-introduction.md +222 -222
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-02-quick-start.md +351 -351
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-03-schema-validation.md +569 -569
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-04-mapping-patterns.md +471 -471
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-05-configuration-reference.md +611 -611
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-advanced-xpath.md +148 -148
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-06-path-syntax.md +464 -464
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-api-reference.md +94 -94
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-07-array-handling.md +307 -307
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-08-custom-resolvers.md +544 -544
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-09-advanced-patterns.md +427 -427
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-10-hooks-and-variables.md +336 -336
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-11-error-handling.md +488 -488
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-12-arguments-vs-nodes.md +383 -383
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/modules/graphql-mutation-mapping-13-best-practices.md +477 -477
- package/docs/02-CORE-GUIDES/mapping/graphql-mutation-mapping/readme.md +62 -62
- package/docs/02-CORE-GUIDES/mapping/mapping-format-decision-tree.md +480 -480
- package/docs/02-CORE-GUIDES/mapping/mapping-graphql-alias-batching-guide.md +820 -820
- package/docs/02-CORE-GUIDES/mapping/mapping-javascript-objects.md +2369 -2369
- package/docs/02-CORE-GUIDES/mapping/mapping-mapper-comparison-guide.md +682 -682
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-07-api-reference.md +1327 -1327
- package/docs/02-CORE-GUIDES/mapping/modules/02-core-guides-mapping-08-error-handling.md +1142 -1142
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-04-use-cases.md +891 -891
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-helpers-resolvers.md +1126 -1126
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-06-sdk-resolvers.md +199 -199
- package/docs/02-CORE-GUIDES/mapping/modules/mapping-07-api-reference.md +1319 -1319
- package/docs/02-CORE-GUIDES/mapping/readme.md +178 -178
- package/docs/02-CORE-GUIDES/mapping/resolver-registration.md +410 -410
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/common-patterns.ts +226 -226
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/custom-resolvers.ts +227 -227
- package/docs/02-CORE-GUIDES/mapping/resolvers/examples/sdk-resolvers-usage.ts +203 -203
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-readme.md +274 -274
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-api-reference.md +679 -679
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-cookbook.md +826 -826
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-guide.md +1330 -1330
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-helpers-reference.md +1437 -1437
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-parameters-reference.md +553 -553
- package/docs/02-CORE-GUIDES/mapping/resolvers/mapping-resolvers-resolver-troubleshooting.md +854 -854
- package/docs/02-CORE-GUIDES/mapping/resolvers/readme.md +75 -75
- package/docs/02-CORE-GUIDES/parsers/examples/02-core-guides-parsers-readme.md +161 -161
- package/docs/02-CORE-GUIDES/parsers/examples/csv-parser-examples.ts +110 -110
- package/docs/02-CORE-GUIDES/parsers/examples/json-parser-examples.ts +33 -33
- package/docs/02-CORE-GUIDES/parsers/examples/parquet-parser-examples.ts +47 -47
- package/docs/02-CORE-GUIDES/parsers/examples/xml-parser-examples.ts +38 -38
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-01-foundations.md +355 -355
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-02-csv-parser.md +772 -772
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-03-json-parser.md +789 -789
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-04-xml-parser.md +857 -857
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-05-parquet-parser.md +603 -603
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-integration-patterns.md +702 -702
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-06-streaming.md +121 -121
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-api-reference.md +89 -89
- package/docs/02-CORE-GUIDES/parsers/modules/02-core-guides-parsers-07-troubleshooting.md +727 -727
- package/docs/02-CORE-GUIDES/parsers/parsers-quick-reference.md +482 -482
- package/docs/02-CORE-GUIDES/parsers/parsers-readme.md +258 -258
- package/docs/02-CORE-GUIDES/parsers/readme.md +65 -65
- package/docs/02-CORE-GUIDES/readme.md +194 -194
- package/docs/02-CORE-GUIDES/webhook-validation/examples/basic-validation.ts +108 -108
- package/docs/02-CORE-GUIDES/webhook-validation/examples/common-patterns.ts +316 -316
- package/docs/02-CORE-GUIDES/webhook-validation/examples/webhook-validation-readme.md +61 -61
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-01-foundations.md +440 -440
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-02-quick-start.md +525 -525
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-03-versori-integration.md +741 -741
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-04-platform-integration.md +629 -629
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-05-configuration.md +535 -535
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-error-handling.md +611 -611
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-06-troubleshooting.md +124 -124
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-07-api-reference.md +511 -511
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-08-rubix-webhooks.md +590 -590
- package/docs/02-CORE-GUIDES/webhook-validation/modules/webhook-validation-09-rubix-event-vs-http-call.md +432 -432
- package/docs/02-CORE-GUIDES/webhook-validation/readme.md +239 -239
- package/docs/02-CORE-GUIDES/webhook-validation/webhook-validation-quick-reference.md +392 -392
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-quick-reference.md +498 -498
- package/docs/03-PATTERN-GUIDES/connector-scenarios/connector-scenarios-readme.md +313 -313
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/common-patterns.ts +612 -612
- package/docs/03-PATTERN-GUIDES/connector-scenarios/examples/connector-scenarios-readme.md +253 -253
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-01-foundations.md +452 -452
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-02-simple-scenarios.md +681 -681
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-03-intermediate-scenarios.md +637 -637
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-04-advanced-scenarios.md +650 -650
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-05-bidirectional-sync.md +233 -233
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-06-production-patterns.md +442 -442
- package/docs/03-PATTERN-GUIDES/connector-scenarios/modules/connector-scenarios-07-reference.md +445 -445
- package/docs/03-PATTERN-GUIDES/connector-scenarios/readme.md +31 -31
- package/docs/03-PATTERN-GUIDES/enterprise-integration-patterns.md +1528 -1528
- package/docs/03-PATTERN-GUIDES/error-handling/comprehensive-error-handling-guide.md +1437 -1437
- package/docs/03-PATTERN-GUIDES/error-handling/error-handling-quick-reference.md +390 -390
- package/docs/03-PATTERN-GUIDES/error-handling/examples/common-patterns.ts +438 -438
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-01-foundations.md +362 -362
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-02-error-types.md +850 -850
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-03-utf8-handling.md +456 -456
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-04-error-scenarios.md +658 -658
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-05-calling-patterns.md +671 -671
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-06-retry-strategies.md +1034 -1034
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-07-monitoring.md +653 -653
- package/docs/03-PATTERN-GUIDES/error-handling/modules/error-handling-08-api-reference.md +847 -847
- package/docs/03-PATTERN-GUIDES/error-handling/readme.md +36 -36
- package/docs/03-PATTERN-GUIDES/examples/__tests__/readme.md +40 -40
- package/docs/03-PATTERN-GUIDES/examples/__tests__/resolver-examples.test.js +282 -282
- package/docs/03-PATTERN-GUIDES/examples/test-data/03-pattern-guides-readme.md +110 -110
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-inventory.json +123 -123
- package/docs/03-PATTERN-GUIDES/examples/test-data/canonical-order.json +171 -171
- package/docs/03-PATTERN-GUIDES/examples/test-data/readme.md +28 -28
- package/docs/03-PATTERN-GUIDES/extraction/extraction-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/extraction/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/file-operations/examples/common-patterns.ts +407 -407
- package/docs/03-PATTERN-GUIDES/file-operations/examples/file-operations-readme.md +142 -142
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-quick-reference.md +462 -462
- package/docs/03-PATTERN-GUIDES/file-operations/file-operations-readme.md +379 -379
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-01-foundations.md +430 -430
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-02-quick-start.md +484 -484
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-03-s3-operations.md +507 -507
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-04-sftp-operations.md +963 -963
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-05-streaming-performance.md +503 -503
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-archive-patterns.md +386 -386
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-06-error-handling.md +117 -117
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-api-reference.md +78 -78
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-07-testing-troubleshooting.md +567 -567
- package/docs/03-PATTERN-GUIDES/file-operations/modules/file-operations-08-api-reference.md +1055 -1055
- package/docs/03-PATTERN-GUIDES/file-operations/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/ingestion/ingestion-readme.md +15 -15
- package/docs/03-PATTERN-GUIDES/ingestion/readme.md +25 -25
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/batch-processing.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/common-patterns.ts +360 -360
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/delta-sync.ts +130 -130
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/integration-patterns-readme.md +100 -100
- package/docs/03-PATTERN-GUIDES/integration-patterns/examples/real-time-webhook.ts +398 -398
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-quick-reference.md +962 -962
- package/docs/03-PATTERN-GUIDES/integration-patterns/integration-patterns-readme.md +134 -134
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-01-real-time-processing.md +991 -991
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-02-batch-processing.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-03-delta-sync.md +1108 -1108
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-04-webhook-patterns.md +1181 -1181
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-05-error-handling.md +1061 -1061
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-advanced-integration-services.md +1547 -1547
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-06-performance.md +109 -109
- package/docs/03-PATTERN-GUIDES/integration-patterns/modules/integration-patterns-07-api-reference.md +34 -34
- package/docs/03-PATTERN-GUIDES/integration-patterns/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/logging-minimal-mode.md +128 -128
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/common-patterns.ts +380 -380
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/multiple-connections-readme.md +139 -139
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/parallel-root-connections.ts +149 -149
- package/docs/03-PATTERN-GUIDES/multiple-connections/examples/real-world-scenarios.ts +405 -405
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-01-foundations.md +378 -378
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-02-quick-start.md +566 -566
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-03-targeting-connections.md +659 -659
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-04-parallel-queries.md +656 -656
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-05-best-practices.md +624 -624
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-api-reference.md +824 -824
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-06-versori.md +119 -119
- package/docs/03-PATTERN-GUIDES/multiple-connections/modules/multiple-connections-07-api-reference.md +87 -87
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-quick-reference.md +353 -353
- package/docs/03-PATTERN-GUIDES/multiple-connections/multiple-connections-readme.md +270 -270
- package/docs/03-PATTERN-GUIDES/multiple-connections/readme.md +30 -30
- package/docs/03-PATTERN-GUIDES/pagination/pagination-readme.md +14 -14
- package/docs/03-PATTERN-GUIDES/pagination/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/parquet/examples/common-patterns.ts +180 -180
- package/docs/03-PATTERN-GUIDES/parquet/examples/read-parquet.ts +48 -48
- package/docs/03-PATTERN-GUIDES/parquet/examples/write-parquet.ts +65 -65
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-01-introduction.md +393 -393
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-02-quick-start.md +572 -572
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-03-reading-parquet.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-04-writing-parquet.md +554 -554
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-05-graphql-extraction.md +405 -405
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-performance.md +104 -104
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-06-s3-integration.md +511 -511
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-api-reference.md +90 -90
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-07-performance-optimization.md +525 -525
- package/docs/03-PATTERN-GUIDES/parquet/modules/03-pattern-guides-parquet-08-best-practices.md +712 -712
- package/docs/03-PATTERN-GUIDES/parquet/parquet-quick-reference.md +683 -683
- package/docs/03-PATTERN-GUIDES/parquet/parquet-readme.md +248 -248
- package/docs/03-PATTERN-GUIDES/parquet/readme.md +32 -32
- package/docs/03-PATTERN-GUIDES/parsers/parsers-readme.md +12 -12
- package/docs/03-PATTERN-GUIDES/parsers/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/readme.md +159 -159
- package/docs/03-PATTERN-GUIDES/webhooks/readme.md +24 -24
- package/docs/03-PATTERN-GUIDES/webhooks/webhooks-readme.md +8 -8
- package/docs/04-REFERENCE/architecture/architecture-01-overview.md +427 -427
- package/docs/04-REFERENCE/architecture/architecture-02-client-architecture.md +424 -424
- package/docs/04-REFERENCE/architecture/architecture-03-data-flow.md +690 -690
- package/docs/04-REFERENCE/architecture/architecture-04-service-layer.md +834 -834
- package/docs/04-REFERENCE/architecture/architecture-05-integration-architecture.md +655 -655
- package/docs/04-REFERENCE/architecture/architecture-06-state-management.md +653 -653
- package/docs/04-REFERENCE/architecture/architecture-adding-new-data-sources.md +686 -686
- package/docs/04-REFERENCE/architecture/readme.md +279 -279
- package/docs/04-REFERENCE/platforms/deno/readme.md +117 -117
- package/docs/04-REFERENCE/platforms/nodejs/readme.md +146 -146
- package/docs/04-REFERENCE/platforms/readme.md +135 -135
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-01-introduction.md +398 -398
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-02-quick-start.md +560 -560
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-03-authentication.md +757 -757
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-04-workflows.md +2476 -2476
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-05-connections.md +1167 -1167
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-kv-storage.md +990 -990
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-06-state-management.md +121 -121
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-api-reference.md +68 -68
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-07-deployment.md +731 -731
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-08-best-practices.md +1111 -1111
- package/docs/04-REFERENCE/platforms/versori/modules/platforms-versori-09-signature-reference.md +766 -766
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-readme.md +299 -299
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-s3-sftp-configuration-guide.md +1425 -1425
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-api-key-security.md +816 -816
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-webhook-connection-security.md +681 -681
- package/docs/04-REFERENCE/platforms/versori/platforms-versori-workflow-task-types.md +708 -708
- package/docs/04-REFERENCE/platforms/versori/readme.md +108 -108
- package/docs/04-REFERENCE/readme.md +148 -148
- package/docs/04-REFERENCE/resolver-signature/examples/advanced-resolvers.ts +482 -482
- package/docs/04-REFERENCE/resolver-signature/examples/async-resolvers.ts +496 -496
- package/docs/04-REFERENCE/resolver-signature/examples/basic-resolvers.ts +343 -343
- package/docs/04-REFERENCE/resolver-signature/examples/resolver-signature-readme.md +188 -188
- package/docs/04-REFERENCE/resolver-signature/examples/testing-resolvers.ts +463 -463
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-01-foundations.md +286 -286
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-02-parameter-reference.md +643 -643
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-03-basic-examples.md +521 -521
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-04-advanced-patterns.md +739 -739
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-05-sdk-resolvers.md +531 -531
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-migration-guide.md +650 -650
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-06-testing.md +125 -125
- package/docs/04-REFERENCE/resolver-signature/modules/resolver-signature-07-api-reference.md +794 -794
- package/docs/04-REFERENCE/resolver-signature/readme.md +64 -64
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-quick-reference.md +270 -270
- package/docs/04-REFERENCE/resolver-signature/resolver-signature-readme.md +351 -351
- package/docs/04-REFERENCE/schema/fluent-commerce-schema.json +764 -764
- package/docs/04-REFERENCE/schema/readme.md +141 -141
- package/docs/04-REFERENCE/testing/examples/04-reference-testing-readme.md +158 -158
- package/docs/04-REFERENCE/testing/examples/fluent-testing.ts +62 -62
- package/docs/04-REFERENCE/testing/examples/health-check.ts +155 -155
- package/docs/04-REFERENCE/testing/examples/integration-test.ts +119 -119
- package/docs/04-REFERENCE/testing/examples/performance-test.ts +183 -183
- package/docs/04-REFERENCE/testing/examples/s3-testing.ts +127 -127
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-01-foundations.md +267 -267
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-02-s3-testing.md +599 -599
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-03-fluent-testing.md +589 -589
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-04-integration-testing.md +699 -699
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-05-debugging.md +478 -478
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-cicd-integration.md +463 -463
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-06-preflight-validation.md +131 -131
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-best-practices.md +499 -499
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-07-coverage-ci.md +165 -165
- package/docs/04-REFERENCE/testing/modules/04-reference-testing-08-api-reference.md +634 -634
- package/docs/04-REFERENCE/testing/readme.md +86 -86
- package/docs/04-REFERENCE/testing/testing-quick-reference.md +667 -667
- package/docs/04-REFERENCE/testing/testing-readme.md +286 -286
- package/docs/04-REFERENCE/troubleshooting/readme.md +144 -144
- package/docs/04-REFERENCE/troubleshooting/troubleshooting-deno-sftp-compatibility.md +392 -392
- package/docs/template-loading-matrix.md +242 -242
- package/package.json +5 -3
- package/docs/02-CORE-GUIDES/api-reference/cli-profile-integration.md +0 -377
|
@@ -1,834 +1,834 @@
|
|
|
1
|
-
# Service Layer Architecture
|
|
2
|
-
|
|
3
|
-
This document explains the organization and responsibilities of services within the FC Connect SDK.
|
|
4
|
-
|
|
5
|
-
The SDK organizes services into logical modules, each with clear responsibilities and minimal coupling.
|
|
6
|
-
|
|
7
|
-
```mermaid
|
|
8
|
-
graph TB
|
|
9
|
-
subgraph "Client Layer"
|
|
10
|
-
CLIENT[FluentClient / FluentVersoriClient]
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
subgraph "Service Modules"
|
|
14
|
-
BATCH[Batch Services]
|
|
15
|
-
CORE[Core Services]
|
|
16
|
-
MAPPING[Mapping Services]
|
|
17
|
-
TRANSFORM[Transformation Services]
|
|
18
|
-
RESOLVERS[Resolver Services]
|
|
19
|
-
INTEGRATION[Integration Services]
|
|
20
|
-
ORCHESTRATION[Orchestration Services]
|
|
21
|
-
VALIDATION[Validation Services]
|
|
22
|
-
MONITORING[Monitoring Services]
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
subgraph "Data Layer"
|
|
26
|
-
SOURCES[Data Sources]
|
|
27
|
-
PARSERS[Parsers]
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
CLIENT --> BATCH
|
|
31
|
-
CLIENT --> MAPPING
|
|
32
|
-
CLIENT --> TRANSFORM
|
|
33
|
-
CLIENT --> ORCHESTRATION
|
|
34
|
-
|
|
35
|
-
BATCH --> CORE
|
|
36
|
-
MAPPING --> RESOLVERS
|
|
37
|
-
MAPPING --> CORE
|
|
38
|
-
TRANSFORM --> MAPPING
|
|
39
|
-
ORCHESTRATION --> BATCH
|
|
40
|
-
ORCHESTRATION --> SOURCES
|
|
41
|
-
ORCHESTRATION --> PARSERS
|
|
42
|
-
ORCHESTRATION --> MAPPING
|
|
43
|
-
|
|
44
|
-
SOURCES --> PARSERS
|
|
45
|
-
VALIDATION --> CORE
|
|
46
|
-
|
|
47
|
-
style CLIENT fill:#e3f2fd
|
|
48
|
-
style BATCH fill:#fff3e0
|
|
49
|
-
style CORE fill:#f3e5f5
|
|
50
|
-
style MAPPING fill:#e8f5e9
|
|
51
|
-
style ORCHESTRATION fill:#e1f5ff
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
## Service Modules
|
|
55
|
-
|
|
56
|
-
The SDK organizes services into **11 service modules** (10 exported from `services/index.ts`, plus `s3/` exported directly from root):
|
|
57
|
-
|
|
58
|
-
1. **auth/** - Webhook authentication services
|
|
59
|
-
2. **batch/** - Job creation, batch management, partial batch recovery
|
|
60
|
-
3. **core/** - Logging, state, job tracking, KV storage
|
|
61
|
-
4. **extraction/** - High-level extraction orchestration (includes statistics tracking)
|
|
62
|
-
5. **integration/** - S3 presign, webhook validation
|
|
63
|
-
6. **mapping/** - Field mapping, GraphQL mutation generation
|
|
64
|
-
7. **orchestration/** - High-level ingestion workflows (includes statistics tracking)
|
|
65
|
-
8. **resolvers/** - GraphQL path resolution, SDK resolvers
|
|
66
|
-
9. **s3/** - S3 operations (SDK and presigned implementations) - exported from root, not services/index.ts
|
|
67
|
-
10. **transformation/** - Data transformation and extraction
|
|
68
|
-
11. **validation/** - Schema and preflight validation
|
|
69
|
-
|
|
70
|
-
**Note:** Statistics and monitoring capabilities are built into `extraction/` and `orchestration/` services, not a separate module.
|
|
71
|
-
|
|
72
|
-
### 1. Batch Services
|
|
73
|
-
|
|
74
|
-
**Location:** `src/services/batch/`
|
|
75
|
-
|
|
76
|
-
Handles job creation, batch management, file archival, and partial batch recovery.
|
|
77
|
-
|
|
78
|
-
```mermaid
|
|
79
|
-
graph TB
|
|
80
|
-
subgraph "Batch Services"
|
|
81
|
-
MANAGER[FluentBatchManager]
|
|
82
|
-
ARCHIVAL[BatchArchivalService]
|
|
83
|
-
RECOVERY[PartialBatchRecovery]
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
MANAGER --> ARCHIVAL
|
|
87
|
-
|
|
88
|
-
ARCHIVAL --> MOVE[Move Files]
|
|
89
|
-
ARCHIVAL --> COPY[Copy Files]
|
|
90
|
-
ARCHIVAL --> DELETE[Delete Files]
|
|
91
|
-
|
|
92
|
-
RECOVERY --> RETRY[Retry Failed Records]
|
|
93
|
-
RECOVERY --> CHECKPOINT[Checkpoint/Resume]
|
|
94
|
-
RECOVERY --> TRACK[Track Failures]
|
|
95
|
-
|
|
96
|
-
style MANAGER fill:#e3f2fd
|
|
97
|
-
style ARCHIVAL fill:#f3e5f5
|
|
98
|
-
style RECOVERY fill:#fff3e0
|
|
99
|
-
style MOVE fill:#e8f5e9
|
|
100
|
-
style COPY fill:#e8f5e9
|
|
101
|
-
style DELETE fill:#ffebee
|
|
102
|
-
style RETRY fill:#fff4e6
|
|
103
|
-
style CHECKPOINT fill:#fff4e6
|
|
104
|
-
style TRACK fill:#fff4e6
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
**Key Services:**
|
|
108
|
-
|
|
109
|
-
#### FluentBatchManager
|
|
110
|
-
**Source:** `src/services/batch/manager.ts`
|
|
111
|
-
|
|
112
|
-
- Create and manage batch jobs
|
|
113
|
-
- Send batches to Fluent Commerce
|
|
114
|
-
- Handle job expiration and recreation
|
|
115
|
-
- Archive processed files to S3
|
|
116
|
-
|
|
117
|
-
**Example Usage:**
|
|
118
|
-
|
|
119
|
-
```typescript
|
|
120
|
-
const manager = new FluentBatchManager(fluentClient, logger);
|
|
121
|
-
|
|
122
|
-
// Create job
|
|
123
|
-
const job = await manager.createJob('inventory-update', { retailerId: 'my-retailer' });
|
|
124
|
-
|
|
125
|
-
// Send batch
|
|
126
|
-
await manager.submitBatch(job.id, {
|
|
127
|
-
entityType: 'INVENTORY',
|
|
128
|
-
action: 'UPSERT',
|
|
129
|
-
entities: inventoryData,
|
|
130
|
-
});
|
|
131
|
-
|
|
132
|
-
// Check status
|
|
133
|
-
const status = await manager.getJobStatus(job.id);
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
#### PartialBatchRecovery
|
|
137
|
-
**Source:** `src/services/batch/partial-batch-recovery.ts` (lines 1-357)
|
|
138
|
-
|
|
139
|
-
Tracks per-record success/failure in batch operations and enables:
|
|
140
|
-
- Retrying only failed records instead of entire batch
|
|
141
|
-
- Checkpoint/resume functionality
|
|
142
|
-
- Detailed error reporting per record
|
|
143
|
-
- Progress tracking
|
|
144
|
-
|
|
145
|
-
**Key Methods:**
|
|
146
|
-
- `processBatchWithRecovery(records, batchProcessor, options)` - Process batch with automatic recovery and retry
|
|
147
|
-
- `resumeFromCheckpoint(checkpointId, batchProcessor, options)` - Resume from checkpoint
|
|
148
|
-
- `getCheckpoint(checkpointId)` - Get checkpoint by ID
|
|
149
|
-
- `listCheckpoints()` - List all checkpoints
|
|
150
|
-
- `deleteCheckpoint(checkpointId)` - Delete checkpoint
|
|
151
|
-
|
|
152
|
-
**Example Usage:**
|
|
153
|
-
|
|
154
|
-
```typescript
|
|
155
|
-
const recovery = new PartialBatchRecovery(logger);
|
|
156
|
-
|
|
157
|
-
// Process batch with recovery tracking
|
|
158
|
-
const result = await recovery.processBatchWithRecovery(
|
|
159
|
-
records,
|
|
160
|
-
async (batch) => await client.sendBatch(jobId, batch),
|
|
161
|
-
{
|
|
162
|
-
maxRetries: 3,
|
|
163
|
-
retryOnlyFailed: true,
|
|
164
|
-
checkpointKey: 'inventory-2025-01-24'
|
|
165
|
-
}
|
|
166
|
-
);
|
|
167
|
-
|
|
168
|
-
console.log(`Success: ${result.successCount}, Failed: ${result.failedCount}`);
|
|
169
|
-
if (result.failedRecords.length > 0) {
|
|
170
|
-
console.log('Failed records:', result.failedRecords);
|
|
171
|
-
}
|
|
172
|
-
```
|
|
173
|
-
|
|
174
|
-
### 2. Core Services
|
|
175
|
-
|
|
176
|
-
**Location:** `src/services/core/`
|
|
177
|
-
|
|
178
|
-
Foundation services used across the SDK.
|
|
179
|
-
|
|
180
|
-
```mermaid
|
|
181
|
-
graph TB
|
|
182
|
-
subgraph "Core Services"
|
|
183
|
-
STATE[StateService]
|
|
184
|
-
KV[KVStorageAdapter]
|
|
185
|
-
TRACKER[JobTracker]
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
LOG --> CONSOLE[createConsoleLogger]
|
|
189
|
-
STATE --> KV
|
|
190
|
-
STATE --> LOCK[Distributed Locking]
|
|
191
|
-
STATE --> DEDUP[Deduplication]
|
|
192
|
-
|
|
193
|
-
KV --> VERSORI[VersoriKVAdapter]
|
|
194
|
-
KV --> CUSTOM[Custom Implementations]
|
|
195
|
-
|
|
196
|
-
TRACKER --> KV
|
|
197
|
-
TRACKER --> CREATE[Create Job]
|
|
198
|
-
TRACKER --> UPDATE[Update Status]
|
|
199
|
-
TRACKER --> COMPLETE[Mark Complete/Failed]
|
|
200
|
-
|
|
201
|
-
style LOG fill:#fff3e0
|
|
202
|
-
style STATE fill:#f3e5f5
|
|
203
|
-
style KV fill:#e8f5e9
|
|
204
|
-
style TRACKER fill:#e1f5ff
|
|
205
|
-
#### Logging Utilities
|
|
206
|
-
|
|
207
|
-
## Logging Architecture
|
|
208
|
-
|
|
209
|
-
### Function-Based Pattern
|
|
210
|
-
|
|
211
|
-
**Versori Platform:**
|
|
212
|
-
```typescript
|
|
213
|
-
// Use native Versori log
|
|
214
|
-
export const workflow = http('POST', '/sync', async (ctx) => {
|
|
215
|
-
ctx.log('info', 'Processing sync', { recordCount: 100 });
|
|
216
|
-
|
|
217
|
-
// For SDK services, wrap native log with toStructuredLogger
|
|
218
|
-
const logger = toStructuredLogger(ctx.log, { service: 'sync' });
|
|
219
|
-
const client = await createClient({ ...ctx, log: logger });
|
|
220
|
-
});
|
|
221
|
-
```
|
|
222
|
-
|
|
223
|
-
**Standalone (Node.js/Deno):**
|
|
224
|
-
```typescript
|
|
225
|
-
// Use function-based utilities
|
|
226
|
-
import {
|
|
227
|
-
createClient,
|
|
228
|
-
createConsoleLogger,
|
|
229
|
-
toStructuredLogger,
|
|
230
|
-
createWorkflowLogger
|
|
231
|
-
} from '@fluentcommerce/fc-connect-sdk';
|
|
232
|
-
|
|
233
|
-
const logger = createConsoleLogger();
|
|
234
|
-
const client = await createClient({ config }, { logger });
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
**Core Functions:**
|
|
238
|
-
- `createConsoleLogger()` - Simple console logger
|
|
239
|
-
- `toStructuredLogger(logger, context)` - Add context to logger
|
|
240
|
-
- `generateCorrelationId()` - Generate unique request IDs
|
|
241
|
-
- `createWorkflowLogger()` - Pre-configured workflow logger
|
|
242
|
-
- `createServiceLogger()` - Pre-configured service logger
|
|
243
|
-
- `createErrorLogger()` - Error context logger
|
|
244
|
-
|
|
245
|
-
## Logging Decision Flowchart
|
|
246
|
-
|
|
247
|
-
```
|
|
248
|
-
Are you writing code for Versori platform?
|
|
249
|
-
│
|
|
250
|
-
├─ YES: Use native ctx.log
|
|
251
|
-
│ │
|
|
252
|
-
│ └─ Need to pass logger to SDK services?
|
|
253
|
-
│ │
|
|
254
|
-
│ └─ YES: Wrap with toStructuredLogger(ctx.log, context)
|
|
255
|
-
│
|
|
256
|
-
└─ NO (Standalone Node.js/Deno):
|
|
257
|
-
│
|
|
258
|
-
└─ Use createConsoleLogger() or createWorkflowLogger()
|
|
259
|
-
```
|
|
260
|
-
|
|
261
|
-
**Quick Reference:**
|
|
262
|
-
- **Versori workflows:** `ctx.log()` directly
|
|
263
|
-
- **Versori + SDK services:** `toStructuredLogger(ctx.log, { service: 'name' })`
|
|
264
|
-
- **Standalone apps:** `createConsoleLogger()`
|
|
265
|
-
|
|
266
|
-
**See:** [Logging Guide](../../02-CORE-GUIDES/api-reference/modules/api-reference-05-services.md#logging-utilities) for complete patterns.
|
|
267
|
-
|
|
268
|
-
#### StateService
|
|
269
|
-
**Source:** `src/services/core/state-service.ts` (lines 1-382)
|
|
270
|
-
|
|
271
|
-
Distributed state management with key-value storage.
|
|
272
|
-
|
|
273
|
-
**Constructor:** `new StateService(logger?)` - Logger is optional
|
|
274
|
-
|
|
275
|
-
**Key Features:**
|
|
276
|
-
- Distributed state management with KV storage
|
|
277
|
-
- File deduplication tracking
|
|
278
|
-
- Distributed locking with stale detection
|
|
279
|
-
- Daily job tracking
|
|
280
|
-
- Sync state management
|
|
281
|
-
|
|
282
|
-
**IMPORTANT:** All methods require `kv` parameter as first argument.
|
|
283
|
-
|
|
284
|
-
**Key Methods:**
|
|
285
|
-
- `acquireLock(lockName, kv, timeoutMinutes?)` - Acquire distributed lock
|
|
286
|
-
- `releaseLock(lockName, kv)` - Release lock
|
|
287
|
-
- `getSyncState(kv, workflowId?)` - Get sync state
|
|
288
|
-
- `updateSyncState(kv, processedFiles, workflowId?)` - Update sync state
|
|
289
|
-
- `getDailyJob(kv, workflowId)` - Get or check daily job
|
|
290
|
-
- `setDailyJob(kv, workflowId, jobId, expirationHours?)` - Store daily job
|
|
291
|
-
- `isFileProcessed(kv, fileName, workflowId?)` - Check if file processed
|
|
292
|
-
- `getMetrics(kv, workflowId?)` - Get processing metrics
|
|
293
|
-
- `clearState(kv, workflowId)` - Clear all state for workflow
|
|
294
|
-
|
|
295
|
-
**State Management Example:**
|
|
296
|
-
|
|
297
|
-
```typescript
|
|
298
|
-
import { StateService, VersoriKVAdapter } from '@fluentcommerce/fc-connect-sdk';
|
|
299
|
-
|
|
300
|
-
const kvAdapter = new VersoriKVAdapter(openKv());
|
|
301
|
-
const stateService = new StateService(logger);
|
|
302
|
-
|
|
303
|
-
// Check if file processed (note: kv is first parameter)
|
|
304
|
-
const processed = await stateService.isFileProcessed(
|
|
305
|
-
kvAdapter,
|
|
306
|
-
'file-key',
|
|
307
|
-
'my-workflow'
|
|
308
|
-
);
|
|
309
|
-
|
|
310
|
-
if (!processed) {
|
|
311
|
-
// Process file
|
|
312
|
-
await processFile();
|
|
313
|
-
|
|
314
|
-
// Update sync state with processed file metadata
|
|
315
|
-
await stateService.updateSyncState(
|
|
316
|
-
kvAdapter,
|
|
317
|
-
[{
|
|
318
|
-
fileName: 'file-key',
|
|
319
|
-
lastModified: new Date().toISOString(),
|
|
320
|
-
recordCount: 100
|
|
321
|
-
}],
|
|
322
|
-
'my-workflow'
|
|
323
|
-
);
|
|
324
|
-
}
|
|
325
|
-
```
|
|
326
|
-
|
|
327
|
-
#### JobTracker
|
|
328
|
-
**Source:** `src/services/core/job-tracker.ts` (lines 1-355)
|
|
329
|
-
|
|
330
|
-
Job status tracking for async workflows. Provides standardized way to track job status in Versori integrations, making it easy to monitor scheduled workflows and webhook-triggered operations.
|
|
331
|
-
|
|
332
|
-
**Key Features:**
|
|
333
|
-
- Standardized job status tracking (queued, processing, completed, failed)
|
|
334
|
-
- Automatic timestamp management
|
|
335
|
-
- TTL support for automatic cleanup
|
|
336
|
-
- Safe error handling (never throws on KV errors)
|
|
337
|
-
- Detailed logging
|
|
338
|
-
|
|
339
|
-
**Key Methods:**
|
|
340
|
-
- `createJob(jobId, metadata)` - Creates a new job with 'queued' status
|
|
341
|
-
- `updateJob(jobId, update)` - Updates job status
|
|
342
|
-
- `getJob(jobId)` - Retrieves job status
|
|
343
|
-
- `markCompleted(jobId, details)` - Marks job as completed
|
|
344
|
-
- `markFailed(jobId, error)` - Marks job as failed
|
|
345
|
-
|
|
346
|
-
**Example Usage:**
|
|
347
|
-
|
|
348
|
-
```typescript
|
|
349
|
-
const tracker = new JobTracker(kvAdapter, logger);
|
|
350
|
-
|
|
351
|
-
// Create job
|
|
352
|
-
await tracker.createJob('job_123', {
|
|
353
|
-
triggeredBy: 'schedule',
|
|
354
|
-
stage: 'extraction'
|
|
355
|
-
});
|
|
356
|
-
|
|
357
|
-
// Update progress
|
|
358
|
-
await tracker.updateJob('job_123', {
|
|
359
|
-
status: 'processing',
|
|
360
|
-
stage: 'transformation',
|
|
361
|
-
message: 'Processing 1000 records'
|
|
362
|
-
});
|
|
363
|
-
|
|
364
|
-
// Mark as completed
|
|
365
|
-
await tracker.markCompleted('job_123', {
|
|
366
|
-
recordCount: 1000,
|
|
367
|
-
fileName: 'export.xml'
|
|
368
|
-
});
|
|
369
|
-
```
|
|
370
|
-
|
|
371
|
-
### 3. Mapping Services
|
|
372
|
-
|
|
373
|
-
**Location:** `src/services/mapping/`
|
|
374
|
-
|
|
375
|
-
Universal field mapping for all data transformations.
|
|
376
|
-
|
|
377
|
-
```mermaid
|
|
378
|
-
graph TB
|
|
379
|
-
subgraph "Mapping Services"
|
|
380
|
-
UNIVERSAL[UniversalMapper]
|
|
381
|
-
MUTATION[GraphQLMutationMapper]
|
|
382
|
-
PATH[PathResolver]
|
|
383
|
-
end
|
|
384
|
-
|
|
385
|
-
UNIVERSAL --> RESOLVE[Field Resolution]
|
|
386
|
-
UNIVERSAL --> VALIDATE[Validation]
|
|
387
|
-
UNIVERSAL --> TRANSFORM[Apply Resolvers]
|
|
388
|
-
|
|
389
|
-
MUTATION --> PARSE[Parse Input]
|
|
390
|
-
MUTATION --> MAP[Apply Mappings]
|
|
391
|
-
MUTATION --> BUILD[Build Mutation]
|
|
392
|
-
|
|
393
|
-
PATH --> JSON[JSONPath Resolution]
|
|
394
|
-
PATH --> XML[XMLPath Resolution]
|
|
395
|
-
PATH --> GRAPHQL[GraphQL Path Resolution]
|
|
396
|
-
|
|
397
|
-
style UNIVERSAL fill:#e3f2fd
|
|
398
|
-
style MUTATION fill:#fff3e0
|
|
399
|
-
style PATH fill:#f3e5f5
|
|
400
|
-
```
|
|
401
|
-
|
|
402
|
-
**Key Responsibilities:**
|
|
403
|
-
|
|
404
|
-
- Universal field mapping configuration
|
|
405
|
-
- GraphQL mutation generation from XML/JSON
|
|
406
|
-
- Path resolution for nested data
|
|
407
|
-
- Field validation and transformation
|
|
408
|
-
|
|
409
|
-
**Universal Mapping Example:**
|
|
410
|
-
|
|
411
|
-
```typescript
|
|
412
|
-
const mapper = new UniversalMapper({
|
|
413
|
-
fields: {
|
|
414
|
-
skuRef: { source: 'sku_id', required: true },
|
|
415
|
-
qty: { source: 'quantity', resolver: 'sdk.parseInt' },
|
|
416
|
-
expectedOn: { source: 'date', resolver: 'sdk.formatDate' },
|
|
417
|
-
},
|
|
418
|
-
});
|
|
419
|
-
|
|
420
|
-
const result = await mapper.map(sourceData);
|
|
421
|
-
// { success: true, data: { skuRef: '...', qty: 10, expectedOn: '2025-01-15' } }
|
|
422
|
-
```
|
|
423
|
-
|
|
424
|
-
**GraphQL Mutation Mapping Example:**
|
|
425
|
-
|
|
426
|
-
```typescript
|
|
427
|
-
const mutationMapper = new GraphQLMutationMapper(xmlParser, logger);
|
|
428
|
-
|
|
429
|
-
const mutation = await mutationMapper.generateMutation(xmlData, mappingConfig);
|
|
430
|
-
|
|
431
|
-
// Execute mutation
|
|
432
|
-
const result = await fluentClient.graphql({ query: mutation });
|
|
433
|
-
```
|
|
434
|
-
|
|
435
|
-
### 4. Transformation & Extraction Services
|
|
436
|
-
|
|
437
|
-
**Location:** `src/services/transformation/` and `src/services/extraction/`
|
|
438
|
-
|
|
439
|
-
Data extraction and transformation services.
|
|
440
|
-
|
|
441
|
-
```mermaid
|
|
442
|
-
graph TB
|
|
443
|
-
subgraph "Transformation & Extraction Services"
|
|
444
|
-
ORCH[ExtractionOrchestrator]
|
|
445
|
-
end
|
|
446
|
-
|
|
447
|
-
ORCH --> QUERY[Execute GraphQL Query]
|
|
448
|
-
ORCH --> AUTOPAGE[Automatic Pagination]
|
|
449
|
-
ORCH --> PATHEXTRACT[Path-based Extraction]
|
|
450
|
-
ORCH --> VALIDATE[Per-item Validation]
|
|
451
|
-
ORCH --> STATS[Statistics Tracking]
|
|
452
|
-
ORCH --> LIMITS[Limits: maxRecords, maxPages, timeout]
|
|
453
|
-
|
|
454
|
-
style ORCH fill:#fff3e0
|
|
455
|
-
```
|
|
456
|
-
|
|
457
|
-
**Key Services:**
|
|
458
|
-
|
|
459
|
-
#### ExtractionOrchestrator (Optional Helper)
|
|
460
|
-
**Source:** `src/services/extraction/extraction-orchestrator.ts` (lines 1-460)
|
|
461
|
-
Generic data extraction from Fluent Commerce GraphQL API with automatic pagination, error handling, and statistics tracking. This is an **optional convenience service** for extraction workflows.
|
|
462
|
-
|
|
463
|
-
> **Note**: For maximum flexibility, consider using `client.graphql()` with auto-pagination directly instead of this orchestrator. Building blocks give you more control over the workflow.
|
|
464
|
-
|
|
465
|
-
**Key Features:**
|
|
466
|
-
- Automatic pagination handling
|
|
467
|
-
- Extraction limits (maxRecords, maxPages, timeout)
|
|
468
|
-
- Path-based result extraction from nested GraphQL responses
|
|
469
|
-
- Per-item validation
|
|
470
|
-
- Comprehensive error handling
|
|
471
|
-
- Statistics tracking
|
|
472
|
-
|
|
473
|
-
**Key Methods:**
|
|
474
|
-
- `extract<T>(options)` - Extract data from Fluent Commerce GraphQL API
|
|
475
|
-
- Returns: `Promise<ExtractionResult<T>>` with data, stats, and errors
|
|
476
|
-
|
|
477
|
-
**Example Usage:**
|
|
478
|
-
|
|
479
|
-
```typescript
|
|
480
|
-
const orchestrator = new ExtractionOrchestrator(client, logger);
|
|
481
|
-
|
|
482
|
-
const result = await orchestrator.extract({
|
|
483
|
-
query: VIRTUAL_POSITIONS_QUERY,
|
|
484
|
-
variables: {
|
|
485
|
-
catalogues: [{ ref: 'DEFAULT:1' }],
|
|
486
|
-
dateRangeFilter: { from: '2024-01-01' }
|
|
487
|
-
},
|
|
488
|
-
resultPath: 'virtualPositions.edges.node',
|
|
489
|
-
pageSize: 200,
|
|
490
|
-
maxRecords: 100000,
|
|
491
|
-
validateItem: (item) => item.ref && item.quantity > 0
|
|
492
|
-
});
|
|
493
|
-
|
|
494
|
-
console.log(`Extracted ${result.stats.totalRecords} records in ${result.stats.duration}ms`);
|
|
495
|
-
console.log(`Pages fetched: ${result.stats.totalPages}`);
|
|
496
|
-
if (result.stats.truncated) {
|
|
497
|
-
console.log(`Truncation reason: ${result.stats.truncationReason}`);
|
|
498
|
-
}
|
|
499
|
-
```
|
|
500
|
-
|
|
501
|
-
**Alternative (Building Blocks - More Flexible):**
|
|
502
|
-
|
|
503
|
-
For more control, compose `client.graphql()` with auto-pagination and UniversalMapper:
|
|
504
|
-
|
|
505
|
-
```typescript
|
|
506
|
-
// Direct approach with client auto-pagination
|
|
507
|
-
const result = await client.graphql({
|
|
508
|
-
query: VIRTUAL_POSITIONS_QUERY,
|
|
509
|
-
variables: { catalogues: [{ ref: 'DEFAULT:1' }] },
|
|
510
|
-
pagination: { maxRecords: 100000, pageSize: 200 }
|
|
511
|
-
});
|
|
512
|
-
|
|
513
|
-
const items = result.data?.virtualPositions?.edges?.map(e => e.node) || [];
|
|
514
|
-
|
|
515
|
-
// Transform with UniversalMapper if needed
|
|
516
|
-
const mapper = new UniversalMapper(mappingConfig);
|
|
517
|
-
const transformed = await Promise.all(items.map(item => mapper.map(item)));
|
|
518
|
-
|
|
519
|
-
console.log(`Extracted ${items.length} records`);
|
|
520
|
-
```
|
|
521
|
-
|
|
522
|
-
> Note: Any references below to Orchestration are historical and should be interpreted as building-block patterns using clients + services.
|
|
523
|
-
|
|
524
|
-
### 5. Resolver Services
|
|
525
|
-
|
|
526
|
-
**Location:** `src/services/resolvers/`
|
|
527
|
-
|
|
528
|
-
Built-in transformation functions (SDK resolvers) and helper utilities.
|
|
529
|
-
|
|
530
|
-
**SDK Resolver Categories:**
|
|
531
|
-
|
|
532
|
-
```typescript
|
|
533
|
-
// String transformations
|
|
534
|
-
('sdk.uppercase', 'sdk.lowercase', 'sdk.trim', 'sdk.toString');
|
|
535
|
-
|
|
536
|
-
// Number parsing
|
|
537
|
-
('sdk.parseInt', 'sdk.parseFloat', 'sdk.number');
|
|
538
|
-
|
|
539
|
-
// Date formatting
|
|
540
|
-
('sdk.formatDate', 'sdk.formatDateShort', 'sdk.parseDate');
|
|
541
|
-
|
|
542
|
-
// Type conversions
|
|
543
|
-
('sdk.boolean', 'sdk.parseJson', 'sdk.toJson');
|
|
544
|
-
|
|
545
|
-
// Utilities
|
|
546
|
-
('sdk.identity', 'sdk.coalesce');
|
|
547
|
-
```
|
|
548
|
-
|
|
549
|
-
### 6. Integration Services
|
|
550
|
-
|
|
551
|
-
**Location:** `src/services/integration/`
|
|
552
|
-
|
|
553
|
-
External system integration utilities.
|
|
554
|
-
|
|
555
|
-
```mermaid
|
|
556
|
-
graph TB
|
|
557
|
-
subgraph "Integration Services"
|
|
558
|
-
S3[S3PresignService]
|
|
559
|
-
WEBHOOK[WebhookValidationService]
|
|
560
|
-
end
|
|
561
|
-
|
|
562
|
-
S3 --> PRESIGN[Generate Presigned URLs]
|
|
563
|
-
S3 --> UPLOAD[Upload via Presigned URL]
|
|
564
|
-
S3 --> DOWNLOAD[Download via Presigned URL]
|
|
565
|
-
|
|
566
|
-
WEBHOOK --> VALIDATE[Cryptographic Signature Validation]
|
|
567
|
-
WEBHOOK --> PARSE[Parse Payloads]
|
|
568
|
-
WEBHOOK --> VERIFY[Verify Timestamps]
|
|
569
|
-
WEBHOOK --> CLIENT[FluentClient.validateWebhook()]
|
|
570
|
-
|
|
571
|
-
style S3 fill:#e3f2fd
|
|
572
|
-
style WEBHOOK fill:#fff3e0
|
|
573
|
-
```
|
|
574
|
-
|
|
575
|
-
**Key Services:**
|
|
576
|
-
|
|
577
|
-
#### S3PresignService
|
|
578
|
-
Generate S3 presigned URLs for cross-account access without sharing credentials.
|
|
579
|
-
|
|
580
|
-
#### WebhookValidationService
|
|
581
|
-
**Integration:** Accessible via `FluentClient.validateWebhook()`
|
|
582
|
-
|
|
583
|
-
Cryptographic signature validation for Fluent Commerce webhooks.
|
|
584
|
-
|
|
585
|
-
**Key Responsibilities:**
|
|
586
|
-
|
|
587
|
-
- Generate S3 presigned URLs (SigV4)
|
|
588
|
-
- Validate webhook signatures (HMAC-SHA256)
|
|
589
|
-
- Parse webhook payloads
|
|
590
|
-
- Support cross-account S3 access
|
|
591
|
-
- Verify webhook timestamp freshness
|
|
592
|
-
|
|
593
|
-
**S3 Presign Example:**
|
|
594
|
-
|
|
595
|
-
```typescript
|
|
596
|
-
const s3PresignService = new S3PresignService(config);
|
|
597
|
-
|
|
598
|
-
// Generate upload URL
|
|
599
|
-
const uploadUrl = await s3PresignService.getPresignedUploadUrl(
|
|
600
|
-
'my-bucket',
|
|
601
|
-
'path/to/file.csv',
|
|
602
|
-
3600 // 1 hour expiration
|
|
603
|
-
);
|
|
604
|
-
|
|
605
|
-
// Upload file
|
|
606
|
-
await fetch(uploadUrl, {
|
|
607
|
-
method: 'PUT',
|
|
608
|
-
body: fileData,
|
|
609
|
-
});
|
|
610
|
-
```
|
|
611
|
-
|
|
612
|
-
**Webhook Validation Example:**
|
|
613
|
-
|
|
614
|
-
```typescript
|
|
615
|
-
// Via FluentClient (recommended) - returns boolean
|
|
616
|
-
const isValid = await client.validateWebhook(
|
|
617
|
-
webhookBody,
|
|
618
|
-
request.headers['x-fluent-signature'],
|
|
619
|
-
rawRequestBody
|
|
620
|
-
);
|
|
621
|
-
|
|
622
|
-
if (!isValid) {
|
|
623
|
-
throw new Error('Invalid webhook signature');
|
|
624
|
-
}
|
|
625
|
-
|
|
626
|
-
// Process validated webhook
|
|
627
|
-
console.log('Event type:', webhookBody.name);
|
|
628
|
-
```
|
|
629
|
-
|
|
630
|
-
### 8. Auth Services
|
|
631
|
-
|
|
632
|
-
**Location:** `src/services/auth/`
|
|
633
|
-
|
|
634
|
-
Webhook authentication services for API key and token management.
|
|
635
|
-
|
|
636
|
-
**Key Services:**
|
|
637
|
-
|
|
638
|
-
#### WebhookAuthService
|
|
639
|
-
|
|
640
|
-
Provides API key and token validation for webhook endpoints.
|
|
641
|
-
|
|
642
|
-
**Key Features:**
|
|
643
|
-
- API key validation
|
|
644
|
-
- Token issuance and validation
|
|
645
|
-
- User validation
|
|
646
|
-
- Support for multiple authentication methods
|
|
647
|
-
|
|
648
|
-
### 9. S3 Services
|
|
649
|
-
|
|
650
|
-
**Location:** `src/services/s3/`
|
|
651
|
-
|
|
652
|
-
**Note:** S3Service is exported directly from the SDK root (`src/index.ts`), not from `services/index.ts`.
|
|
653
|
-
|
|
654
|
-
Unified S3 operations with dual implementation strategies.
|
|
655
|
-
|
|
656
|
-
```mermaid
|
|
657
|
-
graph TB
|
|
658
|
-
subgraph "S3 Services"
|
|
659
|
-
S3SERVICE[S3Service]
|
|
660
|
-
SDK_IMPL[SDKImplementation<br/>AWS SDK v3]
|
|
661
|
-
PRESIGNED_IMPL[PresignedImplementation<br/>SigV4 URLs]
|
|
662
|
-
end
|
|
663
|
-
|
|
664
|
-
S3SERVICE --> SDK_IMPL
|
|
665
|
-
S3SERVICE --> PRESIGNED_IMPL
|
|
666
|
-
|
|
667
|
-
SDK_IMPL --> BASIC[Basic Ops<br/>get, put, list, delete]
|
|
668
|
-
SDK_IMPL --> ADVANCED[Advanced Ops<br/>multipart, S3 Select]
|
|
669
|
-
|
|
670
|
-
PRESIGNED_IMPL --> BASIC_PS[Basic Ops<br/>get, put, list, delete]
|
|
671
|
-
|
|
672
|
-
style S3SERVICE fill:#e3f2fd
|
|
673
|
-
style SDK_IMPL fill:#e8f5e9
|
|
674
|
-
style PRESIGNED_IMPL fill:#fff3e0
|
|
675
|
-
```
|
|
676
|
-
|
|
677
|
-
**Key Services:**
|
|
678
|
-
|
|
679
|
-
#### S3Service
|
|
680
|
-
**Source:** `src/services/s3/s3-service.ts`
|
|
681
|
-
|
|
682
|
-
Main interface for S3 operations with automatic implementation selection.
|
|
683
|
-
|
|
684
|
-
**Two Implementation Modes:**
|
|
685
|
-
|
|
686
|
-
1. **SDK Mode (Default)** - Uses AWS SDK v3
|
|
687
|
-
- Full feature set including multipart upload and S3 Select
|
|
688
|
-
- Works in Node.js and environments with AWS SDK support
|
|
689
|
-
- Best for production workloads with large files
|
|
690
|
-
|
|
691
|
-
2. **Presigned Mode (Explicit)** - Uses presigned URLs
|
|
692
|
-
- Works in restricted environments (browsers, Versori platform)
|
|
693
|
-
- Basic operations only (no multipart, no S3 Select)
|
|
694
|
-
- Requires `ctx.fetch` when used in Versori
|
|
695
|
-
|
|
696
|
-
**Key Methods:**
|
|
697
|
-
|
|
698
|
-
**Basic Operations (Both modes):**
|
|
699
|
-
- `listObjects(bucket, options)` - List objects in bucket
|
|
700
|
-
- `getObject(bucket, key)` - Get object content
|
|
701
|
-
- `putObject(bucket, key, body, options)` - Upload object
|
|
702
|
-
- `deleteObject(bucket, key)` - Delete object
|
|
703
|
-
- `copyObject(source, dest, options)` - Copy object
|
|
704
|
-
- `headObject(bucket, key)` - Get metadata without downloading
|
|
705
|
-
- `moveObject(source, dest, options)` - Move object (copy + delete)
|
|
706
|
-
- `objectExists(bucket, key)` - Check if object exists
|
|
707
|
-
|
|
708
|
-
**Advanced Operations (SDK mode only):**
|
|
709
|
-
- `createMultipartUpload(bucket, key, options)` - Start multipart upload
|
|
710
|
-
- `uploadPart(bucket, key, uploadId, partNumber, body)` - Upload part
|
|
711
|
-
- `completeMultipartUpload(bucket, key, uploadId, parts)` - Complete upload
|
|
712
|
-
- `abortMultipartUpload(bucket, key, uploadId)` - Abort upload
|
|
713
|
-
- `selectObjectContent(bucket, key, expression, type)` - S3 Select query
|
|
714
|
-
- `uploadLargeFile(bucket, key, data, options)` - Helper for large files
|
|
715
|
-
- `queryCSV(bucket, key, query)` - Query CSV with S3 Select
|
|
716
|
-
|
|
717
|
-
**Example Usage:**
|
|
718
|
-
|
|
719
|
-
```typescript
|
|
720
|
-
// Default - uses AWS SDK v3
|
|
721
|
-
const s3 = new S3Service({
|
|
722
|
-
accessKeyId: 'xxx',
|
|
723
|
-
secretAccessKey: 'yyy',
|
|
724
|
-
region: 'us-east-1'
|
|
725
|
-
});
|
|
726
|
-
|
|
727
|
-
// Basic operations
|
|
728
|
-
const objects = await s3.listObjects('my-bucket', { prefix: 'incoming/' });
|
|
729
|
-
const content = await s3.getObject('my-bucket', 'file.csv');
|
|
730
|
-
await s3.putObject('my-bucket', 'output.json', JSON.stringify(data));
|
|
731
|
-
|
|
732
|
-
// Advanced - multipart upload for large files
|
|
733
|
-
await s3.uploadLargeFile('my-bucket', 'large.parquet', buffer, {
|
|
734
|
-
partSize: 10 * 1024 * 1024 // 10MB parts
|
|
735
|
-
});
|
|
736
|
-
|
|
737
|
-
// Presigned mode (for Versori)
|
|
738
|
-
const s3Presigned = new S3Service({
|
|
739
|
-
accessKeyId: 'xxx',
|
|
740
|
-
secretAccessKey: 'yyy',
|
|
741
|
-
region: 'us-east-1',
|
|
742
|
-
usePresigned: true,
|
|
743
|
-
fetch: ctx.fetch
|
|
744
|
-
});
|
|
745
|
-
|
|
746
|
-
// Basic operations work in presigned mode
|
|
747
|
-
await s3Presigned.putObject('my-bucket', 'output.json', data);
|
|
748
|
-
```
|
|
749
|
-
|
|
750
|
-
### 10. Validation Services
|
|
751
|
-
|
|
752
|
-
**Location:** `src/services/validation/`
|
|
753
|
-
|
|
754
|
-
Data and schema validation services.
|
|
755
|
-
|
|
756
|
-
```mermaid
|
|
757
|
-
graph TB
|
|
758
|
-
subgraph "Validation Services"
|
|
759
|
-
SCHEMA[SchemaValidationService]
|
|
760
|
-
PREFLIGHT[PreflightValidator]
|
|
761
|
-
end
|
|
762
|
-
|
|
763
|
-
SCHEMA --> MAPPING[Validate Mappings]
|
|
764
|
-
SCHEMA --> CONFIG[Validate Config]
|
|
765
|
-
SCHEMA --> GRAPHQL[Validate GraphQL Schema]
|
|
766
|
-
|
|
767
|
-
PREFLIGHT --> REQUIRED[Required Fields]
|
|
768
|
-
PREFLIGHT --> TYPE[Type Checking]
|
|
769
|
-
PREFLIGHT --> DUPLICATE[Duplicate Detection]
|
|
770
|
-
PREFLIGHT --> CUSTOM[Custom Validation]
|
|
771
|
-
PREFLIGHT --> BATCH[Batch Size Check]
|
|
772
|
-
|
|
773
|
-
style SCHEMA fill:#e3f2fd
|
|
774
|
-
style PREFLIGHT fill:#fff3e0
|
|
775
|
-
```
|
|
776
|
-
|
|
777
|
-
**Key Services:**
|
|
778
|
-
|
|
779
|
-
#### SchemaValidationService
|
|
780
|
-
**Source:** `src/services/validation/schema-validation-service.ts`
|
|
781
|
-
|
|
782
|
-
Validates mapping configurations and GraphQL schema compliance.
|
|
783
|
-
|
|
784
|
-
- Validate mapping configurations
|
|
785
|
-
- Validate GraphQL schema compliance
|
|
786
|
-
- Check field existence in schema
|
|
787
|
-
|
|
788
|
-
#### PreflightValidator
|
|
789
|
-
**Source:** `src/services/validation/preflight-validator.ts` (lines 1-352)
|
|
790
|
-
Validates data BEFORE sending to Fluent API to catch errors early and save API quota. Pre-flight validation helps identify data quality issues before submission.
|
|
791
|
-
|
|
792
|
-
**Key Features:**
|
|
793
|
-
- Catch errors early and save API quota
|
|
794
|
-
- Validate against GraphQL schema requirements
|
|
795
|
-
- Check for duplicates and data quality issues
|
|
796
|
-
- Provide actionable error messages
|
|
797
|
-
- Support custom validation functions
|
|
798
|
-
|
|
799
|
-
**Key Methods:**
|
|
800
|
-
- `validateBatch(records, options)` - Validate a batch of records before sending to API
|
|
801
|
-
- `validateQuick(records, options)` - Quick validation (returns first error only)
|
|
802
|
-
|
|
803
|
-
**Example Usage:**
|
|
804
|
-
|
|
805
|
-
```typescript
|
|
806
|
-
const validator = new PreflightValidator(logger);
|
|
807
|
-
|
|
808
|
-
// Validate batch before sending
|
|
809
|
-
const result = await validator.validateBatch(records, {
|
|
810
|
-
entityType: 'INVENTORY',
|
|
811
|
-
requiredFields: ['ref', 'qty'],
|
|
812
|
-
checkDuplicates: true,
|
|
813
|
-
validateTypes: true,
|
|
814
|
-
maxBatchSize: 500,
|
|
815
|
-
customValidator: (record, index) => {
|
|
816
|
-
if (record.qty < 0) {
|
|
817
|
-
return `Record ${index}: qty cannot be negative`;
|
|
818
|
-
}
|
|
819
|
-
return null;
|
|
820
|
-
}
|
|
821
|
-
});
|
|
822
|
-
|
|
823
|
-
if (!result.isValid) {
|
|
824
|
-
console.error(`Validation failed: ${result.errors.length} errors`);
|
|
825
|
-
result.errors.forEach(err => {
|
|
826
|
-
console.error(`Record ${err.index}: ${err.message}`);
|
|
827
|
-
});
|
|
828
|
-
// Don't send to API - fix data first
|
|
829
|
-
return;
|
|
830
|
-
}
|
|
831
|
-
|
|
832
|
-
// Validation passed - safe to send to API
|
|
833
|
-
await client.sendBatch(jobId, { entities: records });
|
|
834
|
-
```
|
|
1
|
+
# Service Layer Architecture
|
|
2
|
+
|
|
3
|
+
This document explains the organization and responsibilities of services within the FC Connect SDK.
|
|
4
|
+
|
|
5
|
+
The SDK organizes services into logical modules, each with clear responsibilities and minimal coupling.
|
|
6
|
+
|
|
7
|
+
```mermaid
|
|
8
|
+
graph TB
|
|
9
|
+
subgraph "Client Layer"
|
|
10
|
+
CLIENT[FluentClient / FluentVersoriClient]
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
subgraph "Service Modules"
|
|
14
|
+
BATCH[Batch Services]
|
|
15
|
+
CORE[Core Services]
|
|
16
|
+
MAPPING[Mapping Services]
|
|
17
|
+
TRANSFORM[Transformation Services]
|
|
18
|
+
RESOLVERS[Resolver Services]
|
|
19
|
+
INTEGRATION[Integration Services]
|
|
20
|
+
ORCHESTRATION[Orchestration Services]
|
|
21
|
+
VALIDATION[Validation Services]
|
|
22
|
+
MONITORING[Monitoring Services]
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
subgraph "Data Layer"
|
|
26
|
+
SOURCES[Data Sources]
|
|
27
|
+
PARSERS[Parsers]
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
CLIENT --> BATCH
|
|
31
|
+
CLIENT --> MAPPING
|
|
32
|
+
CLIENT --> TRANSFORM
|
|
33
|
+
CLIENT --> ORCHESTRATION
|
|
34
|
+
|
|
35
|
+
BATCH --> CORE
|
|
36
|
+
MAPPING --> RESOLVERS
|
|
37
|
+
MAPPING --> CORE
|
|
38
|
+
TRANSFORM --> MAPPING
|
|
39
|
+
ORCHESTRATION --> BATCH
|
|
40
|
+
ORCHESTRATION --> SOURCES
|
|
41
|
+
ORCHESTRATION --> PARSERS
|
|
42
|
+
ORCHESTRATION --> MAPPING
|
|
43
|
+
|
|
44
|
+
SOURCES --> PARSERS
|
|
45
|
+
VALIDATION --> CORE
|
|
46
|
+
|
|
47
|
+
style CLIENT fill:#e3f2fd
|
|
48
|
+
style BATCH fill:#fff3e0
|
|
49
|
+
style CORE fill:#f3e5f5
|
|
50
|
+
style MAPPING fill:#e8f5e9
|
|
51
|
+
style ORCHESTRATION fill:#e1f5ff
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Service Modules
|
|
55
|
+
|
|
56
|
+
The SDK organizes services into **11 service modules** (10 exported from `services/index.ts`, plus `s3/` exported directly from root):
|
|
57
|
+
|
|
58
|
+
1. **auth/** - Webhook authentication services
|
|
59
|
+
2. **batch/** - Job creation, batch management, partial batch recovery
|
|
60
|
+
3. **core/** - Logging, state, job tracking, KV storage
|
|
61
|
+
4. **extraction/** - High-level extraction orchestration (includes statistics tracking)
|
|
62
|
+
5. **integration/** - S3 presign, webhook validation
|
|
63
|
+
6. **mapping/** - Field mapping, GraphQL mutation generation
|
|
64
|
+
7. **orchestration/** - High-level ingestion workflows (includes statistics tracking)
|
|
65
|
+
8. **resolvers/** - GraphQL path resolution, SDK resolvers
|
|
66
|
+
9. **s3/** - S3 operations (SDK and presigned implementations) - exported from root, not services/index.ts
|
|
67
|
+
10. **transformation/** - Data transformation and extraction
|
|
68
|
+
11. **validation/** - Schema and preflight validation
|
|
69
|
+
|
|
70
|
+
**Note:** Statistics and monitoring capabilities are built into `extraction/` and `orchestration/` services, not a separate module.
|
|
71
|
+
|
|
72
|
+
### 1. Batch Services
|
|
73
|
+
|
|
74
|
+
**Location:** `src/services/batch/`
|
|
75
|
+
|
|
76
|
+
Handles job creation, batch management, file archival, and partial batch recovery.
|
|
77
|
+
|
|
78
|
+
```mermaid
|
|
79
|
+
graph TB
|
|
80
|
+
subgraph "Batch Services"
|
|
81
|
+
MANAGER[FluentBatchManager]
|
|
82
|
+
ARCHIVAL[BatchArchivalService]
|
|
83
|
+
RECOVERY[PartialBatchRecovery]
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
MANAGER --> ARCHIVAL
|
|
87
|
+
|
|
88
|
+
ARCHIVAL --> MOVE[Move Files]
|
|
89
|
+
ARCHIVAL --> COPY[Copy Files]
|
|
90
|
+
ARCHIVAL --> DELETE[Delete Files]
|
|
91
|
+
|
|
92
|
+
RECOVERY --> RETRY[Retry Failed Records]
|
|
93
|
+
RECOVERY --> CHECKPOINT[Checkpoint/Resume]
|
|
94
|
+
RECOVERY --> TRACK[Track Failures]
|
|
95
|
+
|
|
96
|
+
style MANAGER fill:#e3f2fd
|
|
97
|
+
style ARCHIVAL fill:#f3e5f5
|
|
98
|
+
style RECOVERY fill:#fff3e0
|
|
99
|
+
style MOVE fill:#e8f5e9
|
|
100
|
+
style COPY fill:#e8f5e9
|
|
101
|
+
style DELETE fill:#ffebee
|
|
102
|
+
style RETRY fill:#fff4e6
|
|
103
|
+
style CHECKPOINT fill:#fff4e6
|
|
104
|
+
style TRACK fill:#fff4e6
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**Key Services:**
|
|
108
|
+
|
|
109
|
+
#### FluentBatchManager
|
|
110
|
+
**Source:** `src/services/batch/manager.ts`
|
|
111
|
+
|
|
112
|
+
- Create and manage batch jobs
|
|
113
|
+
- Send batches to Fluent Commerce
|
|
114
|
+
- Handle job expiration and recreation
|
|
115
|
+
- Archive processed files to S3
|
|
116
|
+
|
|
117
|
+
**Example Usage:**
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
const manager = new FluentBatchManager(fluentClient, logger);
|
|
121
|
+
|
|
122
|
+
// Create job
|
|
123
|
+
const job = await manager.createJob('inventory-update', { retailerId: 'my-retailer' });
|
|
124
|
+
|
|
125
|
+
// Send batch
|
|
126
|
+
await manager.submitBatch(job.id, {
|
|
127
|
+
entityType: 'INVENTORY',
|
|
128
|
+
action: 'UPSERT',
|
|
129
|
+
entities: inventoryData,
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
// Check status
|
|
133
|
+
const status = await manager.getJobStatus(job.id);
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
#### PartialBatchRecovery
|
|
137
|
+
**Source:** `src/services/batch/partial-batch-recovery.ts` (lines 1-357)
|
|
138
|
+
|
|
139
|
+
Tracks per-record success/failure in batch operations and enables:
|
|
140
|
+
- Retrying only failed records instead of entire batch
|
|
141
|
+
- Checkpoint/resume functionality
|
|
142
|
+
- Detailed error reporting per record
|
|
143
|
+
- Progress tracking
|
|
144
|
+
|
|
145
|
+
**Key Methods:**
|
|
146
|
+
- `processBatchWithRecovery(records, batchProcessor, options)` - Process batch with automatic recovery and retry
|
|
147
|
+
- `resumeFromCheckpoint(checkpointId, batchProcessor, options)` - Resume from checkpoint
|
|
148
|
+
- `getCheckpoint(checkpointId)` - Get checkpoint by ID
|
|
149
|
+
- `listCheckpoints()` - List all checkpoints
|
|
150
|
+
- `deleteCheckpoint(checkpointId)` - Delete checkpoint
|
|
151
|
+
|
|
152
|
+
**Example Usage:**
|
|
153
|
+
|
|
154
|
+
```typescript
|
|
155
|
+
const recovery = new PartialBatchRecovery(logger);
|
|
156
|
+
|
|
157
|
+
// Process batch with recovery tracking
|
|
158
|
+
const result = await recovery.processBatchWithRecovery(
|
|
159
|
+
records,
|
|
160
|
+
async (batch) => await client.sendBatch(jobId, batch),
|
|
161
|
+
{
|
|
162
|
+
maxRetries: 3,
|
|
163
|
+
retryOnlyFailed: true,
|
|
164
|
+
checkpointKey: 'inventory-2025-01-24'
|
|
165
|
+
}
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
console.log(`Success: ${result.successCount}, Failed: ${result.failedCount}`);
|
|
169
|
+
if (result.failedRecords.length > 0) {
|
|
170
|
+
console.log('Failed records:', result.failedRecords);
|
|
171
|
+
}
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### 2. Core Services
|
|
175
|
+
|
|
176
|
+
**Location:** `src/services/core/`
|
|
177
|
+
|
|
178
|
+
Foundation services used across the SDK.
|
|
179
|
+
|
|
180
|
+
```mermaid
|
|
181
|
+
graph TB
|
|
182
|
+
subgraph "Core Services"
|
|
183
|
+
STATE[StateService]
|
|
184
|
+
KV[KVStorageAdapter]
|
|
185
|
+
TRACKER[JobTracker]
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
LOG --> CONSOLE[createConsoleLogger]
|
|
189
|
+
STATE --> KV
|
|
190
|
+
STATE --> LOCK[Distributed Locking]
|
|
191
|
+
STATE --> DEDUP[Deduplication]
|
|
192
|
+
|
|
193
|
+
KV --> VERSORI[VersoriKVAdapter]
|
|
194
|
+
KV --> CUSTOM[Custom Implementations]
|
|
195
|
+
|
|
196
|
+
TRACKER --> KV
|
|
197
|
+
TRACKER --> CREATE[Create Job]
|
|
198
|
+
TRACKER --> UPDATE[Update Status]
|
|
199
|
+
TRACKER --> COMPLETE[Mark Complete/Failed]
|
|
200
|
+
|
|
201
|
+
style LOG fill:#fff3e0
|
|
202
|
+
style STATE fill:#f3e5f5
|
|
203
|
+
style KV fill:#e8f5e9
|
|
204
|
+
style TRACKER fill:#e1f5ff
|
|
205
|
+
#### Logging Utilities
|
|
206
|
+
|
|
207
|
+
## Logging Architecture
|
|
208
|
+
|
|
209
|
+
### Function-Based Pattern
|
|
210
|
+
|
|
211
|
+
**Versori Platform:**
|
|
212
|
+
```typescript
|
|
213
|
+
// Use native Versori log
|
|
214
|
+
export const workflow = http('POST', '/sync', async (ctx) => {
|
|
215
|
+
ctx.log('info', 'Processing sync', { recordCount: 100 });
|
|
216
|
+
|
|
217
|
+
// For SDK services, wrap native log with toStructuredLogger
|
|
218
|
+
const logger = toStructuredLogger(ctx.log, { service: 'sync' });
|
|
219
|
+
const client = await createClient({ ...ctx, log: logger });
|
|
220
|
+
});
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
**Standalone (Node.js/Deno):**
|
|
224
|
+
```typescript
|
|
225
|
+
// Use function-based utilities
|
|
226
|
+
import {
|
|
227
|
+
createClient,
|
|
228
|
+
createConsoleLogger,
|
|
229
|
+
toStructuredLogger,
|
|
230
|
+
createWorkflowLogger
|
|
231
|
+
} from '@fluentcommerce/fc-connect-sdk';
|
|
232
|
+
|
|
233
|
+
const logger = createConsoleLogger();
|
|
234
|
+
const client = await createClient({ config }, { logger });
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
**Core Functions:**
|
|
238
|
+
- `createConsoleLogger()` - Simple console logger
|
|
239
|
+
- `toStructuredLogger(logger, context)` - Add context to logger
|
|
240
|
+
- `generateCorrelationId()` - Generate unique request IDs
|
|
241
|
+
- `createWorkflowLogger()` - Pre-configured workflow logger
|
|
242
|
+
- `createServiceLogger()` - Pre-configured service logger
|
|
243
|
+
- `createErrorLogger()` - Error context logger
|
|
244
|
+
|
|
245
|
+
## Logging Decision Flowchart
|
|
246
|
+
|
|
247
|
+
```
|
|
248
|
+
Are you writing code for Versori platform?
|
|
249
|
+
│
|
|
250
|
+
├─ YES: Use native ctx.log
|
|
251
|
+
│ │
|
|
252
|
+
│ └─ Need to pass logger to SDK services?
|
|
253
|
+
│ │
|
|
254
|
+
│ └─ YES: Wrap with toStructuredLogger(ctx.log, context)
|
|
255
|
+
│
|
|
256
|
+
└─ NO (Standalone Node.js/Deno):
|
|
257
|
+
│
|
|
258
|
+
└─ Use createConsoleLogger() or createWorkflowLogger()
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
**Quick Reference:**
|
|
262
|
+
- **Versori workflows:** `ctx.log()` directly
|
|
263
|
+
- **Versori + SDK services:** `toStructuredLogger(ctx.log, { service: 'name' })`
|
|
264
|
+
- **Standalone apps:** `createConsoleLogger()`
|
|
265
|
+
|
|
266
|
+
**See:** [Logging Guide](../../02-CORE-GUIDES/api-reference/modules/api-reference-05-services.md#logging-utilities) for complete patterns.
|
|
267
|
+
|
|
268
|
+
#### StateService
|
|
269
|
+
**Source:** `src/services/core/state-service.ts` (lines 1-382)
|
|
270
|
+
|
|
271
|
+
Distributed state management with key-value storage.
|
|
272
|
+
|
|
273
|
+
**Constructor:** `new StateService(logger?)` - Logger is optional
|
|
274
|
+
|
|
275
|
+
**Key Features:**
|
|
276
|
+
- Distributed state management with KV storage
|
|
277
|
+
- File deduplication tracking
|
|
278
|
+
- Distributed locking with stale detection
|
|
279
|
+
- Daily job tracking
|
|
280
|
+
- Sync state management
|
|
281
|
+
|
|
282
|
+
**IMPORTANT:** All methods require `kv` parameter as first argument.
|
|
283
|
+
|
|
284
|
+
**Key Methods:**
|
|
285
|
+
- `acquireLock(lockName, kv, timeoutMinutes?)` - Acquire distributed lock
|
|
286
|
+
- `releaseLock(lockName, kv)` - Release lock
|
|
287
|
+
- `getSyncState(kv, workflowId?)` - Get sync state
|
|
288
|
+
- `updateSyncState(kv, processedFiles, workflowId?)` - Update sync state
|
|
289
|
+
- `getDailyJob(kv, workflowId)` - Get or check daily job
|
|
290
|
+
- `setDailyJob(kv, workflowId, jobId, expirationHours?)` - Store daily job
|
|
291
|
+
- `isFileProcessed(kv, fileName, workflowId?)` - Check if file processed
|
|
292
|
+
- `getMetrics(kv, workflowId?)` - Get processing metrics
|
|
293
|
+
- `clearState(kv, workflowId)` - Clear all state for workflow
|
|
294
|
+
|
|
295
|
+
**State Management Example:**
|
|
296
|
+
|
|
297
|
+
```typescript
|
|
298
|
+
import { StateService, VersoriKVAdapter } from '@fluentcommerce/fc-connect-sdk';
|
|
299
|
+
|
|
300
|
+
const kvAdapter = new VersoriKVAdapter(openKv());
|
|
301
|
+
const stateService = new StateService(logger);
|
|
302
|
+
|
|
303
|
+
// Check if file processed (note: kv is first parameter)
|
|
304
|
+
const processed = await stateService.isFileProcessed(
|
|
305
|
+
kvAdapter,
|
|
306
|
+
'file-key',
|
|
307
|
+
'my-workflow'
|
|
308
|
+
);
|
|
309
|
+
|
|
310
|
+
if (!processed) {
|
|
311
|
+
// Process file
|
|
312
|
+
await processFile();
|
|
313
|
+
|
|
314
|
+
// Update sync state with processed file metadata
|
|
315
|
+
await stateService.updateSyncState(
|
|
316
|
+
kvAdapter,
|
|
317
|
+
[{
|
|
318
|
+
fileName: 'file-key',
|
|
319
|
+
lastModified: new Date().toISOString(),
|
|
320
|
+
recordCount: 100
|
|
321
|
+
}],
|
|
322
|
+
'my-workflow'
|
|
323
|
+
);
|
|
324
|
+
}
|
|
325
|
+
```
|
|
326
|
+
|
|
327
|
+
#### JobTracker
|
|
328
|
+
**Source:** `src/services/core/job-tracker.ts` (lines 1-355)
|
|
329
|
+
|
|
330
|
+
Job status tracking for async workflows. Provides standardized way to track job status in Versori integrations, making it easy to monitor scheduled workflows and webhook-triggered operations.
|
|
331
|
+
|
|
332
|
+
**Key Features:**
|
|
333
|
+
- Standardized job status tracking (queued, processing, completed, failed)
|
|
334
|
+
- Automatic timestamp management
|
|
335
|
+
- TTL support for automatic cleanup
|
|
336
|
+
- Safe error handling (never throws on KV errors)
|
|
337
|
+
- Detailed logging
|
|
338
|
+
|
|
339
|
+
**Key Methods:**
|
|
340
|
+
- `createJob(jobId, metadata)` - Creates a new job with 'queued' status
|
|
341
|
+
- `updateJob(jobId, update)` - Updates job status
|
|
342
|
+
- `getJob(jobId)` - Retrieves job status
|
|
343
|
+
- `markCompleted(jobId, details)` - Marks job as completed
|
|
344
|
+
- `markFailed(jobId, error)` - Marks job as failed
|
|
345
|
+
|
|
346
|
+
**Example Usage:**
|
|
347
|
+
|
|
348
|
+
```typescript
|
|
349
|
+
const tracker = new JobTracker(kvAdapter, logger);
|
|
350
|
+
|
|
351
|
+
// Create job
|
|
352
|
+
await tracker.createJob('job_123', {
|
|
353
|
+
triggeredBy: 'schedule',
|
|
354
|
+
stage: 'extraction'
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
// Update progress
|
|
358
|
+
await tracker.updateJob('job_123', {
|
|
359
|
+
status: 'processing',
|
|
360
|
+
stage: 'transformation',
|
|
361
|
+
message: 'Processing 1000 records'
|
|
362
|
+
});
|
|
363
|
+
|
|
364
|
+
// Mark as completed
|
|
365
|
+
await tracker.markCompleted('job_123', {
|
|
366
|
+
recordCount: 1000,
|
|
367
|
+
fileName: 'export.xml'
|
|
368
|
+
});
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
### 3. Mapping Services
|
|
372
|
+
|
|
373
|
+
**Location:** `src/services/mapping/`
|
|
374
|
+
|
|
375
|
+
Universal field mapping for all data transformations.
|
|
376
|
+
|
|
377
|
+
```mermaid
|
|
378
|
+
graph TB
|
|
379
|
+
subgraph "Mapping Services"
|
|
380
|
+
UNIVERSAL[UniversalMapper]
|
|
381
|
+
MUTATION[GraphQLMutationMapper]
|
|
382
|
+
PATH[PathResolver]
|
|
383
|
+
end
|
|
384
|
+
|
|
385
|
+
UNIVERSAL --> RESOLVE[Field Resolution]
|
|
386
|
+
UNIVERSAL --> VALIDATE[Validation]
|
|
387
|
+
UNIVERSAL --> TRANSFORM[Apply Resolvers]
|
|
388
|
+
|
|
389
|
+
MUTATION --> PARSE[Parse Input]
|
|
390
|
+
MUTATION --> MAP[Apply Mappings]
|
|
391
|
+
MUTATION --> BUILD[Build Mutation]
|
|
392
|
+
|
|
393
|
+
PATH --> JSON[JSONPath Resolution]
|
|
394
|
+
PATH --> XML[XMLPath Resolution]
|
|
395
|
+
PATH --> GRAPHQL[GraphQL Path Resolution]
|
|
396
|
+
|
|
397
|
+
style UNIVERSAL fill:#e3f2fd
|
|
398
|
+
style MUTATION fill:#fff3e0
|
|
399
|
+
style PATH fill:#f3e5f5
|
|
400
|
+
```
|
|
401
|
+
|
|
402
|
+
**Key Responsibilities:**
|
|
403
|
+
|
|
404
|
+
- Universal field mapping configuration
|
|
405
|
+
- GraphQL mutation generation from XML/JSON
|
|
406
|
+
- Path resolution for nested data
|
|
407
|
+
- Field validation and transformation
|
|
408
|
+
|
|
409
|
+
**Universal Mapping Example:**
|
|
410
|
+
|
|
411
|
+
```typescript
|
|
412
|
+
const mapper = new UniversalMapper({
|
|
413
|
+
fields: {
|
|
414
|
+
skuRef: { source: 'sku_id', required: true },
|
|
415
|
+
qty: { source: 'quantity', resolver: 'sdk.parseInt' },
|
|
416
|
+
expectedOn: { source: 'date', resolver: 'sdk.formatDate' },
|
|
417
|
+
},
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
const result = await mapper.map(sourceData);
|
|
421
|
+
// { success: true, data: { skuRef: '...', qty: 10, expectedOn: '2025-01-15' } }
|
|
422
|
+
```
|
|
423
|
+
|
|
424
|
+
**GraphQL Mutation Mapping Example:**
|
|
425
|
+
|
|
426
|
+
```typescript
|
|
427
|
+
const mutationMapper = new GraphQLMutationMapper(xmlParser, logger);
|
|
428
|
+
|
|
429
|
+
const mutation = await mutationMapper.generateMutation(xmlData, mappingConfig);
|
|
430
|
+
|
|
431
|
+
// Execute mutation
|
|
432
|
+
const result = await fluentClient.graphql({ query: mutation });
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
### 4. Transformation & Extraction Services
|
|
436
|
+
|
|
437
|
+
**Location:** `src/services/transformation/` and `src/services/extraction/`
|
|
438
|
+
|
|
439
|
+
Data extraction and transformation services.
|
|
440
|
+
|
|
441
|
+
```mermaid
|
|
442
|
+
graph TB
|
|
443
|
+
subgraph "Transformation & Extraction Services"
|
|
444
|
+
ORCH[ExtractionOrchestrator]
|
|
445
|
+
end
|
|
446
|
+
|
|
447
|
+
ORCH --> QUERY[Execute GraphQL Query]
|
|
448
|
+
ORCH --> AUTOPAGE[Automatic Pagination]
|
|
449
|
+
ORCH --> PATHEXTRACT[Path-based Extraction]
|
|
450
|
+
ORCH --> VALIDATE[Per-item Validation]
|
|
451
|
+
ORCH --> STATS[Statistics Tracking]
|
|
452
|
+
ORCH --> LIMITS[Limits: maxRecords, maxPages, timeout]
|
|
453
|
+
|
|
454
|
+
style ORCH fill:#fff3e0
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
**Key Services:**
|
|
458
|
+
|
|
459
|
+
#### ExtractionOrchestrator (Optional Helper)
|
|
460
|
+
**Source:** `src/services/extraction/extraction-orchestrator.ts` (lines 1-460)
|
|
461
|
+
Generic data extraction from Fluent Commerce GraphQL API with automatic pagination, error handling, and statistics tracking. This is an **optional convenience service** for extraction workflows.
|
|
462
|
+
|
|
463
|
+
> **Note**: For maximum flexibility, consider using `client.graphql()` with auto-pagination directly instead of this orchestrator. Building blocks give you more control over the workflow.
|
|
464
|
+
|
|
465
|
+
**Key Features:**
|
|
466
|
+
- Automatic pagination handling
|
|
467
|
+
- Extraction limits (maxRecords, maxPages, timeout)
|
|
468
|
+
- Path-based result extraction from nested GraphQL responses
|
|
469
|
+
- Per-item validation
|
|
470
|
+
- Comprehensive error handling
|
|
471
|
+
- Statistics tracking
|
|
472
|
+
|
|
473
|
+
**Key Methods:**
|
|
474
|
+
- `extract<T>(options)` - Extract data from Fluent Commerce GraphQL API
|
|
475
|
+
- Returns: `Promise<ExtractionResult<T>>` with data, stats, and errors
|
|
476
|
+
|
|
477
|
+
**Example Usage:**
|
|
478
|
+
|
|
479
|
+
```typescript
|
|
480
|
+
const orchestrator = new ExtractionOrchestrator(client, logger);
|
|
481
|
+
|
|
482
|
+
const result = await orchestrator.extract({
|
|
483
|
+
query: VIRTUAL_POSITIONS_QUERY,
|
|
484
|
+
variables: {
|
|
485
|
+
catalogues: [{ ref: 'DEFAULT:1' }],
|
|
486
|
+
dateRangeFilter: { from: '2024-01-01' }
|
|
487
|
+
},
|
|
488
|
+
resultPath: 'virtualPositions.edges.node',
|
|
489
|
+
pageSize: 200,
|
|
490
|
+
maxRecords: 100000,
|
|
491
|
+
validateItem: (item) => item.ref && item.quantity > 0
|
|
492
|
+
});
|
|
493
|
+
|
|
494
|
+
console.log(`Extracted ${result.stats.totalRecords} records in ${result.stats.duration}ms`);
|
|
495
|
+
console.log(`Pages fetched: ${result.stats.totalPages}`);
|
|
496
|
+
if (result.stats.truncated) {
|
|
497
|
+
console.log(`Truncation reason: ${result.stats.truncationReason}`);
|
|
498
|
+
}
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
**Alternative (Building Blocks - More Flexible):**
|
|
502
|
+
|
|
503
|
+
For more control, compose `client.graphql()` with auto-pagination and UniversalMapper:
|
|
504
|
+
|
|
505
|
+
```typescript
|
|
506
|
+
// Direct approach with client auto-pagination
|
|
507
|
+
const result = await client.graphql({
|
|
508
|
+
query: VIRTUAL_POSITIONS_QUERY,
|
|
509
|
+
variables: { catalogues: [{ ref: 'DEFAULT:1' }] },
|
|
510
|
+
pagination: { maxRecords: 100000, pageSize: 200 }
|
|
511
|
+
});
|
|
512
|
+
|
|
513
|
+
const items = result.data?.virtualPositions?.edges?.map(e => e.node) || [];
|
|
514
|
+
|
|
515
|
+
// Transform with UniversalMapper if needed
|
|
516
|
+
const mapper = new UniversalMapper(mappingConfig);
|
|
517
|
+
const transformed = await Promise.all(items.map(item => mapper.map(item)));
|
|
518
|
+
|
|
519
|
+
console.log(`Extracted ${items.length} records`);
|
|
520
|
+
```
|
|
521
|
+
|
|
522
|
+
> Note: Any references below to Orchestration are historical and should be interpreted as building-block patterns using clients + services.
|
|
523
|
+
|
|
524
|
+
### 5. Resolver Services
|
|
525
|
+
|
|
526
|
+
**Location:** `src/services/resolvers/`
|
|
527
|
+
|
|
528
|
+
Built-in transformation functions (SDK resolvers) and helper utilities.
|
|
529
|
+
|
|
530
|
+
**SDK Resolver Categories:**
|
|
531
|
+
|
|
532
|
+
```typescript
|
|
533
|
+
// String transformations
|
|
534
|
+
('sdk.uppercase', 'sdk.lowercase', 'sdk.trim', 'sdk.toString');
|
|
535
|
+
|
|
536
|
+
// Number parsing
|
|
537
|
+
('sdk.parseInt', 'sdk.parseFloat', 'sdk.number');
|
|
538
|
+
|
|
539
|
+
// Date formatting
|
|
540
|
+
('sdk.formatDate', 'sdk.formatDateShort', 'sdk.parseDate');
|
|
541
|
+
|
|
542
|
+
// Type conversions
|
|
543
|
+
('sdk.boolean', 'sdk.parseJson', 'sdk.toJson');
|
|
544
|
+
|
|
545
|
+
// Utilities
|
|
546
|
+
('sdk.identity', 'sdk.coalesce');
|
|
547
|
+
```
|
|
548
|
+
|
|
549
|
+
### 6. Integration Services
|
|
550
|
+
|
|
551
|
+
**Location:** `src/services/integration/`
|
|
552
|
+
|
|
553
|
+
External system integration utilities.
|
|
554
|
+
|
|
555
|
+
```mermaid
|
|
556
|
+
graph TB
|
|
557
|
+
subgraph "Integration Services"
|
|
558
|
+
S3[S3PresignService]
|
|
559
|
+
WEBHOOK[WebhookValidationService]
|
|
560
|
+
end
|
|
561
|
+
|
|
562
|
+
S3 --> PRESIGN[Generate Presigned URLs]
|
|
563
|
+
S3 --> UPLOAD[Upload via Presigned URL]
|
|
564
|
+
S3 --> DOWNLOAD[Download via Presigned URL]
|
|
565
|
+
|
|
566
|
+
WEBHOOK --> VALIDATE[Cryptographic Signature Validation]
|
|
567
|
+
WEBHOOK --> PARSE[Parse Payloads]
|
|
568
|
+
WEBHOOK --> VERIFY[Verify Timestamps]
|
|
569
|
+
WEBHOOK --> CLIENT[FluentClient.validateWebhook()]
|
|
570
|
+
|
|
571
|
+
style S3 fill:#e3f2fd
|
|
572
|
+
style WEBHOOK fill:#fff3e0
|
|
573
|
+
```
|
|
574
|
+
|
|
575
|
+
**Key Services:**
|
|
576
|
+
|
|
577
|
+
#### S3PresignService
|
|
578
|
+
Generate S3 presigned URLs for cross-account access without sharing credentials.
|
|
579
|
+
|
|
580
|
+
#### WebhookValidationService
|
|
581
|
+
**Integration:** Accessible via `FluentClient.validateWebhook()`
|
|
582
|
+
|
|
583
|
+
Cryptographic signature validation for Fluent Commerce webhooks.
|
|
584
|
+
|
|
585
|
+
**Key Responsibilities:**
|
|
586
|
+
|
|
587
|
+
- Generate S3 presigned URLs (SigV4)
|
|
588
|
+
- Validate webhook signatures (HMAC-SHA256)
|
|
589
|
+
- Parse webhook payloads
|
|
590
|
+
- Support cross-account S3 access
|
|
591
|
+
- Verify webhook timestamp freshness
|
|
592
|
+
|
|
593
|
+
**S3 Presign Example:**
|
|
594
|
+
|
|
595
|
+
```typescript
|
|
596
|
+
const s3PresignService = new S3PresignService(config);
|
|
597
|
+
|
|
598
|
+
// Generate upload URL
|
|
599
|
+
const uploadUrl = await s3PresignService.getPresignedUploadUrl(
|
|
600
|
+
'my-bucket',
|
|
601
|
+
'path/to/file.csv',
|
|
602
|
+
3600 // 1 hour expiration
|
|
603
|
+
);
|
|
604
|
+
|
|
605
|
+
// Upload file
|
|
606
|
+
await fetch(uploadUrl, {
|
|
607
|
+
method: 'PUT',
|
|
608
|
+
body: fileData,
|
|
609
|
+
});
|
|
610
|
+
```
|
|
611
|
+
|
|
612
|
+
**Webhook Validation Example:**
|
|
613
|
+
|
|
614
|
+
```typescript
|
|
615
|
+
// Via FluentClient (recommended) - returns boolean
|
|
616
|
+
const isValid = await client.validateWebhook(
|
|
617
|
+
webhookBody,
|
|
618
|
+
request.headers['x-fluent-signature'],
|
|
619
|
+
rawRequestBody
|
|
620
|
+
);
|
|
621
|
+
|
|
622
|
+
if (!isValid) {
|
|
623
|
+
throw new Error('Invalid webhook signature');
|
|
624
|
+
}
|
|
625
|
+
|
|
626
|
+
// Process validated webhook
|
|
627
|
+
console.log('Event type:', webhookBody.name);
|
|
628
|
+
```
|
|
629
|
+
|
|
630
|
+
### 8. Auth Services
|
|
631
|
+
|
|
632
|
+
**Location:** `src/services/auth/`
|
|
633
|
+
|
|
634
|
+
Webhook authentication services for API key and token management.
|
|
635
|
+
|
|
636
|
+
**Key Services:**
|
|
637
|
+
|
|
638
|
+
#### WebhookAuthService
|
|
639
|
+
|
|
640
|
+
Provides API key and token validation for webhook endpoints.
|
|
641
|
+
|
|
642
|
+
**Key Features:**
|
|
643
|
+
- API key validation
|
|
644
|
+
- Token issuance and validation
|
|
645
|
+
- User validation
|
|
646
|
+
- Support for multiple authentication methods
|
|
647
|
+
|
|
648
|
+
### 9. S3 Services
|
|
649
|
+
|
|
650
|
+
**Location:** `src/services/s3/`
|
|
651
|
+
|
|
652
|
+
**Note:** S3Service is exported directly from the SDK root (`src/index.ts`), not from `services/index.ts`.
|
|
653
|
+
|
|
654
|
+
Unified S3 operations with dual implementation strategies.
|
|
655
|
+
|
|
656
|
+
```mermaid
|
|
657
|
+
graph TB
|
|
658
|
+
subgraph "S3 Services"
|
|
659
|
+
S3SERVICE[S3Service]
|
|
660
|
+
SDK_IMPL[SDKImplementation<br/>AWS SDK v3]
|
|
661
|
+
PRESIGNED_IMPL[PresignedImplementation<br/>SigV4 URLs]
|
|
662
|
+
end
|
|
663
|
+
|
|
664
|
+
S3SERVICE --> SDK_IMPL
|
|
665
|
+
S3SERVICE --> PRESIGNED_IMPL
|
|
666
|
+
|
|
667
|
+
SDK_IMPL --> BASIC[Basic Ops<br/>get, put, list, delete]
|
|
668
|
+
SDK_IMPL --> ADVANCED[Advanced Ops<br/>multipart, S3 Select]
|
|
669
|
+
|
|
670
|
+
PRESIGNED_IMPL --> BASIC_PS[Basic Ops<br/>get, put, list, delete]
|
|
671
|
+
|
|
672
|
+
style S3SERVICE fill:#e3f2fd
|
|
673
|
+
style SDK_IMPL fill:#e8f5e9
|
|
674
|
+
style PRESIGNED_IMPL fill:#fff3e0
|
|
675
|
+
```
|
|
676
|
+
|
|
677
|
+
**Key Services:**
|
|
678
|
+
|
|
679
|
+
#### S3Service
|
|
680
|
+
**Source:** `src/services/s3/s3-service.ts`
|
|
681
|
+
|
|
682
|
+
Main interface for S3 operations with automatic implementation selection.
|
|
683
|
+
|
|
684
|
+
**Two Implementation Modes:**
|
|
685
|
+
|
|
686
|
+
1. **SDK Mode (Default)** - Uses AWS SDK v3
|
|
687
|
+
- Full feature set including multipart upload and S3 Select
|
|
688
|
+
- Works in Node.js and environments with AWS SDK support
|
|
689
|
+
- Best for production workloads with large files
|
|
690
|
+
|
|
691
|
+
2. **Presigned Mode (Explicit)** - Uses presigned URLs
|
|
692
|
+
- Works in restricted environments (browsers, Versori platform)
|
|
693
|
+
- Basic operations only (no multipart, no S3 Select)
|
|
694
|
+
- Requires `ctx.fetch` when used in Versori
|
|
695
|
+
|
|
696
|
+
**Key Methods:**
|
|
697
|
+
|
|
698
|
+
**Basic Operations (Both modes):**
|
|
699
|
+
- `listObjects(bucket, options)` - List objects in bucket
|
|
700
|
+
- `getObject(bucket, key)` - Get object content
|
|
701
|
+
- `putObject(bucket, key, body, options)` - Upload object
|
|
702
|
+
- `deleteObject(bucket, key)` - Delete object
|
|
703
|
+
- `copyObject(source, dest, options)` - Copy object
|
|
704
|
+
- `headObject(bucket, key)` - Get metadata without downloading
|
|
705
|
+
- `moveObject(source, dest, options)` - Move object (copy + delete)
|
|
706
|
+
- `objectExists(bucket, key)` - Check if object exists
|
|
707
|
+
|
|
708
|
+
**Advanced Operations (SDK mode only):**
|
|
709
|
+
- `createMultipartUpload(bucket, key, options)` - Start multipart upload
|
|
710
|
+
- `uploadPart(bucket, key, uploadId, partNumber, body)` - Upload part
|
|
711
|
+
- `completeMultipartUpload(bucket, key, uploadId, parts)` - Complete upload
|
|
712
|
+
- `abortMultipartUpload(bucket, key, uploadId)` - Abort upload
|
|
713
|
+
- `selectObjectContent(bucket, key, expression, type)` - S3 Select query
|
|
714
|
+
- `uploadLargeFile(bucket, key, data, options)` - Helper for large files
|
|
715
|
+
- `queryCSV(bucket, key, query)` - Query CSV with S3 Select
|
|
716
|
+
|
|
717
|
+
**Example Usage:**
|
|
718
|
+
|
|
719
|
+
```typescript
|
|
720
|
+
// Default - uses AWS SDK v3
|
|
721
|
+
const s3 = new S3Service({
|
|
722
|
+
accessKeyId: 'xxx',
|
|
723
|
+
secretAccessKey: 'yyy',
|
|
724
|
+
region: 'us-east-1'
|
|
725
|
+
});
|
|
726
|
+
|
|
727
|
+
// Basic operations
|
|
728
|
+
const objects = await s3.listObjects('my-bucket', { prefix: 'incoming/' });
|
|
729
|
+
const content = await s3.getObject('my-bucket', 'file.csv');
|
|
730
|
+
await s3.putObject('my-bucket', 'output.json', JSON.stringify(data));
|
|
731
|
+
|
|
732
|
+
// Advanced - multipart upload for large files
|
|
733
|
+
await s3.uploadLargeFile('my-bucket', 'large.parquet', buffer, {
|
|
734
|
+
partSize: 10 * 1024 * 1024 // 10MB parts
|
|
735
|
+
});
|
|
736
|
+
|
|
737
|
+
// Presigned mode (for Versori)
|
|
738
|
+
const s3Presigned = new S3Service({
|
|
739
|
+
accessKeyId: 'xxx',
|
|
740
|
+
secretAccessKey: 'yyy',
|
|
741
|
+
region: 'us-east-1',
|
|
742
|
+
usePresigned: true,
|
|
743
|
+
fetch: ctx.fetch
|
|
744
|
+
});
|
|
745
|
+
|
|
746
|
+
// Basic operations work in presigned mode
|
|
747
|
+
await s3Presigned.putObject('my-bucket', 'output.json', data);
|
|
748
|
+
```
|
|
749
|
+
|
|
750
|
+
### 10. Validation Services
|
|
751
|
+
|
|
752
|
+
**Location:** `src/services/validation/`
|
|
753
|
+
|
|
754
|
+
Data and schema validation services.
|
|
755
|
+
|
|
756
|
+
```mermaid
|
|
757
|
+
graph TB
|
|
758
|
+
subgraph "Validation Services"
|
|
759
|
+
SCHEMA[SchemaValidationService]
|
|
760
|
+
PREFLIGHT[PreflightValidator]
|
|
761
|
+
end
|
|
762
|
+
|
|
763
|
+
SCHEMA --> MAPPING[Validate Mappings]
|
|
764
|
+
SCHEMA --> CONFIG[Validate Config]
|
|
765
|
+
SCHEMA --> GRAPHQL[Validate GraphQL Schema]
|
|
766
|
+
|
|
767
|
+
PREFLIGHT --> REQUIRED[Required Fields]
|
|
768
|
+
PREFLIGHT --> TYPE[Type Checking]
|
|
769
|
+
PREFLIGHT --> DUPLICATE[Duplicate Detection]
|
|
770
|
+
PREFLIGHT --> CUSTOM[Custom Validation]
|
|
771
|
+
PREFLIGHT --> BATCH[Batch Size Check]
|
|
772
|
+
|
|
773
|
+
style SCHEMA fill:#e3f2fd
|
|
774
|
+
style PREFLIGHT fill:#fff3e0
|
|
775
|
+
```
|
|
776
|
+
|
|
777
|
+
**Key Services:**
|
|
778
|
+
|
|
779
|
+
#### SchemaValidationService
|
|
780
|
+
**Source:** `src/services/validation/schema-validation-service.ts`
|
|
781
|
+
|
|
782
|
+
Validates mapping configurations and GraphQL schema compliance.
|
|
783
|
+
|
|
784
|
+
- Validate mapping configurations
|
|
785
|
+
- Validate GraphQL schema compliance
|
|
786
|
+
- Check field existence in schema
|
|
787
|
+
|
|
788
|
+
#### PreflightValidator
|
|
789
|
+
**Source:** `src/services/validation/preflight-validator.ts` (lines 1-352)
|
|
790
|
+
Validates data BEFORE sending to Fluent API to catch errors early and save API quota. Pre-flight validation helps identify data quality issues before submission.
|
|
791
|
+
|
|
792
|
+
**Key Features:**
|
|
793
|
+
- Catch errors early and save API quota
|
|
794
|
+
- Validate against GraphQL schema requirements
|
|
795
|
+
- Check for duplicates and data quality issues
|
|
796
|
+
- Provide actionable error messages
|
|
797
|
+
- Support custom validation functions
|
|
798
|
+
|
|
799
|
+
**Key Methods:**
|
|
800
|
+
- `validateBatch(records, options)` - Validate a batch of records before sending to API
|
|
801
|
+
- `validateQuick(records, options)` - Quick validation (returns first error only)
|
|
802
|
+
|
|
803
|
+
**Example Usage:**
|
|
804
|
+
|
|
805
|
+
```typescript
|
|
806
|
+
const validator = new PreflightValidator(logger);
|
|
807
|
+
|
|
808
|
+
// Validate batch before sending
|
|
809
|
+
const result = await validator.validateBatch(records, {
|
|
810
|
+
entityType: 'INVENTORY',
|
|
811
|
+
requiredFields: ['ref', 'qty'],
|
|
812
|
+
checkDuplicates: true,
|
|
813
|
+
validateTypes: true,
|
|
814
|
+
maxBatchSize: 500,
|
|
815
|
+
customValidator: (record, index) => {
|
|
816
|
+
if (record.qty < 0) {
|
|
817
|
+
return `Record ${index}: qty cannot be negative`;
|
|
818
|
+
}
|
|
819
|
+
return null;
|
|
820
|
+
}
|
|
821
|
+
});
|
|
822
|
+
|
|
823
|
+
if (!result.isValid) {
|
|
824
|
+
console.error(`Validation failed: ${result.errors.length} errors`);
|
|
825
|
+
result.errors.forEach(err => {
|
|
826
|
+
console.error(`Record ${err.index}: ${err.message}`);
|
|
827
|
+
});
|
|
828
|
+
// Don't send to API - fix data first
|
|
829
|
+
return;
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
// Validation passed - safe to send to API
|
|
833
|
+
await client.sendBatch(jobId, { entities: records });
|
|
834
|
+
```
|