@fluentcommerce/fc-connect-sdk 0.1.54 → 0.1.56
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/README.md +11 -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,520 +1,520 @@
|
|
|
1
|
-
# Rubix Webhook Templates
|
|
2
|
-
|
|
3
|
-
> **Templates for receiving webhooks from Fluent Commerce Rubix workflows**
|
|
4
|
-
> Complete pattern: Rubix → Versori → Validate → Query/Mutate → Logic → Output
|
|
5
|
-
|
|
6
|
-
## Overview
|
|
7
|
-
|
|
8
|
-
This directory contains templates demonstrating how to receive webhooks from Fluent Commerce Rubix workflows, validate signatures, and perform entity-specific operations (GraphQL queries, mutations, SFTP exports).
|
|
9
|
-
|
|
10
|
-
## Pattern Flow
|
|
11
|
-
|
|
12
|
-
```
|
|
13
|
-
┌─────────────────┐
|
|
14
|
-
│ Rubix Workflow │
|
|
15
|
-
│ (Fluent Commerce)│
|
|
16
|
-
└────────┬─────────┘
|
|
17
|
-
│
|
|
18
|
-
│ HTTP POST with signature
|
|
19
|
-
│ Payload: { entityRef, entityType, retailerId }
|
|
20
|
-
▼
|
|
21
|
-
┌─────────────────────────────────────┐
|
|
22
|
-
│ Versori Webhook Endpoint │
|
|
23
|
-
│ 1. Validate signature (sync) │
|
|
24
|
-
│ 2. Extract entity ref │
|
|
25
|
-
│ 3. Return HTTP 200 OK immediately │
|
|
26
|
-
│ │
|
|
27
|
-
│ Background (fire-and-forget): │
|
|
28
|
-
│ 4. Query/mutate Fluent via GraphQL │
|
|
29
|
-
│ 5. Perform business logic │
|
|
30
|
-
│ 6. Export to SFTP (if applicable) │
|
|
31
|
-
└─────────────────────────────────────┘
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
## Available Templates
|
|
35
|
-
|
|
36
|
-
| Template | Entity | Destination | Complexity | Status | Use Case |
|
|
37
|
-
|----------|--------|-------------|------------|--------|----------|
|
|
38
|
-
| **[Fulfilment → SFTP XML (Inline)](./template-webhook-rubix-fulfilment-to-sftp-xml-inline.md)** | FULFILMENT | SFTP + XML | Medium | ✅ Production Ready | Export fulfilment details to 3PL/WMS partner via SFTP when fulfilment is created/updated (inline mapping) |
|
|
39
|
-
| **[Fulfilment → SFTP XML (UniversalMapper)](./template-webhook-rubix-fulfilment-to-sftp-xml-universal-mapper.md)** | FULFILMENT | SFTP + XML | Medium | ✅ Production Ready | Export fulfilment details to 3PL/WMS partner via SFTP when fulfilment is created/updated (external JSON mapping) |
|
|
40
|
-
| **[Order → Attribute Update](./template-webhook-rubix-order-attribute-update.md)** | ORDER | GraphQL | Simple | ✅ Production Ready | Update order attributes when order status changes in Rubix workflow |
|
|
41
|
-
|
|
42
|
-
## Template Selection Guide
|
|
43
|
-
|
|
44
|
-
### When to Use Fulfilment → SFTP XML
|
|
45
|
-
|
|
46
|
-
✅ **Use this template if:**
|
|
47
|
-
- Receiving FULFILMENT webhooks from Rubix workflows
|
|
48
|
-
- Need to export fulfilment details to external systems
|
|
49
|
-
- 3PL/WMS requires XML format via SFTP
|
|
50
|
-
- Need fulfilment + line items + order + address details
|
|
51
|
-
- Require warehouse management system integration
|
|
52
|
-
|
|
53
|
-
**What it does:**
|
|
54
|
-
1. Validates webhook signature (fast, ~50ms response)
|
|
55
|
-
2. Background: Queries fulfilment details via GraphQL
|
|
56
|
-
3. Generates XML with XMLBuilder (automatic escaping)
|
|
57
|
-
4. Uploads to 3PL SFTP server
|
|
58
|
-
5. Always cleans up SFTP connections
|
|
59
|
-
|
|
60
|
-
**Key Features:**
|
|
61
|
-
- GraphQL queries (fulfilment + nested fields)
|
|
62
|
-
- XML generation with safe escaping
|
|
63
|
-
- SFTP upload with connection pooling
|
|
64
|
-
- Comprehensive error handling (GraphQL, SFTP errors)
|
|
65
|
-
|
|
66
|
-
**Two Mapping Patterns Available:**
|
|
67
|
-
|
|
68
|
-
The Fulfilment → SFTP XML template comes in **two versions** - choose based on your needs:
|
|
69
|
-
|
|
70
|
-
| Pattern | File | Best For |
|
|
71
|
-
|---------|------|----------|
|
|
72
|
-
| **🔵 Inline Mapping** | [template-webhook-rubix-fulfilment-to-sftp-xml-inline.md](./template-webhook-rubix-fulfilment-to-sftp-xml-inline.md) | Simple webhooks, fast debugging, tightly-coupled schemas |
|
|
73
|
-
| **🟢 UniversalMapper** | [template-webhook-rubix-fulfilment-to-sftp-xml-universal-mapper.md](./template-webhook-rubix-fulfilment-to-sftp-xml-universal-mapper.md) | Reusable configs, multi-environment, complex transformations |
|
|
74
|
-
|
|
75
|
-
**Quick Decision Guide:**
|
|
76
|
-
- **Use Inline** if: Simple XML structure (<20 fields), rarely changes, single environment, rapid prototyping
|
|
77
|
-
- **Use UniversalMapper** if: Complex XML (>20 fields), frequent changes, multi-environment (dev/staging/prod), need SDK resolvers
|
|
78
|
-
|
|
79
|
-
See [Mapping Pattern Comparison](#mapping-pattern-comparison) below for detailed comparison.
|
|
80
|
-
|
|
81
|
-
---
|
|
82
|
-
|
|
83
|
-
### When to Use Order → Attribute Update
|
|
84
|
-
|
|
85
|
-
✅ **Use this template if:**
|
|
86
|
-
- Receiving ORDER webhooks from Rubix workflows
|
|
87
|
-
- Need to update order custom attributes
|
|
88
|
-
- Simple attribute updates without external systems
|
|
89
|
-
- No SFTP/S3 export required
|
|
90
|
-
|
|
91
|
-
**What it does:**
|
|
92
|
-
1. Validates webhook signature (fast, ~50ms response)
|
|
93
|
-
2. Background: Updates order attributes via GraphQL mutation
|
|
94
|
-
3. Records processing timestamp
|
|
95
|
-
4. No external system integration
|
|
96
|
-
|
|
97
|
-
**Key Features:**
|
|
98
|
-
- GraphQL mutations (attribute updates)
|
|
99
|
-
- Lightweight (no SFTP/XML complexity)
|
|
100
|
-
- Fast background processing (~300-500ms)
|
|
101
|
-
- Simplified error handling
|
|
102
|
-
|
|
103
|
-
---
|
|
104
|
-
|
|
105
|
-
## Key Concepts
|
|
106
|
-
|
|
107
|
-
### Rubix Workflow Configuration
|
|
108
|
-
|
|
109
|
-
Rubix workflows in Fluent Commerce can call external webhook endpoints. When configuring a Rubix workflow:
|
|
110
|
-
|
|
111
|
-
1. **Add SendWebhook Action** - Configure to call Versori webhook endpoint
|
|
112
|
-
2. **Set Webhook URL** - Your Versori endpoint URL:
|
|
113
|
-
- Fulfilment: `https://{workspace}.versori.run/rubix-fulfilment`
|
|
114
|
-
- Order: `https://{workspace}.versori.run/rubix-order`
|
|
115
|
-
3. **Build Event Payload** - Include:
|
|
116
|
-
- `entityRef` - Entity reference (required)
|
|
117
|
-
- `entityType` - "FULFILMENT" or "ORDER" (required)
|
|
118
|
-
- `retailerId` - Retailer ID (required for GraphQL)
|
|
119
|
-
- Additional context fields as needed
|
|
120
|
-
4. **Signature Headers** - Automatically included by Fluent Commerce (`fluent-signature`, `flex.signature`)
|
|
121
|
-
|
|
122
|
-
### Versori Webhook Handler
|
|
123
|
-
|
|
124
|
-
Both templates follow the same core pattern:
|
|
125
|
-
- **Validates webhook signature** using `WebhookValidationService` (synchronously, ~10-50ms)
|
|
126
|
-
- **Returns fast response** using `mode: 'sync'` + fire-and-forget pattern (~50ms)
|
|
127
|
-
- **Processes in background** without blocking response (GraphQL, SFTP, etc.)
|
|
128
|
-
- **Validates retailerId** before `setRetailerId()` to prevent 401 errors
|
|
129
|
-
- **Handles SDK errors** (GraphQLError, AuthenticationError, DataSourceError)
|
|
130
|
-
|
|
131
|
-
**Critical Pattern:**
|
|
132
|
-
- ✅ Webhook handler uses `response: { mode: 'sync' }` directly (no `.then(http())`)
|
|
133
|
-
- ✅ Signature validation happens synchronously in webhook handler
|
|
134
|
-
- ✅ Background processing uses fire-and-forget (no `await` on background promise)
|
|
135
|
-
- ❌ **DO NOT** use `.then(http())` pattern - it creates unnecessary chaining
|
|
136
|
-
|
|
137
|
-
### Differences Between Templates
|
|
138
|
-
|
|
139
|
-
| Aspect | Fulfilment → SFTP XML | Order → Attribute Update |
|
|
140
|
-
|--------|------------------------|--------------------------|
|
|
141
|
-
| **Entity Type** | FULFILMENT | ORDER |
|
|
142
|
-
| **GraphQL Operation** | Query (fetch details) | Mutation (update attributes) |
|
|
143
|
-
| **Data Transformation** | ✅ XML generation | ❌ None |
|
|
144
|
-
| **External System** | ✅ SFTP upload | ❌ None |
|
|
145
|
-
| **SFTP Cleanup** | ✅ dispose() required | ❌ N/A |
|
|
146
|
-
| **Complexity** | Medium (query + XML + SFTP) | Simple (mutation only) |
|
|
147
|
-
| **Background Time** | ~2-5s | ~300-500ms |
|
|
148
|
-
| **Use Case** | 3PL/WMS integration | Order tracking |
|
|
149
|
-
|
|
150
|
-
---
|
|
151
|
-
|
|
152
|
-
## Common Configuration
|
|
153
|
-
|
|
154
|
-
### Activation Variables (All Templates)
|
|
155
|
-
|
|
156
|
-
```json
|
|
157
|
-
{
|
|
158
|
-
"fluentPublicKey": "-----BEGIN PUBLIC KEY-----...-----END PUBLIC KEY-----"
|
|
159
|
-
}
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
### Additional for Fulfilment → SFTP XML
|
|
163
|
-
|
|
164
|
-
```json
|
|
165
|
-
{
|
|
166
|
-
"sftpHost": "sftp.3pl-partner.com",
|
|
167
|
-
"sftpPort": 22,
|
|
168
|
-
"sftpRemotePath": "/incoming/fulfilments/"
|
|
169
|
-
}
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
> **Important:** `sftpUsername` and `sftpPassword` are **NOT** stored in activation variables. They are securely retrieved from the `sftp_export_server` connection vault at runtime (see SFTP Credential Management section below).
|
|
173
|
-
|
|
174
|
-
### Versori Connections (Required for All)
|
|
175
|
-
|
|
176
|
-
| Connection | Description |
|
|
177
|
-
|------------|-------------|
|
|
178
|
-
| `fluent_commerce` | OAuth2 connection to Fluent Commerce API |
|
|
179
|
-
| `sftp_export_server` | Basic Auth connection for SFTP credentials (username/password) - Required for Fulfilment templates |
|
|
180
|
-
|
|
181
|
-
## SFTP Credential Management
|
|
182
|
-
|
|
183
|
-
**For Fulfilment → SFTP XML templates:**
|
|
184
|
-
|
|
185
|
-
SFTP credentials (username/password) are stored securely in Versori connection vault, not in activation variables.
|
|
186
|
-
|
|
187
|
-
**Benefits:**
|
|
188
|
-
- ✅ Credentials stored securely in Versori vault
|
|
189
|
-
- ✅ Centralized management - update in one place
|
|
190
|
-
- ✅ Access control enforced by platform
|
|
191
|
-
- ✅ No credentials in activation variables
|
|
192
|
-
- ✅ Explicit error handling with validation
|
|
193
|
-
|
|
194
|
-
**Setup Steps:**
|
|
195
|
-
|
|
196
|
-
1. In Versori Dashboard → Connections → Add Connection
|
|
197
|
-
2. Name: `sftp_export_server`
|
|
198
|
-
3. Type: Basic Auth
|
|
199
|
-
4. Enter SFTP username and password
|
|
200
|
-
5. Save connection
|
|
201
|
-
6. Code automatically retrieves credentials using `ctx.credentials().getAccessToken('sftp_export_server')`
|
|
202
|
-
|
|
203
|
-
**Activation Variables (for SFTP):**
|
|
204
|
-
- `sftpHost` - SFTP server hostname
|
|
205
|
-
- `sftpPort` - SFTP server port (default: 22)
|
|
206
|
-
- `sftpRemotePath` - Remote directory path for uploads
|
|
207
|
-
|
|
208
|
-
**Connection (for SFTP):**
|
|
209
|
-
- `sftp_export_server` - Basic Auth connection containing username/password
|
|
210
|
-
|
|
211
|
-
---
|
|
212
|
-
|
|
213
|
-
## Security Best Practices
|
|
214
|
-
|
|
215
|
-
**Webhook Signature Validation:**
|
|
216
|
-
- ✅ Always validate `fluent-signature` or `flex.signature` headers
|
|
217
|
-
- ✅ Use `strictValidation: true` in WebhookValidationService
|
|
218
|
-
- ✅ Store public keys in activation variables (not hardcoded)
|
|
219
|
-
- ✅ Use environment-specific keys (dev/staging/prod)
|
|
220
|
-
|
|
221
|
-
**Credential Management:**
|
|
222
|
-
- ✅ Store SFTP credentials in Versori connection vault (not activation variables)
|
|
223
|
-
- ✅ Use `sftp_export_server` connection with Basic Auth
|
|
224
|
-
- ✅ Rotate credentials quarterly
|
|
225
|
-
- ✅ Use least-privilege accounts
|
|
226
|
-
- ❌ Never store passwords in activation variables
|
|
227
|
-
- ❌ Never log passwords or full signatures
|
|
228
|
-
|
|
229
|
-
---
|
|
230
|
-
|
|
231
|
-
## Development Workflow
|
|
232
|
-
|
|
233
|
-
### 1. Choose Template
|
|
234
|
-
|
|
235
|
-
Select the template that matches your entity type and use case:
|
|
236
|
-
- **FULFILMENT + SFTP** → Use fulfilment export template
|
|
237
|
-
- **ORDER + Attributes** → Use order update template
|
|
238
|
-
|
|
239
|
-
### 2. Configure Versori
|
|
240
|
-
|
|
241
|
-
1. Create new project in Versori workspace
|
|
242
|
-
2. Configure Fluent Commerce connection (OAuth2)
|
|
243
|
-
3. Set activation variables (public key + SFTP if needed)
|
|
244
|
-
|
|
245
|
-
### 3. Deploy Template
|
|
246
|
-
|
|
247
|
-
1. Copy template code to your project
|
|
248
|
-
2. Customize business logic in services/
|
|
249
|
-
3. Test with Versori dev environment
|
|
250
|
-
4. Deploy to production
|
|
251
|
-
|
|
252
|
-
### 4. Configure Rubix Workflow
|
|
253
|
-
|
|
254
|
-
1. Create/edit Rubix workflow in Fluent Commerce
|
|
255
|
-
2. Add SendWebhook action
|
|
256
|
-
3. Set URL to your Versori endpoint
|
|
257
|
-
4. Build Event payload with required fields
|
|
258
|
-
5. Test webhook triggers from Rubix
|
|
259
|
-
|
|
260
|
-
---
|
|
261
|
-
|
|
262
|
-
## Testing
|
|
263
|
-
|
|
264
|
-
### Test Webhook Signature Validation
|
|
265
|
-
|
|
266
|
-
```bash
|
|
267
|
-
# Test with invalid signature (should fail)
|
|
268
|
-
curl -X POST https://workspace.versori.run/rubix-fulfilment \
|
|
269
|
-
-H "Content-Type: application/json" \
|
|
270
|
-
-H "fluent-signature: invalid" \
|
|
271
|
-
-d '{"entityType":"FULFILMENT","entityRef":"FF-001","retailerId":"1"}'
|
|
272
|
-
|
|
273
|
-
# Expected: { success: false, error: "Invalid webhook signature" }
|
|
274
|
-
```
|
|
275
|
-
|
|
276
|
-
### Test with Valid Payload
|
|
277
|
-
|
|
278
|
-
```bash
|
|
279
|
-
# Test with valid payload (signature validation only in real scenario)
|
|
280
|
-
curl -X POST https://workspace.versori.run/rubix-fulfilment \
|
|
281
|
-
-H "Content-Type: application/json" \
|
|
282
|
-
-d '{
|
|
283
|
-
"entityType": "FULFILMENT",
|
|
284
|
-
"entityRef": "FF-001",
|
|
285
|
-
"retailerId": "1",
|
|
286
|
-
"id": "evt-123"
|
|
287
|
-
}'
|
|
288
|
-
```
|
|
289
|
-
|
|
290
|
-
---
|
|
291
|
-
|
|
292
|
-
## Troubleshooting
|
|
293
|
-
|
|
294
|
-
### Common Issues
|
|
295
|
-
|
|
296
|
-
**Issue: "Invalid webhook signature"**
|
|
297
|
-
- **Cause**: Wrong public key or payload modified
|
|
298
|
-
- **Solution**: Verify `fluentPublicKey` matches Fluent environment (dev/staging/prod)
|
|
299
|
-
|
|
300
|
-
**Issue: "Missing retailerId in payload"**
|
|
301
|
-
- **Cause**: Rubix Event payload incomplete
|
|
302
|
-
- **Solution**: Add `retailerId` field in Rubix Event payload builder
|
|
303
|
-
|
|
304
|
-
**Issue: "SFTP upload failed" (Fulfilment template)**
|
|
305
|
-
- **Cause**: Invalid SFTP credentials or connectivity
|
|
306
|
-
- **Solution**: Test SFTP manually, verify host/port/credentials
|
|
307
|
-
|
|
308
|
-
**Issue: "GraphQL mutation failed" (Order template)**
|
|
309
|
-
- **Cause**: Invalid permissions or syntax
|
|
310
|
-
- **Solution**: Verify user has UPDATE_ORDER permission, check mutation syntax
|
|
311
|
-
|
|
312
|
-
---
|
|
313
|
-
|
|
314
|
-
## Mapping Pattern Comparison
|
|
315
|
-
|
|
316
|
-
### Overview
|
|
317
|
-
|
|
318
|
-
The Fulfilment → SFTP XML template offers **two mapping patterns** for transforming GraphQL data to XML:
|
|
319
|
-
|
|
320
|
-
1. **[Inline Mapping Pattern](./template-webhook-rubix-fulfilment-to-sftp-xml-inline.md)** 🔵 - Manual object construction
|
|
321
|
-
2. **[UniversalMapper Pattern](./template-webhook-rubix-fulfilment-to-sftp-xml-universal-mapper.md)** 🟢 - External JSON mapping + custom resolvers
|
|
322
|
-
|
|
323
|
-
### Quick Comparison
|
|
324
|
-
|
|
325
|
-
| Aspect | Inline Pattern 🔵 | UniversalMapper Pattern 🟢 |
|
|
326
|
-
|--------|-------------------|---------------------------|
|
|
327
|
-
| **Complexity** | Simpler | More complex |
|
|
328
|
-
| **Config Files** | None | External JSON config |
|
|
329
|
-
| **Resolvers** | None | SDK + custom resolvers |
|
|
330
|
-
| **Best For** | Simple webhooks, tightly-coupled schemas | Reusable configs, multi-environment |
|
|
331
|
-
| **Code Location** | All in one file | Separated (config/, resolvers/, services/) |
|
|
332
|
-
| **Field Updates** | Require code changes | Change JSON config only |
|
|
333
|
-
| **Testing** | Inline test logic | Config + resolvers separately testable |
|
|
334
|
-
| **Reusability** | Limited | High |
|
|
335
|
-
| **Debugging** | Faster (all visible) | Slower (multiple files) |
|
|
336
|
-
|
|
337
|
-
### Pattern 1: Inline Mapping 🔵
|
|
338
|
-
|
|
339
|
-
**File:** [`template-webhook-rubix-fulfilment-to-sftp-xml-inline.md`](./template-webhook-rubix-fulfilment-to-sftp-xml-inline.md)
|
|
340
|
-
|
|
341
|
-
**When to Use:**
|
|
342
|
-
- ✅ Simple webhook handlers
|
|
343
|
-
- ✅ Tightly-coupled 3PL XML schemas
|
|
344
|
-
- ✅ Fast debugging needs
|
|
345
|
-
- ✅ Single-purpose transformations
|
|
346
|
-
- ✅ Small teams / rapid prototyping
|
|
347
|
-
|
|
348
|
-
**Code Example:**
|
|
349
|
-
```typescript
|
|
350
|
-
// src/services/xml-export.service.ts
|
|
351
|
-
// NO external config, NO resolvers, NO mapping files
|
|
352
|
-
const xmlData = {
|
|
353
|
-
Fulfilment: {
|
|
354
|
-
'@ref': fulfilmentData.ref,
|
|
355
|
-
'@status': fulfilmentData.status,
|
|
356
|
-
OrderRef: fulfilmentData.order?.ref || '',
|
|
357
|
-
Customer: fulfilmentData.order?.customer ? {
|
|
358
|
-
FirstName: fulfilmentData.order.customer.firstName || '',
|
|
359
|
-
LastName: fulfilmentData.order.customer.lastName || '',
|
|
360
|
-
} : {},
|
|
361
|
-
Items: {
|
|
362
|
-
Item: fulfilmentData.items?.edges?.map(edge => ({
|
|
363
|
-
'@ref': edge.node.ref,
|
|
364
|
-
ProductRef: edge.node.orderItem?.productRef || '',
|
|
365
|
-
Quantity: edge.node.quantity,
|
|
366
|
-
})) || [],
|
|
367
|
-
},
|
|
368
|
-
},
|
|
369
|
-
};
|
|
370
|
-
|
|
371
|
-
const xmlString = xmlBuilder.build(xmlData, 'FulfilmentExport');
|
|
372
|
-
```
|
|
373
|
-
|
|
374
|
-
**Project Structure:**
|
|
375
|
-
```
|
|
376
|
-
rubix-fulfilment-export/
|
|
377
|
-
├── package.json
|
|
378
|
-
├── index.ts
|
|
379
|
-
└── src/
|
|
380
|
-
├── workflows/webhook/
|
|
381
|
-
├── services/ # Inline mapping in xml-export.service.ts
|
|
382
|
-
└── types/
|
|
383
|
-
```
|
|
384
|
-
|
|
385
|
-
**Pros:**
|
|
386
|
-
- ✅ Simpler to understand - all logic in one place
|
|
387
|
-
- ✅ Faster debugging - no jumping between files
|
|
388
|
-
- ✅ Fewer files to maintain
|
|
389
|
-
- ✅ No external dependencies on mapping config
|
|
390
|
-
|
|
391
|
-
**Cons:**
|
|
392
|
-
- ❌ Field changes require code modifications
|
|
393
|
-
- ❌ Harder to reuse across projects
|
|
394
|
-
- ❌ No SDK resolver benefits
|
|
395
|
-
- ❌ Less testable (logic embedded in service)
|
|
396
|
-
|
|
397
|
-
---
|
|
398
|
-
|
|
399
|
-
### Pattern 2: UniversalMapper 🟢
|
|
400
|
-
|
|
401
|
-
**File:** [`template-webhook-rubix-fulfilment-to-sftp-xml-universal-mapper.md`](./template-webhook-rubix-fulfilment-to-sftp-xml-universal-mapper.md)
|
|
402
|
-
|
|
403
|
-
**When to Use:**
|
|
404
|
-
- ✅ Reusable configs across projects
|
|
405
|
-
- ✅ Multi-environment deployments (dev/staging/prod)
|
|
406
|
-
- ✅ Complex transformation logic
|
|
407
|
-
- ✅ SDK resolver benefits (parseInt, formatDate, uppercase, etc.)
|
|
408
|
-
- ✅ Frequent field mapping changes
|
|
409
|
-
- ✅ Large teams / production systems
|
|
410
|
-
|
|
411
|
-
**Code Example:**
|
|
412
|
-
```typescript
|
|
413
|
-
// config/fulfilment-xml-mapping.json
|
|
414
|
-
{
|
|
415
|
-
"fields": {
|
|
416
|
-
"@ref": { "source": "ref", "required": true },
|
|
417
|
-
"@status": { "source": "status", "resolver": "sdk.uppercase" },
|
|
418
|
-
"OrderRef": { "source": "order.ref", "default": "" },
|
|
419
|
-
"Customer": {
|
|
420
|
-
"type": "object",
|
|
421
|
-
"fields": {
|
|
422
|
-
"FirstName": { "source": "order.customer.firstName", "default": "" }
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
// src/services/xml-export.service.ts
|
|
429
|
-
import { UniversalMapper } from '@fluentcommerce/fc-connect-sdk';
|
|
430
|
-
import mappingConfig from '../config/fulfilment-xml-mapping.json' with { type: 'json' };
|
|
431
|
-
import { customResolvers } from '../resolvers/fulfilment-resolvers';
|
|
432
|
-
|
|
433
|
-
const mapper = new UniversalMapper(mappingConfig, { customResolvers });
|
|
434
|
-
const mappingResult = await mapper.map(fulfilmentData);
|
|
435
|
-
const xmlString = xmlBuilder.build(mappingResult.data, 'FulfilmentExport');
|
|
436
|
-
```
|
|
437
|
-
|
|
438
|
-
**Project Structure:**
|
|
439
|
-
```
|
|
440
|
-
rubix-fulfilment-export/
|
|
441
|
-
├── package.json
|
|
442
|
-
├── index.ts
|
|
443
|
-
├── config/
|
|
444
|
-
│ └── fulfilment-xml-mapping.json # ✨ External mapping config
|
|
445
|
-
└── src/
|
|
446
|
-
├── workflows/webhook/
|
|
447
|
-
├── services/ # Uses UniversalMapper
|
|
448
|
-
├── resolvers/ # ✨ Custom transformations
|
|
449
|
-
│ └── fulfilment-resolvers.ts
|
|
450
|
-
└── types/
|
|
451
|
-
```
|
|
452
|
-
|
|
453
|
-
**Pros:**
|
|
454
|
-
- ✅ Reusable mapping configuration across projects
|
|
455
|
-
- ✅ Environment-specific configs (dev/staging/prod)
|
|
456
|
-
- ✅ SDK resolvers built-in (parseInt, formatDate, uppercase, etc.)
|
|
457
|
-
- ✅ Custom resolvers for complex logic
|
|
458
|
-
- ✅ Field changes don't require code changes
|
|
459
|
-
- ✅ Mapping config is unit testable
|
|
460
|
-
|
|
461
|
-
**Cons:**
|
|
462
|
-
- ❌ More complex to set up
|
|
463
|
-
- ❌ More files to maintain (config/, resolvers/)
|
|
464
|
-
- ❌ Slower debugging (jumping between files)
|
|
465
|
-
- ❌ Overhead for simple transformations
|
|
466
|
-
|
|
467
|
-
---
|
|
468
|
-
|
|
469
|
-
### Decision Tree
|
|
470
|
-
|
|
471
|
-
```
|
|
472
|
-
Need to transform GraphQL data to XML for 3PL webhook?
|
|
473
|
-
│
|
|
474
|
-
├─ Is this a simple, one-off webhook?
|
|
475
|
-
│ └─ YES → Use Inline Pattern 🔵
|
|
476
|
-
│
|
|
477
|
-
├─ Will the mapping config be reused across projects?
|
|
478
|
-
│ └─ YES → Use UniversalMapper Pattern 🟢
|
|
479
|
-
│
|
|
480
|
-
├─ Do you need environment-specific configs (dev/staging/prod)?
|
|
481
|
-
│ └─ YES → Use UniversalMapper Pattern 🟢
|
|
482
|
-
│
|
|
483
|
-
├─ Will field mappings change frequently?
|
|
484
|
-
│ └─ YES → Use UniversalMapper Pattern 🟢
|
|
485
|
-
│
|
|
486
|
-
├─ Do you need SDK resolvers (parseInt, formatDate, etc.)?
|
|
487
|
-
│ └─ YES → Use UniversalMapper Pattern 🟢
|
|
488
|
-
│
|
|
489
|
-
└─ DEFAULT: For production systems → Use UniversalMapper Pattern 🟢
|
|
490
|
-
```
|
|
491
|
-
|
|
492
|
-
---
|
|
493
|
-
|
|
494
|
-
## Related Documentation
|
|
495
|
-
|
|
496
|
-
- [Webhook Validation Guide](../../../../02-CORE-GUIDES/webhook-validation/) - Signature validation details
|
|
497
|
-
- [Versori Platform Guide](../../../../04-REFERENCE/platforms/versori/) - Platform documentation
|
|
498
|
-
- [GraphQL Operations Guide](../../../../02-CORE-GUIDES/graphql/) - Query and mutation patterns
|
|
499
|
-
- [SFTP Data Sources Guide](../../../../02-CORE-GUIDES/data-sources/) - SFTP configuration
|
|
500
|
-
- [Payment Gateway Integration](../../../webhooks/template-webhook-payment-gateway-integration.md) - Similar webhook pattern
|
|
501
|
-
|
|
502
|
-
---
|
|
503
|
-
|
|
504
|
-
## Version History
|
|
505
|
-
|
|
506
|
-
### v2.0.0 (2025-01-25)
|
|
507
|
-
- ✅ Split generic template into two entity-specific templates
|
|
508
|
-
- ✅ Fulfilment template: GraphQL queries + XML generation + SFTP upload
|
|
509
|
-
- ✅ Order template: GraphQL mutations + attribute updates
|
|
510
|
-
- ✅ Applied critical fixes: retailerId validation, SFTP options parameter
|
|
511
|
-
- ✅ Added SDK error type handling (GraphQLError, AuthenticationError, DataSourceError)
|
|
512
|
-
- ✅ Improved type safety (replaced `any` with proper SDK types)
|
|
513
|
-
- ✅ Comprehensive testing, troubleshooting, and monitoring sections
|
|
514
|
-
|
|
515
|
-
### v1.0.0 (2025-01-XX)
|
|
516
|
-
- Initial generic Rubix webhook template (deprecated - use v2.0.0 specific templates)
|
|
517
|
-
|
|
518
|
-
---
|
|
519
|
-
|
|
520
|
-
**Next Steps**: Choose the template that matches your use case, copy the code, configure activation variables, and deploy to Versori!
|
|
1
|
+
# Rubix Webhook Templates
|
|
2
|
+
|
|
3
|
+
> **Templates for receiving webhooks from Fluent Commerce Rubix workflows**
|
|
4
|
+
> Complete pattern: Rubix → Versori → Validate → Query/Mutate → Logic → Output
|
|
5
|
+
|
|
6
|
+
## Overview
|
|
7
|
+
|
|
8
|
+
This directory contains templates demonstrating how to receive webhooks from Fluent Commerce Rubix workflows, validate signatures, and perform entity-specific operations (GraphQL queries, mutations, SFTP exports).
|
|
9
|
+
|
|
10
|
+
## Pattern Flow
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
┌─────────────────┐
|
|
14
|
+
│ Rubix Workflow │
|
|
15
|
+
│ (Fluent Commerce)│
|
|
16
|
+
└────────┬─────────┘
|
|
17
|
+
│
|
|
18
|
+
│ HTTP POST with signature
|
|
19
|
+
│ Payload: { entityRef, entityType, retailerId }
|
|
20
|
+
▼
|
|
21
|
+
┌─────────────────────────────────────┐
|
|
22
|
+
│ Versori Webhook Endpoint │
|
|
23
|
+
│ 1. Validate signature (sync) │
|
|
24
|
+
│ 2. Extract entity ref │
|
|
25
|
+
│ 3. Return HTTP 200 OK immediately │
|
|
26
|
+
│ │
|
|
27
|
+
│ Background (fire-and-forget): │
|
|
28
|
+
│ 4. Query/mutate Fluent via GraphQL │
|
|
29
|
+
│ 5. Perform business logic │
|
|
30
|
+
│ 6. Export to SFTP (if applicable) │
|
|
31
|
+
└─────────────────────────────────────┘
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Available Templates
|
|
35
|
+
|
|
36
|
+
| Template | Entity | Destination | Complexity | Status | Use Case |
|
|
37
|
+
|----------|--------|-------------|------------|--------|----------|
|
|
38
|
+
| **[Fulfilment → SFTP XML (Inline)](./template-webhook-rubix-fulfilment-to-sftp-xml-inline.md)** | FULFILMENT | SFTP + XML | Medium | ✅ Production Ready | Export fulfilment details to 3PL/WMS partner via SFTP when fulfilment is created/updated (inline mapping) |
|
|
39
|
+
| **[Fulfilment → SFTP XML (UniversalMapper)](./template-webhook-rubix-fulfilment-to-sftp-xml-universal-mapper.md)** | FULFILMENT | SFTP + XML | Medium | ✅ Production Ready | Export fulfilment details to 3PL/WMS partner via SFTP when fulfilment is created/updated (external JSON mapping) |
|
|
40
|
+
| **[Order → Attribute Update](./template-webhook-rubix-order-attribute-update.md)** | ORDER | GraphQL | Simple | ✅ Production Ready | Update order attributes when order status changes in Rubix workflow |
|
|
41
|
+
|
|
42
|
+
## Template Selection Guide
|
|
43
|
+
|
|
44
|
+
### When to Use Fulfilment → SFTP XML
|
|
45
|
+
|
|
46
|
+
✅ **Use this template if:**
|
|
47
|
+
- Receiving FULFILMENT webhooks from Rubix workflows
|
|
48
|
+
- Need to export fulfilment details to external systems
|
|
49
|
+
- 3PL/WMS requires XML format via SFTP
|
|
50
|
+
- Need fulfilment + line items + order + address details
|
|
51
|
+
- Require warehouse management system integration
|
|
52
|
+
|
|
53
|
+
**What it does:**
|
|
54
|
+
1. Validates webhook signature (fast, ~50ms response)
|
|
55
|
+
2. Background: Queries fulfilment details via GraphQL
|
|
56
|
+
3. Generates XML with XMLBuilder (automatic escaping)
|
|
57
|
+
4. Uploads to 3PL SFTP server
|
|
58
|
+
5. Always cleans up SFTP connections
|
|
59
|
+
|
|
60
|
+
**Key Features:**
|
|
61
|
+
- GraphQL queries (fulfilment + nested fields)
|
|
62
|
+
- XML generation with safe escaping
|
|
63
|
+
- SFTP upload with connection pooling
|
|
64
|
+
- Comprehensive error handling (GraphQL, SFTP errors)
|
|
65
|
+
|
|
66
|
+
**Two Mapping Patterns Available:**
|
|
67
|
+
|
|
68
|
+
The Fulfilment → SFTP XML template comes in **two versions** - choose based on your needs:
|
|
69
|
+
|
|
70
|
+
| Pattern | File | Best For |
|
|
71
|
+
|---------|------|----------|
|
|
72
|
+
| **🔵 Inline Mapping** | [template-webhook-rubix-fulfilment-to-sftp-xml-inline.md](./template-webhook-rubix-fulfilment-to-sftp-xml-inline.md) | Simple webhooks, fast debugging, tightly-coupled schemas |
|
|
73
|
+
| **🟢 UniversalMapper** | [template-webhook-rubix-fulfilment-to-sftp-xml-universal-mapper.md](./template-webhook-rubix-fulfilment-to-sftp-xml-universal-mapper.md) | Reusable configs, multi-environment, complex transformations |
|
|
74
|
+
|
|
75
|
+
**Quick Decision Guide:**
|
|
76
|
+
- **Use Inline** if: Simple XML structure (<20 fields), rarely changes, single environment, rapid prototyping
|
|
77
|
+
- **Use UniversalMapper** if: Complex XML (>20 fields), frequent changes, multi-environment (dev/staging/prod), need SDK resolvers
|
|
78
|
+
|
|
79
|
+
See [Mapping Pattern Comparison](#mapping-pattern-comparison) below for detailed comparison.
|
|
80
|
+
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
### When to Use Order → Attribute Update
|
|
84
|
+
|
|
85
|
+
✅ **Use this template if:**
|
|
86
|
+
- Receiving ORDER webhooks from Rubix workflows
|
|
87
|
+
- Need to update order custom attributes
|
|
88
|
+
- Simple attribute updates without external systems
|
|
89
|
+
- No SFTP/S3 export required
|
|
90
|
+
|
|
91
|
+
**What it does:**
|
|
92
|
+
1. Validates webhook signature (fast, ~50ms response)
|
|
93
|
+
2. Background: Updates order attributes via GraphQL mutation
|
|
94
|
+
3. Records processing timestamp
|
|
95
|
+
4. No external system integration
|
|
96
|
+
|
|
97
|
+
**Key Features:**
|
|
98
|
+
- GraphQL mutations (attribute updates)
|
|
99
|
+
- Lightweight (no SFTP/XML complexity)
|
|
100
|
+
- Fast background processing (~300-500ms)
|
|
101
|
+
- Simplified error handling
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## Key Concepts
|
|
106
|
+
|
|
107
|
+
### Rubix Workflow Configuration
|
|
108
|
+
|
|
109
|
+
Rubix workflows in Fluent Commerce can call external webhook endpoints. When configuring a Rubix workflow:
|
|
110
|
+
|
|
111
|
+
1. **Add SendWebhook Action** - Configure to call Versori webhook endpoint
|
|
112
|
+
2. **Set Webhook URL** - Your Versori endpoint URL:
|
|
113
|
+
- Fulfilment: `https://{workspace}.versori.run/rubix-fulfilment`
|
|
114
|
+
- Order: `https://{workspace}.versori.run/rubix-order`
|
|
115
|
+
3. **Build Event Payload** - Include:
|
|
116
|
+
- `entityRef` - Entity reference (required)
|
|
117
|
+
- `entityType` - "FULFILMENT" or "ORDER" (required)
|
|
118
|
+
- `retailerId` - Retailer ID (required for GraphQL)
|
|
119
|
+
- Additional context fields as needed
|
|
120
|
+
4. **Signature Headers** - Automatically included by Fluent Commerce (`fluent-signature`, `flex.signature`)
|
|
121
|
+
|
|
122
|
+
### Versori Webhook Handler
|
|
123
|
+
|
|
124
|
+
Both templates follow the same core pattern:
|
|
125
|
+
- **Validates webhook signature** using `WebhookValidationService` (synchronously, ~10-50ms)
|
|
126
|
+
- **Returns fast response** using `mode: 'sync'` + fire-and-forget pattern (~50ms)
|
|
127
|
+
- **Processes in background** without blocking response (GraphQL, SFTP, etc.)
|
|
128
|
+
- **Validates retailerId** before `setRetailerId()` to prevent 401 errors
|
|
129
|
+
- **Handles SDK errors** (GraphQLError, AuthenticationError, DataSourceError)
|
|
130
|
+
|
|
131
|
+
**Critical Pattern:**
|
|
132
|
+
- ✅ Webhook handler uses `response: { mode: 'sync' }` directly (no `.then(http())`)
|
|
133
|
+
- ✅ Signature validation happens synchronously in webhook handler
|
|
134
|
+
- ✅ Background processing uses fire-and-forget (no `await` on background promise)
|
|
135
|
+
- ❌ **DO NOT** use `.then(http())` pattern - it creates unnecessary chaining
|
|
136
|
+
|
|
137
|
+
### Differences Between Templates
|
|
138
|
+
|
|
139
|
+
| Aspect | Fulfilment → SFTP XML | Order → Attribute Update |
|
|
140
|
+
|--------|------------------------|--------------------------|
|
|
141
|
+
| **Entity Type** | FULFILMENT | ORDER |
|
|
142
|
+
| **GraphQL Operation** | Query (fetch details) | Mutation (update attributes) |
|
|
143
|
+
| **Data Transformation** | ✅ XML generation | ❌ None |
|
|
144
|
+
| **External System** | ✅ SFTP upload | ❌ None |
|
|
145
|
+
| **SFTP Cleanup** | ✅ dispose() required | ❌ N/A |
|
|
146
|
+
| **Complexity** | Medium (query + XML + SFTP) | Simple (mutation only) |
|
|
147
|
+
| **Background Time** | ~2-5s | ~300-500ms |
|
|
148
|
+
| **Use Case** | 3PL/WMS integration | Order tracking |
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## Common Configuration
|
|
153
|
+
|
|
154
|
+
### Activation Variables (All Templates)
|
|
155
|
+
|
|
156
|
+
```json
|
|
157
|
+
{
|
|
158
|
+
"fluentPublicKey": "-----BEGIN PUBLIC KEY-----...-----END PUBLIC KEY-----"
|
|
159
|
+
}
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Additional for Fulfilment → SFTP XML
|
|
163
|
+
|
|
164
|
+
```json
|
|
165
|
+
{
|
|
166
|
+
"sftpHost": "sftp.3pl-partner.com",
|
|
167
|
+
"sftpPort": 22,
|
|
168
|
+
"sftpRemotePath": "/incoming/fulfilments/"
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
> **Important:** `sftpUsername` and `sftpPassword` are **NOT** stored in activation variables. They are securely retrieved from the `sftp_export_server` connection vault at runtime (see SFTP Credential Management section below).
|
|
173
|
+
|
|
174
|
+
### Versori Connections (Required for All)
|
|
175
|
+
|
|
176
|
+
| Connection | Description |
|
|
177
|
+
|------------|-------------|
|
|
178
|
+
| `fluent_commerce` | OAuth2 connection to Fluent Commerce API |
|
|
179
|
+
| `sftp_export_server` | Basic Auth connection for SFTP credentials (username/password) - Required for Fulfilment templates |
|
|
180
|
+
|
|
181
|
+
## SFTP Credential Management
|
|
182
|
+
|
|
183
|
+
**For Fulfilment → SFTP XML templates:**
|
|
184
|
+
|
|
185
|
+
SFTP credentials (username/password) are stored securely in Versori connection vault, not in activation variables.
|
|
186
|
+
|
|
187
|
+
**Benefits:**
|
|
188
|
+
- ✅ Credentials stored securely in Versori vault
|
|
189
|
+
- ✅ Centralized management - update in one place
|
|
190
|
+
- ✅ Access control enforced by platform
|
|
191
|
+
- ✅ No credentials in activation variables
|
|
192
|
+
- ✅ Explicit error handling with validation
|
|
193
|
+
|
|
194
|
+
**Setup Steps:**
|
|
195
|
+
|
|
196
|
+
1. In Versori Dashboard → Connections → Add Connection
|
|
197
|
+
2. Name: `sftp_export_server`
|
|
198
|
+
3. Type: Basic Auth
|
|
199
|
+
4. Enter SFTP username and password
|
|
200
|
+
5. Save connection
|
|
201
|
+
6. Code automatically retrieves credentials using `ctx.credentials().getAccessToken('sftp_export_server')`
|
|
202
|
+
|
|
203
|
+
**Activation Variables (for SFTP):**
|
|
204
|
+
- `sftpHost` - SFTP server hostname
|
|
205
|
+
- `sftpPort` - SFTP server port (default: 22)
|
|
206
|
+
- `sftpRemotePath` - Remote directory path for uploads
|
|
207
|
+
|
|
208
|
+
**Connection (for SFTP):**
|
|
209
|
+
- `sftp_export_server` - Basic Auth connection containing username/password
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Security Best Practices
|
|
214
|
+
|
|
215
|
+
**Webhook Signature Validation:**
|
|
216
|
+
- ✅ Always validate `fluent-signature` or `flex.signature` headers
|
|
217
|
+
- ✅ Use `strictValidation: true` in WebhookValidationService
|
|
218
|
+
- ✅ Store public keys in activation variables (not hardcoded)
|
|
219
|
+
- ✅ Use environment-specific keys (dev/staging/prod)
|
|
220
|
+
|
|
221
|
+
**Credential Management:**
|
|
222
|
+
- ✅ Store SFTP credentials in Versori connection vault (not activation variables)
|
|
223
|
+
- ✅ Use `sftp_export_server` connection with Basic Auth
|
|
224
|
+
- ✅ Rotate credentials quarterly
|
|
225
|
+
- ✅ Use least-privilege accounts
|
|
226
|
+
- ❌ Never store passwords in activation variables
|
|
227
|
+
- ❌ Never log passwords or full signatures
|
|
228
|
+
|
|
229
|
+
---
|
|
230
|
+
|
|
231
|
+
## Development Workflow
|
|
232
|
+
|
|
233
|
+
### 1. Choose Template
|
|
234
|
+
|
|
235
|
+
Select the template that matches your entity type and use case:
|
|
236
|
+
- **FULFILMENT + SFTP** → Use fulfilment export template
|
|
237
|
+
- **ORDER + Attributes** → Use order update template
|
|
238
|
+
|
|
239
|
+
### 2. Configure Versori
|
|
240
|
+
|
|
241
|
+
1. Create new project in Versori workspace
|
|
242
|
+
2. Configure Fluent Commerce connection (OAuth2)
|
|
243
|
+
3. Set activation variables (public key + SFTP if needed)
|
|
244
|
+
|
|
245
|
+
### 3. Deploy Template
|
|
246
|
+
|
|
247
|
+
1. Copy template code to your project
|
|
248
|
+
2. Customize business logic in services/
|
|
249
|
+
3. Test with Versori dev environment
|
|
250
|
+
4. Deploy to production
|
|
251
|
+
|
|
252
|
+
### 4. Configure Rubix Workflow
|
|
253
|
+
|
|
254
|
+
1. Create/edit Rubix workflow in Fluent Commerce
|
|
255
|
+
2. Add SendWebhook action
|
|
256
|
+
3. Set URL to your Versori endpoint
|
|
257
|
+
4. Build Event payload with required fields
|
|
258
|
+
5. Test webhook triggers from Rubix
|
|
259
|
+
|
|
260
|
+
---
|
|
261
|
+
|
|
262
|
+
## Testing
|
|
263
|
+
|
|
264
|
+
### Test Webhook Signature Validation
|
|
265
|
+
|
|
266
|
+
```bash
|
|
267
|
+
# Test with invalid signature (should fail)
|
|
268
|
+
curl -X POST https://workspace.versori.run/rubix-fulfilment \
|
|
269
|
+
-H "Content-Type: application/json" \
|
|
270
|
+
-H "fluent-signature: invalid" \
|
|
271
|
+
-d '{"entityType":"FULFILMENT","entityRef":"FF-001","retailerId":"1"}'
|
|
272
|
+
|
|
273
|
+
# Expected: { success: false, error: "Invalid webhook signature" }
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
### Test with Valid Payload
|
|
277
|
+
|
|
278
|
+
```bash
|
|
279
|
+
# Test with valid payload (signature validation only in real scenario)
|
|
280
|
+
curl -X POST https://workspace.versori.run/rubix-fulfilment \
|
|
281
|
+
-H "Content-Type: application/json" \
|
|
282
|
+
-d '{
|
|
283
|
+
"entityType": "FULFILMENT",
|
|
284
|
+
"entityRef": "FF-001",
|
|
285
|
+
"retailerId": "1",
|
|
286
|
+
"id": "evt-123"
|
|
287
|
+
}'
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
---
|
|
291
|
+
|
|
292
|
+
## Troubleshooting
|
|
293
|
+
|
|
294
|
+
### Common Issues
|
|
295
|
+
|
|
296
|
+
**Issue: "Invalid webhook signature"**
|
|
297
|
+
- **Cause**: Wrong public key or payload modified
|
|
298
|
+
- **Solution**: Verify `fluentPublicKey` matches Fluent environment (dev/staging/prod)
|
|
299
|
+
|
|
300
|
+
**Issue: "Missing retailerId in payload"**
|
|
301
|
+
- **Cause**: Rubix Event payload incomplete
|
|
302
|
+
- **Solution**: Add `retailerId` field in Rubix Event payload builder
|
|
303
|
+
|
|
304
|
+
**Issue: "SFTP upload failed" (Fulfilment template)**
|
|
305
|
+
- **Cause**: Invalid SFTP credentials or connectivity
|
|
306
|
+
- **Solution**: Test SFTP manually, verify host/port/credentials
|
|
307
|
+
|
|
308
|
+
**Issue: "GraphQL mutation failed" (Order template)**
|
|
309
|
+
- **Cause**: Invalid permissions or syntax
|
|
310
|
+
- **Solution**: Verify user has UPDATE_ORDER permission, check mutation syntax
|
|
311
|
+
|
|
312
|
+
---
|
|
313
|
+
|
|
314
|
+
## Mapping Pattern Comparison
|
|
315
|
+
|
|
316
|
+
### Overview
|
|
317
|
+
|
|
318
|
+
The Fulfilment → SFTP XML template offers **two mapping patterns** for transforming GraphQL data to XML:
|
|
319
|
+
|
|
320
|
+
1. **[Inline Mapping Pattern](./template-webhook-rubix-fulfilment-to-sftp-xml-inline.md)** 🔵 - Manual object construction
|
|
321
|
+
2. **[UniversalMapper Pattern](./template-webhook-rubix-fulfilment-to-sftp-xml-universal-mapper.md)** 🟢 - External JSON mapping + custom resolvers
|
|
322
|
+
|
|
323
|
+
### Quick Comparison
|
|
324
|
+
|
|
325
|
+
| Aspect | Inline Pattern 🔵 | UniversalMapper Pattern 🟢 |
|
|
326
|
+
|--------|-------------------|---------------------------|
|
|
327
|
+
| **Complexity** | Simpler | More complex |
|
|
328
|
+
| **Config Files** | None | External JSON config |
|
|
329
|
+
| **Resolvers** | None | SDK + custom resolvers |
|
|
330
|
+
| **Best For** | Simple webhooks, tightly-coupled schemas | Reusable configs, multi-environment |
|
|
331
|
+
| **Code Location** | All in one file | Separated (config/, resolvers/, services/) |
|
|
332
|
+
| **Field Updates** | Require code changes | Change JSON config only |
|
|
333
|
+
| **Testing** | Inline test logic | Config + resolvers separately testable |
|
|
334
|
+
| **Reusability** | Limited | High |
|
|
335
|
+
| **Debugging** | Faster (all visible) | Slower (multiple files) |
|
|
336
|
+
|
|
337
|
+
### Pattern 1: Inline Mapping 🔵
|
|
338
|
+
|
|
339
|
+
**File:** [`template-webhook-rubix-fulfilment-to-sftp-xml-inline.md`](./template-webhook-rubix-fulfilment-to-sftp-xml-inline.md)
|
|
340
|
+
|
|
341
|
+
**When to Use:**
|
|
342
|
+
- ✅ Simple webhook handlers
|
|
343
|
+
- ✅ Tightly-coupled 3PL XML schemas
|
|
344
|
+
- ✅ Fast debugging needs
|
|
345
|
+
- ✅ Single-purpose transformations
|
|
346
|
+
- ✅ Small teams / rapid prototyping
|
|
347
|
+
|
|
348
|
+
**Code Example:**
|
|
349
|
+
```typescript
|
|
350
|
+
// src/services/xml-export.service.ts
|
|
351
|
+
// NO external config, NO resolvers, NO mapping files
|
|
352
|
+
const xmlData = {
|
|
353
|
+
Fulfilment: {
|
|
354
|
+
'@ref': fulfilmentData.ref,
|
|
355
|
+
'@status': fulfilmentData.status,
|
|
356
|
+
OrderRef: fulfilmentData.order?.ref || '',
|
|
357
|
+
Customer: fulfilmentData.order?.customer ? {
|
|
358
|
+
FirstName: fulfilmentData.order.customer.firstName || '',
|
|
359
|
+
LastName: fulfilmentData.order.customer.lastName || '',
|
|
360
|
+
} : {},
|
|
361
|
+
Items: {
|
|
362
|
+
Item: fulfilmentData.items?.edges?.map(edge => ({
|
|
363
|
+
'@ref': edge.node.ref,
|
|
364
|
+
ProductRef: edge.node.orderItem?.productRef || '',
|
|
365
|
+
Quantity: edge.node.quantity,
|
|
366
|
+
})) || [],
|
|
367
|
+
},
|
|
368
|
+
},
|
|
369
|
+
};
|
|
370
|
+
|
|
371
|
+
const xmlString = xmlBuilder.build(xmlData, 'FulfilmentExport');
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
**Project Structure:**
|
|
375
|
+
```
|
|
376
|
+
rubix-fulfilment-export/
|
|
377
|
+
├── package.json
|
|
378
|
+
├── index.ts
|
|
379
|
+
└── src/
|
|
380
|
+
├── workflows/webhook/
|
|
381
|
+
├── services/ # Inline mapping in xml-export.service.ts
|
|
382
|
+
└── types/
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
**Pros:**
|
|
386
|
+
- ✅ Simpler to understand - all logic in one place
|
|
387
|
+
- ✅ Faster debugging - no jumping between files
|
|
388
|
+
- ✅ Fewer files to maintain
|
|
389
|
+
- ✅ No external dependencies on mapping config
|
|
390
|
+
|
|
391
|
+
**Cons:**
|
|
392
|
+
- ❌ Field changes require code modifications
|
|
393
|
+
- ❌ Harder to reuse across projects
|
|
394
|
+
- ❌ No SDK resolver benefits
|
|
395
|
+
- ❌ Less testable (logic embedded in service)
|
|
396
|
+
|
|
397
|
+
---
|
|
398
|
+
|
|
399
|
+
### Pattern 2: UniversalMapper 🟢
|
|
400
|
+
|
|
401
|
+
**File:** [`template-webhook-rubix-fulfilment-to-sftp-xml-universal-mapper.md`](./template-webhook-rubix-fulfilment-to-sftp-xml-universal-mapper.md)
|
|
402
|
+
|
|
403
|
+
**When to Use:**
|
|
404
|
+
- ✅ Reusable configs across projects
|
|
405
|
+
- ✅ Multi-environment deployments (dev/staging/prod)
|
|
406
|
+
- ✅ Complex transformation logic
|
|
407
|
+
- ✅ SDK resolver benefits (parseInt, formatDate, uppercase, etc.)
|
|
408
|
+
- ✅ Frequent field mapping changes
|
|
409
|
+
- ✅ Large teams / production systems
|
|
410
|
+
|
|
411
|
+
**Code Example:**
|
|
412
|
+
```typescript
|
|
413
|
+
// config/fulfilment-xml-mapping.json
|
|
414
|
+
{
|
|
415
|
+
"fields": {
|
|
416
|
+
"@ref": { "source": "ref", "required": true },
|
|
417
|
+
"@status": { "source": "status", "resolver": "sdk.uppercase" },
|
|
418
|
+
"OrderRef": { "source": "order.ref", "default": "" },
|
|
419
|
+
"Customer": {
|
|
420
|
+
"type": "object",
|
|
421
|
+
"fields": {
|
|
422
|
+
"FirstName": { "source": "order.customer.firstName", "default": "" }
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
// src/services/xml-export.service.ts
|
|
429
|
+
import { UniversalMapper } from '@fluentcommerce/fc-connect-sdk';
|
|
430
|
+
import mappingConfig from '../config/fulfilment-xml-mapping.json' with { type: 'json' };
|
|
431
|
+
import { customResolvers } from '../resolvers/fulfilment-resolvers';
|
|
432
|
+
|
|
433
|
+
const mapper = new UniversalMapper(mappingConfig, { customResolvers });
|
|
434
|
+
const mappingResult = await mapper.map(fulfilmentData);
|
|
435
|
+
const xmlString = xmlBuilder.build(mappingResult.data, 'FulfilmentExport');
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
**Project Structure:**
|
|
439
|
+
```
|
|
440
|
+
rubix-fulfilment-export/
|
|
441
|
+
├── package.json
|
|
442
|
+
├── index.ts
|
|
443
|
+
├── config/
|
|
444
|
+
│ └── fulfilment-xml-mapping.json # ✨ External mapping config
|
|
445
|
+
└── src/
|
|
446
|
+
├── workflows/webhook/
|
|
447
|
+
├── services/ # Uses UniversalMapper
|
|
448
|
+
├── resolvers/ # ✨ Custom transformations
|
|
449
|
+
│ └── fulfilment-resolvers.ts
|
|
450
|
+
└── types/
|
|
451
|
+
```
|
|
452
|
+
|
|
453
|
+
**Pros:**
|
|
454
|
+
- ✅ Reusable mapping configuration across projects
|
|
455
|
+
- ✅ Environment-specific configs (dev/staging/prod)
|
|
456
|
+
- ✅ SDK resolvers built-in (parseInt, formatDate, uppercase, etc.)
|
|
457
|
+
- ✅ Custom resolvers for complex logic
|
|
458
|
+
- ✅ Field changes don't require code changes
|
|
459
|
+
- ✅ Mapping config is unit testable
|
|
460
|
+
|
|
461
|
+
**Cons:**
|
|
462
|
+
- ❌ More complex to set up
|
|
463
|
+
- ❌ More files to maintain (config/, resolvers/)
|
|
464
|
+
- ❌ Slower debugging (jumping between files)
|
|
465
|
+
- ❌ Overhead for simple transformations
|
|
466
|
+
|
|
467
|
+
---
|
|
468
|
+
|
|
469
|
+
### Decision Tree
|
|
470
|
+
|
|
471
|
+
```
|
|
472
|
+
Need to transform GraphQL data to XML for 3PL webhook?
|
|
473
|
+
│
|
|
474
|
+
├─ Is this a simple, one-off webhook?
|
|
475
|
+
│ └─ YES → Use Inline Pattern 🔵
|
|
476
|
+
│
|
|
477
|
+
├─ Will the mapping config be reused across projects?
|
|
478
|
+
│ └─ YES → Use UniversalMapper Pattern 🟢
|
|
479
|
+
│
|
|
480
|
+
├─ Do you need environment-specific configs (dev/staging/prod)?
|
|
481
|
+
│ └─ YES → Use UniversalMapper Pattern 🟢
|
|
482
|
+
│
|
|
483
|
+
├─ Will field mappings change frequently?
|
|
484
|
+
│ └─ YES → Use UniversalMapper Pattern 🟢
|
|
485
|
+
│
|
|
486
|
+
├─ Do you need SDK resolvers (parseInt, formatDate, etc.)?
|
|
487
|
+
│ └─ YES → Use UniversalMapper Pattern 🟢
|
|
488
|
+
│
|
|
489
|
+
└─ DEFAULT: For production systems → Use UniversalMapper Pattern 🟢
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
---
|
|
493
|
+
|
|
494
|
+
## Related Documentation
|
|
495
|
+
|
|
496
|
+
- [Webhook Validation Guide](../../../../02-CORE-GUIDES/webhook-validation/) - Signature validation details
|
|
497
|
+
- [Versori Platform Guide](../../../../04-REFERENCE/platforms/versori/) - Platform documentation
|
|
498
|
+
- [GraphQL Operations Guide](../../../../02-CORE-GUIDES/graphql/) - Query and mutation patterns
|
|
499
|
+
- [SFTP Data Sources Guide](../../../../02-CORE-GUIDES/data-sources/) - SFTP configuration
|
|
500
|
+
- [Payment Gateway Integration](../../../webhooks/template-webhook-payment-gateway-integration.md) - Similar webhook pattern
|
|
501
|
+
|
|
502
|
+
---
|
|
503
|
+
|
|
504
|
+
## Version History
|
|
505
|
+
|
|
506
|
+
### v2.0.0 (2025-01-25)
|
|
507
|
+
- ✅ Split generic template into two entity-specific templates
|
|
508
|
+
- ✅ Fulfilment template: GraphQL queries + XML generation + SFTP upload
|
|
509
|
+
- ✅ Order template: GraphQL mutations + attribute updates
|
|
510
|
+
- ✅ Applied critical fixes: retailerId validation, SFTP options parameter
|
|
511
|
+
- ✅ Added SDK error type handling (GraphQLError, AuthenticationError, DataSourceError)
|
|
512
|
+
- ✅ Improved type safety (replaced `any` with proper SDK types)
|
|
513
|
+
- ✅ Comprehensive testing, troubleshooting, and monitoring sections
|
|
514
|
+
|
|
515
|
+
### v1.0.0 (2025-01-XX)
|
|
516
|
+
- Initial generic Rubix webhook template (deprecated - use v2.0.0 specific templates)
|
|
517
|
+
|
|
518
|
+
---
|
|
519
|
+
|
|
520
|
+
**Next Steps**: Choose the template that matches your use case, copy the code, configure activation variables, and deploy to Versori!
|