@fluentcommerce/fc-connect-sdk 0.1.53 → 0.1.55
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +30 -2
- package/README.md +39 -0
- package/dist/cjs/auth/index.d.ts +3 -0
- package/dist/cjs/auth/index.js +13 -0
- package/dist/cjs/auth/profile-loader.d.ts +18 -0
- package/dist/cjs/auth/profile-loader.js +208 -0
- package/dist/cjs/client-factory.d.ts +4 -0
- package/dist/cjs/client-factory.js +10 -0
- package/dist/cjs/clients/fluent-client.js +13 -6
- package/dist/cjs/index.d.ts +3 -1
- package/dist/cjs/index.js +8 -2
- package/dist/cjs/utils/pagination-helpers.js +38 -2
- package/dist/cjs/versori/fluent-versori-client.js +11 -5
- package/dist/esm/auth/index.d.ts +3 -0
- package/dist/esm/auth/index.js +2 -0
- package/dist/esm/auth/profile-loader.d.ts +18 -0
- package/dist/esm/auth/profile-loader.js +169 -0
- package/dist/esm/client-factory.d.ts +4 -0
- package/dist/esm/client-factory.js +9 -0
- package/dist/esm/clients/fluent-client.js +13 -6
- package/dist/esm/index.d.ts +3 -1
- package/dist/esm/index.js +2 -1
- 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/dist/types/auth/index.d.ts +3 -0
- package/dist/types/auth/profile-loader.d.ts +18 -0
- package/dist/types/client-factory.d.ts +4 -0
- package/dist/types/index.d.ts +3 -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 -482
- 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
|
@@ -1,690 +1,690 @@
|
|
|
1
|
-
# Data Flow Architecture
|
|
2
|
-
|
|
3
|
-
This document explains the three primary data flow patterns in the FC Connect SDK: Ingestion, Extraction, and Transformation.
|
|
4
|
-
|
|
5
|
-
## Overview
|
|
6
|
-
|
|
7
|
-
The SDK supports three main data flow patterns:
|
|
8
|
-
|
|
9
|
-
```mermaid
|
|
10
|
-
graph TB
|
|
11
|
-
subgraph "1. Ingestion Flow"
|
|
12
|
-
I1[External Files<br/>CSV, Parquet] --> I2[Parse & Map] --> I3[Batch API] --> I4[Fluent Commerce]
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
subgraph "2. Extraction Flow"
|
|
16
|
-
E1[Fluent Commerce] --> E2[GraphQL Query] --> E3[Transform & Map] --> E4[External Storage<br/>S3, SFTP]
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
subgraph "3. Transformation Flow"
|
|
20
|
-
T1[External Data<br/>XML, JSON] --> T2[Parse & Map] --> T3[GraphQL Mutation] --> T4[Fluent Commerce]
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
style I1 fill:#ffebee
|
|
24
|
-
style I2 fill:#fff3e0
|
|
25
|
-
style I3 fill:#e3f2fd
|
|
26
|
-
style I4 fill:#e8f5e9
|
|
27
|
-
style E1 fill:#e8f5e9
|
|
28
|
-
style E2 fill:#e3f2fd
|
|
29
|
-
style E3 fill:#f3e5f5
|
|
30
|
-
style E4 fill:#ffebee
|
|
31
|
-
style T1 fill:#ffebee
|
|
32
|
-
style T2 fill:#fff3e0
|
|
33
|
-
style T3 fill:#e3f2fd
|
|
34
|
-
style T4 fill:#e8f5e9
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
## 1. Ingestion Flow
|
|
38
|
-
|
|
39
|
-
Ingestion processes external files (CSV, Parquet) and sends data to Fluent Commerce via the Batch API.
|
|
40
|
-
|
|
41
|
-
### High-Level Flow
|
|
42
|
-
|
|
43
|
-
```mermaid
|
|
44
|
-
flowchart TD
|
|
45
|
-
START[Start Ingestion] --> DISCOVER[Discover Files<br/>S3/SFTP]
|
|
46
|
-
DISCOVER --> CHECK{File Already<br/>Processed?}
|
|
47
|
-
|
|
48
|
-
CHECK -->|Yes| SKIP[Skip File]
|
|
49
|
-
CHECK -->|No| DOWNLOAD[Download File]
|
|
50
|
-
|
|
51
|
-
DOWNLOAD --> PARSE[Parse File<br/>CSV/Parquet Parser]
|
|
52
|
-
PARSE --> MAP[Map Fields<br/>Universal Mapper]
|
|
53
|
-
MAP --> BATCH[Create Batches<br/>Group rows]
|
|
54
|
-
BATCH --> JOB{Job Exists?}
|
|
55
|
-
|
|
56
|
-
JOB -->|No| CREATE_JOB[Create New Job]
|
|
57
|
-
JOB -->|Yes| USE_JOB[Use Existing Job]
|
|
58
|
-
|
|
59
|
-
CREATE_JOB --> SEND
|
|
60
|
-
USE_JOB --> SEND[Send Batches<br/>to Fluent API]
|
|
61
|
-
|
|
62
|
-
SEND --> VERIFY{All Batches<br/>Successful?}
|
|
63
|
-
|
|
64
|
-
VERIFY -->|Yes| ARCHIVE[Archive File]
|
|
65
|
-
VERIFY -->|No| ERROR[Handle Errors]
|
|
66
|
-
|
|
67
|
-
ARCHIVE --> STATE[Update State<br/>Mark Processed]
|
|
68
|
-
STATE --> NEXT{More Files?}
|
|
69
|
-
|
|
70
|
-
NEXT -->|Yes| DISCOVER
|
|
71
|
-
NEXT -->|No| END[Complete]
|
|
72
|
-
|
|
73
|
-
ERROR --> NEXT
|
|
74
|
-
|
|
75
|
-
style START fill:#e3f2fd
|
|
76
|
-
style PARSE fill:#fff3e0
|
|
77
|
-
style MAP fill:#f3e5f5
|
|
78
|
-
style SEND fill:#e8f5e9
|
|
79
|
-
style END fill:#e3f2fd
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
### Detailed Ingestion Components
|
|
83
|
-
|
|
84
|
-
```mermaid
|
|
85
|
-
sequenceDiagram
|
|
86
|
-
participant DS as Data Source<br/>(S3/SFTP)
|
|
87
|
-
participant Parser
|
|
88
|
-
participant Mapper
|
|
89
|
-
participant State
|
|
90
|
-
participant BatchAPI
|
|
91
|
-
participant Fluent
|
|
92
|
-
|
|
93
|
-
DS->>Parser: Stream file data
|
|
94
|
-
Parser->>Parser: Validate format
|
|
95
|
-
Parser-->>Mapper: Row by row
|
|
96
|
-
|
|
97
|
-
loop For Each Row
|
|
98
|
-
Mapper->>Mapper: Apply field mappings
|
|
99
|
-
Mapper->>Mapper: Run resolvers
|
|
100
|
-
Mapper-->>BatchAPI: Mapped entity
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
BatchAPI->>State: Check job status
|
|
104
|
-
State-->>BatchAPI: Job ID or create new
|
|
105
|
-
|
|
106
|
-
BatchAPI->>Fluent: Create job (if needed)
|
|
107
|
-
Fluent-->>BatchAPI: Job ID
|
|
108
|
-
|
|
109
|
-
loop For Each Batch
|
|
110
|
-
BatchAPI->>Fluent: Send batch
|
|
111
|
-
Fluent-->>BatchAPI: Batch ID
|
|
112
|
-
end
|
|
113
|
-
|
|
114
|
-
BatchAPI->>State: Mark file processed
|
|
115
|
-
BatchAPI->>DS: Archive file
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
### Job Strategies
|
|
119
|
-
|
|
120
|
-
The SDK supports three job creation strategies:
|
|
121
|
-
|
|
122
|
-
```mermaid
|
|
123
|
-
graph TB
|
|
124
|
-
subgraph "DAILY Strategy"
|
|
125
|
-
D1[Create Job Once] --> D2[Reuse All Day]
|
|
126
|
-
D2 --> D3[Send All Batches<br/>to Same Job]
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
subgraph "SINGLE Strategy"
|
|
130
|
-
S1[Create One Job] --> S2[Send All Batches]
|
|
131
|
-
S2 --> S3[Complete]
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
subgraph "PER_FILE Strategy"
|
|
135
|
-
P1[Process File] --> P2[Create New Job]
|
|
136
|
-
P2 --> P3[Send All Batches]
|
|
137
|
-
P3 --> P4[Next File]
|
|
138
|
-
P4 --> P1
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
style D1 fill:#e8f5e9
|
|
142
|
-
style D2 fill:#e8f5e9
|
|
143
|
-
style D3 fill:#e8f5e9
|
|
144
|
-
style S1 fill:#fff3e0
|
|
145
|
-
style S2 fill:#fff3e0
|
|
146
|
-
style S3 fill:#fff3e0
|
|
147
|
-
style P1 fill:#f3e5f5
|
|
148
|
-
style P2 fill:#f3e5f5
|
|
149
|
-
style P3 fill:#f3e5f5
|
|
150
|
-
style P4 fill:#f3e5f5
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
**When to Use Each:**
|
|
154
|
-
|
|
155
|
-
- **DAILY**: High-volume, continuous ingestion (recommended) - Reuses same job for all files processed in a day
|
|
156
|
-
- **SINGLE**: One-time ingestion - Creates one job for entire workflow run
|
|
157
|
-
- **PER_FILE**: Low volume, need file-level tracking - Creates new job per file
|
|
158
|
-
|
|
159
|
-
### File Archival
|
|
160
|
-
|
|
161
|
-
```mermaid
|
|
162
|
-
flowchart LR
|
|
163
|
-
SOURCE[Source Bucket] --> PROCESS{Processing<br/>Success?}
|
|
164
|
-
|
|
165
|
-
PROCESS -->|Success| STRATEGY{Archival<br/>Strategy}
|
|
166
|
-
PROCESS -->|Failure| ERROR[Error Bucket]
|
|
167
|
-
|
|
168
|
-
STRATEGY -->|Move| MOVE[Copy to Archive<br/>Delete from Source]
|
|
169
|
-
STRATEGY -->|Copy| COPY[Copy to Archive<br/>Keep Source]
|
|
170
|
-
STRATEGY -->|Copy-Delete| CD[Copy to Archive<br/>Explicit Delete]
|
|
171
|
-
|
|
172
|
-
MOVE --> ARCHIVE[Archive Bucket]
|
|
173
|
-
COPY --> ARCHIVE
|
|
174
|
-
CD --> ARCHIVE
|
|
175
|
-
|
|
176
|
-
style SOURCE fill:#e3f2fd
|
|
177
|
-
style ARCHIVE fill:#e8f5e9
|
|
178
|
-
style ERROR fill:#ffebee
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
## 2. Extraction Flow
|
|
182
|
-
|
|
183
|
-
Extraction queries data from Fluent Commerce and saves it to external storage.
|
|
184
|
-
|
|
185
|
-
> **Note:** This section shows the optional ExtractionOrchestrator. For the recommended
|
|
186
|
-
> building-block approach, see [Building-Block Extraction Pattern](#building-block-extraction) below.
|
|
187
|
-
|
|
188
|
-
### High-Level Flow
|
|
189
|
-
|
|
190
|
-
```mermaid
|
|
191
|
-
flowchart TD
|
|
192
|
-
START[Start Extraction] --> QUERY[Execute GraphQL Query]
|
|
193
|
-
QUERY --> PAGE{More Pages?}
|
|
194
|
-
|
|
195
|
-
PAGE -->|Yes| FETCH[Fetch Next Page<br/>Cursor-based]
|
|
196
|
-
PAGE -->|No| TRANSFORM[Transform Data]
|
|
197
|
-
|
|
198
|
-
FETCH --> ACCUMULATE[Accumulate Results]
|
|
199
|
-
ACCUMULATE --> PAGE
|
|
200
|
-
|
|
201
|
-
TRANSFORM --> MAP[Apply Field Mappings]
|
|
202
|
-
MAP --> FORMAT{Output Format?}
|
|
203
|
-
|
|
204
|
-
FORMAT -->|JSON| JSON[Convert to JSON]
|
|
205
|
-
FORMAT -->|Parquet| PARQUET[Convert to Parquet]
|
|
206
|
-
FORMAT -->|CSV| CSV[Convert to CSV]
|
|
207
|
-
|
|
208
|
-
JSON --> UPLOAD[Upload to S3/SFTP]
|
|
209
|
-
PARQUET --> UPLOAD
|
|
210
|
-
CSV --> UPLOAD
|
|
211
|
-
|
|
212
|
-
UPLOAD --> STATE[Update State]
|
|
213
|
-
STATE --> END[Complete]
|
|
214
|
-
|
|
215
|
-
style START fill:#e3f2fd
|
|
216
|
-
style QUERY fill:#fff3e0
|
|
217
|
-
style MAP fill:#f3e5f5
|
|
218
|
-
style UPLOAD fill:#e8f5e9
|
|
219
|
-
style END fill:#e3f2fd
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
### Detailed Extraction Components
|
|
223
|
-
|
|
224
|
-
```mermaid
|
|
225
|
-
sequenceDiagram
|
|
226
|
-
participant Client
|
|
227
|
-
participant Fluent
|
|
228
|
-
participant Mapper
|
|
229
|
-
participant Storage
|
|
230
|
-
|
|
231
|
-
Client->>Fluent: Execute GraphQL query (page 1)
|
|
232
|
-
Fluent-->>Client: Results + cursor
|
|
233
|
-
|
|
234
|
-
loop Pagination
|
|
235
|
-
Client->>Fluent: Fetch next page
|
|
236
|
-
Fluent-->>Client: Results + cursor
|
|
237
|
-
end
|
|
238
|
-
|
|
239
|
-
Client->>Mapper: Apply extraction mappings
|
|
240
|
-
Mapper->>Mapper: Transform fields
|
|
241
|
-
Mapper-->>Client: Mapped data
|
|
242
|
-
|
|
243
|
-
Client->>Storage: Upload results
|
|
244
|
-
Storage-->>Client: Upload confirmation
|
|
245
|
-
Client-->>Client: Extraction complete
|
|
246
|
-
```
|
|
247
|
-
|
|
248
|
-
### Pagination Strategy
|
|
249
|
-
|
|
250
|
-
The SDK uses cursor-based pagination following Relay specification:
|
|
251
|
-
|
|
252
|
-
⚠️ **SDK AUTO-PAGINATION BEHAVIOR:**
|
|
253
|
-
|
|
254
|
-
The SDK's auto-pagination feature automatically handles cursor extraction from edges.
|
|
255
|
-
**Users should rely on `client.graphql()` with auto-pagination enabled** instead of implementing manual pagination.
|
|
256
|
-
|
|
257
|
-
#### Recommended Approach (Let SDK Handle It)
|
|
258
|
-
|
|
259
|
-
```typescript
|
|
260
|
-
// ✅ CORRECT - Let SDK handle pagination automatically
|
|
261
|
-
const result = await client.graphql({
|
|
262
|
-
query: VIRTUAL_POSITIONS_QUERY,
|
|
263
|
-
variables: { first: 100 },
|
|
264
|
-
// Auto-pagination enabled by default for queries with pagination variables
|
|
265
|
-
});
|
|
266
|
-
|
|
267
|
-
// SDK internally extracts cursors from edges - you don't need to do this manually
|
|
268
|
-
```
|
|
269
|
-
|
|
270
|
-
#### Manual Cursor Extraction (Advanced - Not Recommended)
|
|
271
|
-
|
|
272
|
-
If you need manual control (rare), the SDK extracts cursors like this internally:
|
|
273
|
-
|
|
274
|
-
```typescript
|
|
275
|
-
// ❌ WRONG - Don't implement this yourself, SDK does it for you
|
|
276
|
-
const cursor = edges[edges.length - 1]?.cursor;
|
|
277
|
-
|
|
278
|
-
// ✅ CORRECT - Use SDK's auto-pagination instead
|
|
279
|
-
const result = await client.graphql({
|
|
280
|
-
query: '...',
|
|
281
|
-
variables: { first: 100 }
|
|
282
|
-
// SDK handles cursor extraction automatically
|
|
283
|
-
});
|
|
284
|
-
```
|
|
285
|
-
|
|
286
|
-
**Why This Matters:** Fluent Commerce returns cursors in edges, not pageInfo.endCursor.
|
|
287
|
-
The SDK's auto-pagination handles this automatically. Manual implementation is error-prone and unnecessary.
|
|
288
|
-
|
|
289
|
-
**See:** [Auto-Pagination Guide](../../02-CORE-GUIDES/auto-pagination/) for complete documentation.
|
|
290
|
-
|
|
291
|
-
```mermaid
|
|
292
|
-
flowchart LR
|
|
293
|
-
Q1[Query Page 1<br/>first: 100] --> R1[Results + edges array]
|
|
294
|
-
R1 --> EXTRACT1[Extract: edges-last-.cursor]
|
|
295
|
-
EXTRACT1 --> Q2[Query Page 2<br/>after: lastEdge.cursor]
|
|
296
|
-
Q2 --> R2[Results + edges array]
|
|
297
|
-
R2 --> EXTRACT2[Extract: edges-last-.cursor]
|
|
298
|
-
EXTRACT2 --> Q3[Query Page 3<br/>after: lastEdge.cursor]
|
|
299
|
-
Q3 --> R3[Results + hasNextPage: false]
|
|
300
|
-
R3 --> DONE[All Data Fetched]
|
|
301
|
-
|
|
302
|
-
style Q1 fill:#e3f2fd
|
|
303
|
-
style Q2 fill:#e3f2fd
|
|
304
|
-
style Q3 fill:#e3f2fd
|
|
305
|
-
style EXTRACT1 fill:#fff3e0
|
|
306
|
-
style EXTRACT2 fill:#fff3e0
|
|
307
|
-
style DONE fill:#e8f5e9
|
|
308
|
-
```
|
|
309
|
-
|
|
310
|
-
**Pagination Features:**
|
|
311
|
-
|
|
312
|
-
- Automatic cursor management (extracts from edge cursors)
|
|
313
|
-
- Handles Fluent-specific cursor extraction
|
|
314
|
-
- Configurable page size
|
|
315
|
-
- Rate limiting between pages
|
|
316
|
-
- Memory-efficient streaming
|
|
317
|
-
|
|
318
|
-
**Correct Pagination Implementation:**
|
|
319
|
-
|
|
320
|
-
```typescript
|
|
321
|
-
let hasNextPage = true;
|
|
322
|
-
let cursor: string | undefined = undefined;
|
|
323
|
-
|
|
324
|
-
while (hasNextPage) {
|
|
325
|
-
const result = await client.graphql({
|
|
326
|
-
query: `
|
|
327
|
-
query GetData($first: Int, $after: String) {
|
|
328
|
-
virtualPositions(first: $first, after: $after) {
|
|
329
|
-
edges {
|
|
330
|
-
node { id ref quantity }
|
|
331
|
-
cursor # ✅ Must include cursor in query
|
|
332
|
-
}
|
|
333
|
-
pageInfo {
|
|
334
|
-
hasNextPage # ✅ Fluent returns this
|
|
335
|
-
# ❌ NO endCursor field in Fluent API
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
`,
|
|
340
|
-
variables: { first: 100, after: cursor },
|
|
341
|
-
});
|
|
342
|
-
|
|
343
|
-
const edges = result.data.virtualPositions.edges;
|
|
344
|
-
|
|
345
|
-
// Extract cursor from last edge (Fluent-specific)
|
|
346
|
-
cursor = edges.length > 0 ? edges[edges.length - 1].cursor : null;
|
|
347
|
-
hasNextPage = result.data.virtualPositions.pageInfo.hasNextPage;
|
|
348
|
-
|
|
349
|
-
// Process data
|
|
350
|
-
for (const edge of edges) {
|
|
351
|
-
processRecord(edge.node);
|
|
352
|
-
}
|
|
353
|
-
}
|
|
354
|
-
```
|
|
355
|
-
|
|
356
|
-
### Building-Block Extraction (Recommended) {#building-block-extraction}
|
|
357
|
-
|
|
358
|
-
For maximum flexibility, compose SDK services directly instead of using the orchestrator:
|
|
359
|
-
|
|
360
|
-
```typescript
|
|
361
|
-
// ✅ RECOMMENDED - Direct client.graphql() usage with auto-pagination
|
|
362
|
-
const result = await client.graphql({
|
|
363
|
-
query: VIRTUAL_POSITIONS_QUERY,
|
|
364
|
-
variables: { first: 100 },
|
|
365
|
-
// Auto-pagination enabled by default
|
|
366
|
-
});
|
|
367
|
-
|
|
368
|
-
// Extract and transform data
|
|
369
|
-
const items = result.data?.virtualPositions?.edges?.map(e => e.node) || [];
|
|
370
|
-
|
|
371
|
-
// Use UniversalMapper if needed
|
|
372
|
-
const mapper = new UniversalMapper(mappingConfig);
|
|
373
|
-
const transformed = await Promise.all(items.map(item => mapper.map(item)));
|
|
374
|
-
|
|
375
|
-
// Upload to S3/SFTP
|
|
376
|
-
await s3.uploadFile('output.json', JSON.stringify(transformed));
|
|
377
|
-
```
|
|
378
|
-
|
|
379
|
-
**Extraction Flow Diagram (Building Blocks):**
|
|
380
|
-
|
|
381
|
-
```mermaid
|
|
382
|
-
flowchart TD
|
|
383
|
-
START[Start Extraction] --> CLIENT[client.graphql with auto-pagination]
|
|
384
|
-
CLIENT --> EXTRACT[Extract nodes from edges]
|
|
385
|
-
EXTRACT --> TRANSFORM[Transform with UniversalMapper]
|
|
386
|
-
TRANSFORM --> UPLOAD[Upload to S3/SFTP]
|
|
387
|
-
UPLOAD --> END[Complete]
|
|
388
|
-
|
|
389
|
-
style START fill:#e3f2fd
|
|
390
|
-
style CLIENT fill:#fff3e0
|
|
391
|
-
style TRANSFORM fill:#f3e5f5
|
|
392
|
-
style UPLOAD fill:#e8f5e9
|
|
393
|
-
style END fill:#e3f2fd
|
|
394
|
-
```
|
|
395
|
-
|
|
396
|
-
**Recommendation:** Use building blocks for production. Use orchestrator for prototyping.
|
|
397
|
-
|
|
398
|
-
## 3. Transformation Flow
|
|
399
|
-
|
|
400
|
-
Transformation converts external data formats (XML, JSON) to Fluent Commerce GraphQL mutations.
|
|
401
|
-
|
|
402
|
-
### High-Level Flow
|
|
403
|
-
|
|
404
|
-
```mermaid
|
|
405
|
-
flowchart TD
|
|
406
|
-
START[Receive Data<br/>XML/JSON] --> PARSE[Parse Input<br/>XMLParser/JSONParser]
|
|
407
|
-
PARSE --> MAP[Apply Mutation Mapping<br/>GraphQLMutationMapper]
|
|
408
|
-
MAP --> VALIDATE[Validate Mutation]
|
|
409
|
-
|
|
410
|
-
VALIDATE --> EXECUTE[Execute GraphQL Mutation]
|
|
411
|
-
EXECUTE --> CHECK{Mutation<br/>Successful?}
|
|
412
|
-
|
|
413
|
-
CHECK -->|Yes| STATE[Update State]
|
|
414
|
-
CHECK -->|No| ERROR[Handle Error]
|
|
415
|
-
|
|
416
|
-
STATE --> RESPONSE[Return Success]
|
|
417
|
-
ERROR --> RETRY{Retry?}
|
|
418
|
-
|
|
419
|
-
RETRY -->|Yes| EXECUTE
|
|
420
|
-
RETRY -->|No| FAIL[Return Failure]
|
|
421
|
-
|
|
422
|
-
RESPONSE --> END[Complete]
|
|
423
|
-
FAIL --> END
|
|
424
|
-
|
|
425
|
-
style START fill:#e3f2fd
|
|
426
|
-
style PARSE fill:#fff3e0
|
|
427
|
-
style MAP fill:#f3e5f5
|
|
428
|
-
style EXECUTE fill:#e8f5e9
|
|
429
|
-
style END fill:#e3f2fd
|
|
430
|
-
style ERROR fill:#ffebee
|
|
431
|
-
```
|
|
432
|
-
|
|
433
|
-
### SFCC Order Example
|
|
434
|
-
|
|
435
|
-
Real-world example: Converting SFCC XML orders to Fluent Commerce mutations.
|
|
436
|
-
|
|
437
|
-
```mermaid
|
|
438
|
-
sequenceDiagram
|
|
439
|
-
participant SFCC
|
|
440
|
-
participant Webhook
|
|
441
|
-
participant XMLParser
|
|
442
|
-
participant MutationMapper
|
|
443
|
-
participant Fluent
|
|
444
|
-
|
|
445
|
-
SFCC->>Webhook: POST /order (XML payload)
|
|
446
|
-
Webhook->>XMLParser: Parse XML
|
|
447
|
-
|
|
448
|
-
XMLParser->>XMLParser: Extract fields<br/>(order-no, customer, items)
|
|
449
|
-
XMLParser-->>MutationMapper: Parsed data
|
|
450
|
-
|
|
451
|
-
MutationMapper->>MutationMapper: Load mapping config
|
|
452
|
-
MutationMapper->>MutationMapper: Build GraphQL mutation
|
|
453
|
-
MutationMapper->>MutationMapper: Map nested arrays<br/>(line items, addresses)
|
|
454
|
-
|
|
455
|
-
MutationMapper->>Fluent: Execute createOrder mutation
|
|
456
|
-
Fluent-->>MutationMapper: Order created
|
|
457
|
-
|
|
458
|
-
MutationMapper-->>Webhook: Success response
|
|
459
|
-
Webhook-->>SFCC: 200 OK
|
|
460
|
-
```
|
|
461
|
-
|
|
462
|
-
### Mutation Mapping Process
|
|
463
|
-
|
|
464
|
-
```mermaid
|
|
465
|
-
flowchart TB
|
|
466
|
-
XML[XML/JSON Input] --> PARSE[Parse to Object]
|
|
467
|
-
PARSE --> CONFIG[Load Mapping Config]
|
|
468
|
-
|
|
469
|
-
CONFIG --> ROOT[Map Root Fields]
|
|
470
|
-
ROOT --> NESTED{Has Nested<br/>Arrays?}
|
|
471
|
-
|
|
472
|
-
NESTED -->|Yes| ARRAY[Map Array Items]
|
|
473
|
-
NESTED -->|No| BUILD
|
|
474
|
-
|
|
475
|
-
ARRAY --> CONTEXT[Switch Context<br/>to Array Item]
|
|
476
|
-
CONTEXT --> MAP_ITEM[Map Item Fields]
|
|
477
|
-
MAP_ITEM --> NEXT{More Items?}
|
|
478
|
-
|
|
479
|
-
NEXT -->|Yes| ARRAY
|
|
480
|
-
NEXT -->|No| BUILD[Build GraphQL Mutation]
|
|
481
|
-
|
|
482
|
-
BUILD --> VARIABLES[Extract Variables]
|
|
483
|
-
VARIABLES --> MUTATION[Complete Mutation Object]
|
|
484
|
-
MUTATION --> EXECUTE[Execute Against API]
|
|
485
|
-
|
|
486
|
-
style XML fill:#e3f2fd
|
|
487
|
-
style PARSE fill:#fff3e0
|
|
488
|
-
style CONFIG fill:#f3e5f5
|
|
489
|
-
style EXECUTE fill:#e8f5e9
|
|
490
|
-
```
|
|
491
|
-
|
|
492
|
-
## Universal Mapping Engine
|
|
493
|
-
|
|
494
|
-
All three flows use the same Universal Mapper with consistent field resolution:
|
|
495
|
-
|
|
496
|
-
```mermaid
|
|
497
|
-
flowchart TD
|
|
498
|
-
START[Field Config] --> PRIORITY{Resolution<br/>Priority}
|
|
499
|
-
|
|
500
|
-
PRIORITY -->|1| STATIC{Has Static<br/>Value?}
|
|
501
|
-
PRIORITY -->|2| SOURCE{Has Source<br/>Path?}
|
|
502
|
-
PRIORITY -->|3| RESOLVER{Has Resolver?}
|
|
503
|
-
PRIORITY -->|4| DEFAULT{Has Default?}
|
|
504
|
-
|
|
505
|
-
STATIC -->|Yes| RETURN1[Return Static Value]
|
|
506
|
-
STATIC -->|No| SOURCE
|
|
507
|
-
|
|
508
|
-
SOURCE -->|Yes| EXTRACT[Extract from Source Data]
|
|
509
|
-
SOURCE -->|No| RESOLVER
|
|
510
|
-
|
|
511
|
-
EXTRACT --> RESOLVER
|
|
512
|
-
|
|
513
|
-
RESOLVER -->|Yes| TRANSFORM[Apply Resolver<br/>sdk.* or custom.*]
|
|
514
|
-
RESOLVER -->|No| DEFAULT
|
|
515
|
-
|
|
516
|
-
TRANSFORM --> VALIDATE
|
|
517
|
-
|
|
518
|
-
DEFAULT -->|Yes| RETURN2[Return Default]
|
|
519
|
-
DEFAULT -->|No| REQUIRED{Field<br/>Required?}
|
|
520
|
-
|
|
521
|
-
REQUIRED -->|Yes| ERROR[Throw Error]
|
|
522
|
-
REQUIRED -->|No| RETURN3[Return undefined]
|
|
523
|
-
|
|
524
|
-
RETURN1 --> VALIDATE[Validate Result]
|
|
525
|
-
RETURN2 --> VALIDATE
|
|
526
|
-
RETURN3 --> VALIDATE
|
|
527
|
-
|
|
528
|
-
VALIDATE --> END[Return Mapped Value]
|
|
529
|
-
|
|
530
|
-
style START fill:#e3f2fd
|
|
531
|
-
style TRANSFORM fill:#fff3e0
|
|
532
|
-
style VALIDATE fill:#e8f5e9
|
|
533
|
-
style ERROR fill:#ffebee
|
|
534
|
-
style END fill:#e3f2fd
|
|
535
|
-
```
|
|
536
|
-
|
|
537
|
-
## State Management Flow
|
|
538
|
-
|
|
539
|
-
All flows integrate with state management to prevent duplicate processing:
|
|
540
|
-
|
|
541
|
-
```mermaid
|
|
542
|
-
sequenceDiagram
|
|
543
|
-
participant Flow
|
|
544
|
-
participant StateService
|
|
545
|
-
participant KVStore
|
|
546
|
-
|
|
547
|
-
Flow->>StateService: isFileProcessed(kv, fileName, workflowId)
|
|
548
|
-
StateService->>KVStore: Get file key
|
|
549
|
-
KVStore-->>StateService: File status
|
|
550
|
-
|
|
551
|
-
alt File Already Processed
|
|
552
|
-
StateService-->>Flow: true (skip)
|
|
553
|
-
else File Not Processed
|
|
554
|
-
StateService-->>Flow: false (process)
|
|
555
|
-
Flow->>Flow: Process file
|
|
556
|
-
Flow->>StateService: updateSyncState(kv, processedFiles, workflowId)
|
|
557
|
-
StateService->>StateService: Add to processedFiles array
|
|
558
|
-
StateService->>KVStore: Update state
|
|
559
|
-
KVStore-->>StateService: Confirmation
|
|
560
|
-
StateService-->>Flow: Marked
|
|
561
|
-
end
|
|
562
|
-
```
|
|
563
|
-
|
|
564
|
-
**State Object Structure:**
|
|
565
|
-
|
|
566
|
-
```typescript
|
|
567
|
-
{
|
|
568
|
-
processedFiles: [
|
|
569
|
-
{ key: 'file1.csv', timestamp: '2025-01-15T10:00:00Z' },
|
|
570
|
-
{ key: 'file2.csv', timestamp: '2025-01-15T11:00:00Z' }
|
|
571
|
-
],
|
|
572
|
-
dailyJobId: 'job-123',
|
|
573
|
-
currentJobBatchCount: 5,
|
|
574
|
-
lastProcessedTimestamp: '2025-01-15T11:00:00Z'
|
|
575
|
-
}
|
|
576
|
-
```
|
|
577
|
-
|
|
578
|
-
## Error Handling Across Flows
|
|
579
|
-
|
|
580
|
-
```mermaid
|
|
581
|
-
flowchart TD
|
|
582
|
-
ERROR[Error Occurs] --> TYPE{Error Type}
|
|
583
|
-
|
|
584
|
-
TYPE -->|4xx Client Error| CLIENT[Client Error Handler]
|
|
585
|
-
TYPE -->|5xx Server Error| SERVER[Server Error Handler]
|
|
586
|
-
TYPE -->|Network Error| NETWORK[Network Error Handler]
|
|
587
|
-
TYPE -->|Validation Error| VALIDATION[Validation Error Handler]
|
|
588
|
-
|
|
589
|
-
CLIENT --> LOG1[Log Error]
|
|
590
|
-
LOG1 --> FAIL[Fail Fast<br/>No Retry]
|
|
591
|
-
|
|
592
|
-
SERVER --> LOG2[Log Error]
|
|
593
|
-
LOG2 --> RETRY{Retry Count<br/>< Max?}
|
|
594
|
-
|
|
595
|
-
RETRY -->|Yes| BACKOFF[Exponential Backoff<br/>1s, 2s, 4s]
|
|
596
|
-
RETRY -->|No| FAIL
|
|
597
|
-
|
|
598
|
-
BACKOFF --> REATTEMPT[Reattempt Operation]
|
|
599
|
-
REATTEMPT --> SUCCESS{Successful?}
|
|
600
|
-
|
|
601
|
-
SUCCESS -->|Yes| CONTINUE[Continue Processing]
|
|
602
|
-
SUCCESS -->|No| RETRY
|
|
603
|
-
|
|
604
|
-
NETWORK --> LOG3[Log Error]
|
|
605
|
-
LOG3 --> RETRY
|
|
606
|
-
|
|
607
|
-
VALIDATION --> LOG4[Log Error]
|
|
608
|
-
LOG4 --> STRATEGY{Error Strategy}
|
|
609
|
-
|
|
610
|
-
STRATEGY -->|fail-fast| FAIL
|
|
611
|
-
STRATEGY -->|continue-on-error| SKIP[Skip Item<br/>Continue]
|
|
612
|
-
|
|
613
|
-
SKIP --> CONTINUE
|
|
614
|
-
|
|
615
|
-
style ERROR fill:#ffebee
|
|
616
|
-
style FAIL fill:#ff5252
|
|
617
|
-
style CONTINUE fill:#e8f5e9
|
|
618
|
-
style BACKOFF fill:#fff3e0
|
|
619
|
-
```
|
|
620
|
-
|
|
621
|
-
## Performance Optimizations
|
|
622
|
-
|
|
623
|
-
### Streaming Pipeline
|
|
624
|
-
|
|
625
|
-
```mermaid
|
|
626
|
-
flowchart LR
|
|
627
|
-
FILE[Large File<br/>1GB] --> STREAM1[Stream Reader]
|
|
628
|
-
STREAM1 --> CHUNK1[Chunk 1]
|
|
629
|
-
STREAM1 --> CHUNK2[Chunk 2]
|
|
630
|
-
STREAM1 --> CHUNK3[Chunk N]
|
|
631
|
-
|
|
632
|
-
CHUNK1 --> PARSE1[Parse]
|
|
633
|
-
CHUNK2 --> PARSE2[Parse]
|
|
634
|
-
CHUNK3 --> PARSE3[Parse]
|
|
635
|
-
|
|
636
|
-
PARSE1 --> MAP1[Map]
|
|
637
|
-
PARSE2 --> MAP2[Map]
|
|
638
|
-
PARSE3 --> MAP3[Map]
|
|
639
|
-
|
|
640
|
-
MAP1 --> BATCH1[Batch 1]
|
|
641
|
-
MAP2 --> BATCH2[Batch 2]
|
|
642
|
-
MAP3 --> BATCH3[Batch N]
|
|
643
|
-
|
|
644
|
-
BATCH1 --> API[Fluent API]
|
|
645
|
-
BATCH2 --> API
|
|
646
|
-
BATCH3 --> API
|
|
647
|
-
|
|
648
|
-
style FILE fill:#ffebee
|
|
649
|
-
style STREAM1 fill:#e3f2fd
|
|
650
|
-
style API fill:#e8f5e9
|
|
651
|
-
```
|
|
652
|
-
|
|
653
|
-
**Benefits:**
|
|
654
|
-
|
|
655
|
-
- Constant memory usage regardless of file size
|
|
656
|
-
- Parallel processing of chunks
|
|
657
|
-
- Early error detection
|
|
658
|
-
- Faster overall throughput
|
|
659
|
-
|
|
660
|
-
### Parallel Operations
|
|
661
|
-
|
|
662
|
-
```mermaid
|
|
663
|
-
graph TB
|
|
664
|
-
START[Multiple Files] --> SPLIT[Split into Batches]
|
|
665
|
-
|
|
666
|
-
SPLIT --> P1[Process File 1]
|
|
667
|
-
SPLIT --> P2[Process File 2]
|
|
668
|
-
SPLIT --> P3[Process File 3]
|
|
669
|
-
SPLIT --> PN[Process File N]
|
|
670
|
-
|
|
671
|
-
P1 --> WAIT[Wait All Complete]
|
|
672
|
-
P2 --> WAIT
|
|
673
|
-
P3 --> WAIT
|
|
674
|
-
PN --> WAIT
|
|
675
|
-
|
|
676
|
-
WAIT --> AGGREGATE[Aggregate Results]
|
|
677
|
-
AGGREGATE --> END[Complete]
|
|
678
|
-
|
|
679
|
-
style START fill:#e3f2fd
|
|
680
|
-
style SPLIT fill:#fff3e0
|
|
681
|
-
style WAIT fill:#f3e5f5
|
|
682
|
-
style END fill:#e8f5e9
|
|
683
|
-
```
|
|
684
|
-
|
|
685
|
-
## Next Steps
|
|
686
|
-
|
|
687
|
-
- [Service Layer Architecture](./architecture-04-service-layer.md) - Explore service organization
|
|
688
|
-
- [Integration Architecture](./architecture-05-integration-architecture.md) - External system integrations
|
|
689
|
-
- [State Management](./architecture-06-state-management.md) - Distributed state patterns
|
|
690
|
-
- [Universal Mapping Guide](../../02-CORE-GUIDES/mapping/mapping-readme.md) - Field mapping details
|
|
1
|
+
# Data Flow Architecture
|
|
2
|
+
|
|
3
|
+
This document explains the three primary data flow patterns in the FC Connect SDK: Ingestion, Extraction, and Transformation.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The SDK supports three main data flow patterns:
|
|
8
|
+
|
|
9
|
+
```mermaid
|
|
10
|
+
graph TB
|
|
11
|
+
subgraph "1. Ingestion Flow"
|
|
12
|
+
I1[External Files<br/>CSV, Parquet] --> I2[Parse & Map] --> I3[Batch API] --> I4[Fluent Commerce]
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
subgraph "2. Extraction Flow"
|
|
16
|
+
E1[Fluent Commerce] --> E2[GraphQL Query] --> E3[Transform & Map] --> E4[External Storage<br/>S3, SFTP]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
subgraph "3. Transformation Flow"
|
|
20
|
+
T1[External Data<br/>XML, JSON] --> T2[Parse & Map] --> T3[GraphQL Mutation] --> T4[Fluent Commerce]
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
style I1 fill:#ffebee
|
|
24
|
+
style I2 fill:#fff3e0
|
|
25
|
+
style I3 fill:#e3f2fd
|
|
26
|
+
style I4 fill:#e8f5e9
|
|
27
|
+
style E1 fill:#e8f5e9
|
|
28
|
+
style E2 fill:#e3f2fd
|
|
29
|
+
style E3 fill:#f3e5f5
|
|
30
|
+
style E4 fill:#ffebee
|
|
31
|
+
style T1 fill:#ffebee
|
|
32
|
+
style T2 fill:#fff3e0
|
|
33
|
+
style T3 fill:#e3f2fd
|
|
34
|
+
style T4 fill:#e8f5e9
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
## 1. Ingestion Flow
|
|
38
|
+
|
|
39
|
+
Ingestion processes external files (CSV, Parquet) and sends data to Fluent Commerce via the Batch API.
|
|
40
|
+
|
|
41
|
+
### High-Level Flow
|
|
42
|
+
|
|
43
|
+
```mermaid
|
|
44
|
+
flowchart TD
|
|
45
|
+
START[Start Ingestion] --> DISCOVER[Discover Files<br/>S3/SFTP]
|
|
46
|
+
DISCOVER --> CHECK{File Already<br/>Processed?}
|
|
47
|
+
|
|
48
|
+
CHECK -->|Yes| SKIP[Skip File]
|
|
49
|
+
CHECK -->|No| DOWNLOAD[Download File]
|
|
50
|
+
|
|
51
|
+
DOWNLOAD --> PARSE[Parse File<br/>CSV/Parquet Parser]
|
|
52
|
+
PARSE --> MAP[Map Fields<br/>Universal Mapper]
|
|
53
|
+
MAP --> BATCH[Create Batches<br/>Group rows]
|
|
54
|
+
BATCH --> JOB{Job Exists?}
|
|
55
|
+
|
|
56
|
+
JOB -->|No| CREATE_JOB[Create New Job]
|
|
57
|
+
JOB -->|Yes| USE_JOB[Use Existing Job]
|
|
58
|
+
|
|
59
|
+
CREATE_JOB --> SEND
|
|
60
|
+
USE_JOB --> SEND[Send Batches<br/>to Fluent API]
|
|
61
|
+
|
|
62
|
+
SEND --> VERIFY{All Batches<br/>Successful?}
|
|
63
|
+
|
|
64
|
+
VERIFY -->|Yes| ARCHIVE[Archive File]
|
|
65
|
+
VERIFY -->|No| ERROR[Handle Errors]
|
|
66
|
+
|
|
67
|
+
ARCHIVE --> STATE[Update State<br/>Mark Processed]
|
|
68
|
+
STATE --> NEXT{More Files?}
|
|
69
|
+
|
|
70
|
+
NEXT -->|Yes| DISCOVER
|
|
71
|
+
NEXT -->|No| END[Complete]
|
|
72
|
+
|
|
73
|
+
ERROR --> NEXT
|
|
74
|
+
|
|
75
|
+
style START fill:#e3f2fd
|
|
76
|
+
style PARSE fill:#fff3e0
|
|
77
|
+
style MAP fill:#f3e5f5
|
|
78
|
+
style SEND fill:#e8f5e9
|
|
79
|
+
style END fill:#e3f2fd
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
### Detailed Ingestion Components
|
|
83
|
+
|
|
84
|
+
```mermaid
|
|
85
|
+
sequenceDiagram
|
|
86
|
+
participant DS as Data Source<br/>(S3/SFTP)
|
|
87
|
+
participant Parser
|
|
88
|
+
participant Mapper
|
|
89
|
+
participant State
|
|
90
|
+
participant BatchAPI
|
|
91
|
+
participant Fluent
|
|
92
|
+
|
|
93
|
+
DS->>Parser: Stream file data
|
|
94
|
+
Parser->>Parser: Validate format
|
|
95
|
+
Parser-->>Mapper: Row by row
|
|
96
|
+
|
|
97
|
+
loop For Each Row
|
|
98
|
+
Mapper->>Mapper: Apply field mappings
|
|
99
|
+
Mapper->>Mapper: Run resolvers
|
|
100
|
+
Mapper-->>BatchAPI: Mapped entity
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
BatchAPI->>State: Check job status
|
|
104
|
+
State-->>BatchAPI: Job ID or create new
|
|
105
|
+
|
|
106
|
+
BatchAPI->>Fluent: Create job (if needed)
|
|
107
|
+
Fluent-->>BatchAPI: Job ID
|
|
108
|
+
|
|
109
|
+
loop For Each Batch
|
|
110
|
+
BatchAPI->>Fluent: Send batch
|
|
111
|
+
Fluent-->>BatchAPI: Batch ID
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
BatchAPI->>State: Mark file processed
|
|
115
|
+
BatchAPI->>DS: Archive file
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### Job Strategies
|
|
119
|
+
|
|
120
|
+
The SDK supports three job creation strategies:
|
|
121
|
+
|
|
122
|
+
```mermaid
|
|
123
|
+
graph TB
|
|
124
|
+
subgraph "DAILY Strategy"
|
|
125
|
+
D1[Create Job Once] --> D2[Reuse All Day]
|
|
126
|
+
D2 --> D3[Send All Batches<br/>to Same Job]
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
subgraph "SINGLE Strategy"
|
|
130
|
+
S1[Create One Job] --> S2[Send All Batches]
|
|
131
|
+
S2 --> S3[Complete]
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
subgraph "PER_FILE Strategy"
|
|
135
|
+
P1[Process File] --> P2[Create New Job]
|
|
136
|
+
P2 --> P3[Send All Batches]
|
|
137
|
+
P3 --> P4[Next File]
|
|
138
|
+
P4 --> P1
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
style D1 fill:#e8f5e9
|
|
142
|
+
style D2 fill:#e8f5e9
|
|
143
|
+
style D3 fill:#e8f5e9
|
|
144
|
+
style S1 fill:#fff3e0
|
|
145
|
+
style S2 fill:#fff3e0
|
|
146
|
+
style S3 fill:#fff3e0
|
|
147
|
+
style P1 fill:#f3e5f5
|
|
148
|
+
style P2 fill:#f3e5f5
|
|
149
|
+
style P3 fill:#f3e5f5
|
|
150
|
+
style P4 fill:#f3e5f5
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
**When to Use Each:**
|
|
154
|
+
|
|
155
|
+
- **DAILY**: High-volume, continuous ingestion (recommended) - Reuses same job for all files processed in a day
|
|
156
|
+
- **SINGLE**: One-time ingestion - Creates one job for entire workflow run
|
|
157
|
+
- **PER_FILE**: Low volume, need file-level tracking - Creates new job per file
|
|
158
|
+
|
|
159
|
+
### File Archival
|
|
160
|
+
|
|
161
|
+
```mermaid
|
|
162
|
+
flowchart LR
|
|
163
|
+
SOURCE[Source Bucket] --> PROCESS{Processing<br/>Success?}
|
|
164
|
+
|
|
165
|
+
PROCESS -->|Success| STRATEGY{Archival<br/>Strategy}
|
|
166
|
+
PROCESS -->|Failure| ERROR[Error Bucket]
|
|
167
|
+
|
|
168
|
+
STRATEGY -->|Move| MOVE[Copy to Archive<br/>Delete from Source]
|
|
169
|
+
STRATEGY -->|Copy| COPY[Copy to Archive<br/>Keep Source]
|
|
170
|
+
STRATEGY -->|Copy-Delete| CD[Copy to Archive<br/>Explicit Delete]
|
|
171
|
+
|
|
172
|
+
MOVE --> ARCHIVE[Archive Bucket]
|
|
173
|
+
COPY --> ARCHIVE
|
|
174
|
+
CD --> ARCHIVE
|
|
175
|
+
|
|
176
|
+
style SOURCE fill:#e3f2fd
|
|
177
|
+
style ARCHIVE fill:#e8f5e9
|
|
178
|
+
style ERROR fill:#ffebee
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## 2. Extraction Flow
|
|
182
|
+
|
|
183
|
+
Extraction queries data from Fluent Commerce and saves it to external storage.
|
|
184
|
+
|
|
185
|
+
> **Note:** This section shows the optional ExtractionOrchestrator. For the recommended
|
|
186
|
+
> building-block approach, see [Building-Block Extraction Pattern](#building-block-extraction) below.
|
|
187
|
+
|
|
188
|
+
### High-Level Flow
|
|
189
|
+
|
|
190
|
+
```mermaid
|
|
191
|
+
flowchart TD
|
|
192
|
+
START[Start Extraction] --> QUERY[Execute GraphQL Query]
|
|
193
|
+
QUERY --> PAGE{More Pages?}
|
|
194
|
+
|
|
195
|
+
PAGE -->|Yes| FETCH[Fetch Next Page<br/>Cursor-based]
|
|
196
|
+
PAGE -->|No| TRANSFORM[Transform Data]
|
|
197
|
+
|
|
198
|
+
FETCH --> ACCUMULATE[Accumulate Results]
|
|
199
|
+
ACCUMULATE --> PAGE
|
|
200
|
+
|
|
201
|
+
TRANSFORM --> MAP[Apply Field Mappings]
|
|
202
|
+
MAP --> FORMAT{Output Format?}
|
|
203
|
+
|
|
204
|
+
FORMAT -->|JSON| JSON[Convert to JSON]
|
|
205
|
+
FORMAT -->|Parquet| PARQUET[Convert to Parquet]
|
|
206
|
+
FORMAT -->|CSV| CSV[Convert to CSV]
|
|
207
|
+
|
|
208
|
+
JSON --> UPLOAD[Upload to S3/SFTP]
|
|
209
|
+
PARQUET --> UPLOAD
|
|
210
|
+
CSV --> UPLOAD
|
|
211
|
+
|
|
212
|
+
UPLOAD --> STATE[Update State]
|
|
213
|
+
STATE --> END[Complete]
|
|
214
|
+
|
|
215
|
+
style START fill:#e3f2fd
|
|
216
|
+
style QUERY fill:#fff3e0
|
|
217
|
+
style MAP fill:#f3e5f5
|
|
218
|
+
style UPLOAD fill:#e8f5e9
|
|
219
|
+
style END fill:#e3f2fd
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### Detailed Extraction Components
|
|
223
|
+
|
|
224
|
+
```mermaid
|
|
225
|
+
sequenceDiagram
|
|
226
|
+
participant Client
|
|
227
|
+
participant Fluent
|
|
228
|
+
participant Mapper
|
|
229
|
+
participant Storage
|
|
230
|
+
|
|
231
|
+
Client->>Fluent: Execute GraphQL query (page 1)
|
|
232
|
+
Fluent-->>Client: Results + cursor
|
|
233
|
+
|
|
234
|
+
loop Pagination
|
|
235
|
+
Client->>Fluent: Fetch next page
|
|
236
|
+
Fluent-->>Client: Results + cursor
|
|
237
|
+
end
|
|
238
|
+
|
|
239
|
+
Client->>Mapper: Apply extraction mappings
|
|
240
|
+
Mapper->>Mapper: Transform fields
|
|
241
|
+
Mapper-->>Client: Mapped data
|
|
242
|
+
|
|
243
|
+
Client->>Storage: Upload results
|
|
244
|
+
Storage-->>Client: Upload confirmation
|
|
245
|
+
Client-->>Client: Extraction complete
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### Pagination Strategy
|
|
249
|
+
|
|
250
|
+
The SDK uses cursor-based pagination following Relay specification:
|
|
251
|
+
|
|
252
|
+
⚠️ **SDK AUTO-PAGINATION BEHAVIOR:**
|
|
253
|
+
|
|
254
|
+
The SDK's auto-pagination feature automatically handles cursor extraction from edges.
|
|
255
|
+
**Users should rely on `client.graphql()` with auto-pagination enabled** instead of implementing manual pagination.
|
|
256
|
+
|
|
257
|
+
#### Recommended Approach (Let SDK Handle It)
|
|
258
|
+
|
|
259
|
+
```typescript
|
|
260
|
+
// ✅ CORRECT - Let SDK handle pagination automatically
|
|
261
|
+
const result = await client.graphql({
|
|
262
|
+
query: VIRTUAL_POSITIONS_QUERY,
|
|
263
|
+
variables: { first: 100 },
|
|
264
|
+
// Auto-pagination enabled by default for queries with pagination variables
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
// SDK internally extracts cursors from edges - you don't need to do this manually
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
#### Manual Cursor Extraction (Advanced - Not Recommended)
|
|
271
|
+
|
|
272
|
+
If you need manual control (rare), the SDK extracts cursors like this internally:
|
|
273
|
+
|
|
274
|
+
```typescript
|
|
275
|
+
// ❌ WRONG - Don't implement this yourself, SDK does it for you
|
|
276
|
+
const cursor = edges[edges.length - 1]?.cursor;
|
|
277
|
+
|
|
278
|
+
// ✅ CORRECT - Use SDK's auto-pagination instead
|
|
279
|
+
const result = await client.graphql({
|
|
280
|
+
query: '...',
|
|
281
|
+
variables: { first: 100 }
|
|
282
|
+
// SDK handles cursor extraction automatically
|
|
283
|
+
});
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
**Why This Matters:** Fluent Commerce returns cursors in edges, not pageInfo.endCursor.
|
|
287
|
+
The SDK's auto-pagination handles this automatically. Manual implementation is error-prone and unnecessary.
|
|
288
|
+
|
|
289
|
+
**See:** [Auto-Pagination Guide](../../02-CORE-GUIDES/auto-pagination/) for complete documentation.
|
|
290
|
+
|
|
291
|
+
```mermaid
|
|
292
|
+
flowchart LR
|
|
293
|
+
Q1[Query Page 1<br/>first: 100] --> R1[Results + edges array]
|
|
294
|
+
R1 --> EXTRACT1[Extract: edges-last-.cursor]
|
|
295
|
+
EXTRACT1 --> Q2[Query Page 2<br/>after: lastEdge.cursor]
|
|
296
|
+
Q2 --> R2[Results + edges array]
|
|
297
|
+
R2 --> EXTRACT2[Extract: edges-last-.cursor]
|
|
298
|
+
EXTRACT2 --> Q3[Query Page 3<br/>after: lastEdge.cursor]
|
|
299
|
+
Q3 --> R3[Results + hasNextPage: false]
|
|
300
|
+
R3 --> DONE[All Data Fetched]
|
|
301
|
+
|
|
302
|
+
style Q1 fill:#e3f2fd
|
|
303
|
+
style Q2 fill:#e3f2fd
|
|
304
|
+
style Q3 fill:#e3f2fd
|
|
305
|
+
style EXTRACT1 fill:#fff3e0
|
|
306
|
+
style EXTRACT2 fill:#fff3e0
|
|
307
|
+
style DONE fill:#e8f5e9
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
**Pagination Features:**
|
|
311
|
+
|
|
312
|
+
- Automatic cursor management (extracts from edge cursors)
|
|
313
|
+
- Handles Fluent-specific cursor extraction
|
|
314
|
+
- Configurable page size
|
|
315
|
+
- Rate limiting between pages
|
|
316
|
+
- Memory-efficient streaming
|
|
317
|
+
|
|
318
|
+
**Correct Pagination Implementation:**
|
|
319
|
+
|
|
320
|
+
```typescript
|
|
321
|
+
let hasNextPage = true;
|
|
322
|
+
let cursor: string | undefined = undefined;
|
|
323
|
+
|
|
324
|
+
while (hasNextPage) {
|
|
325
|
+
const result = await client.graphql({
|
|
326
|
+
query: `
|
|
327
|
+
query GetData($first: Int, $after: String) {
|
|
328
|
+
virtualPositions(first: $first, after: $after) {
|
|
329
|
+
edges {
|
|
330
|
+
node { id ref quantity }
|
|
331
|
+
cursor # ✅ Must include cursor in query
|
|
332
|
+
}
|
|
333
|
+
pageInfo {
|
|
334
|
+
hasNextPage # ✅ Fluent returns this
|
|
335
|
+
# ❌ NO endCursor field in Fluent API
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
`,
|
|
340
|
+
variables: { first: 100, after: cursor },
|
|
341
|
+
});
|
|
342
|
+
|
|
343
|
+
const edges = result.data.virtualPositions.edges;
|
|
344
|
+
|
|
345
|
+
// Extract cursor from last edge (Fluent-specific)
|
|
346
|
+
cursor = edges.length > 0 ? edges[edges.length - 1].cursor : null;
|
|
347
|
+
hasNextPage = result.data.virtualPositions.pageInfo.hasNextPage;
|
|
348
|
+
|
|
349
|
+
// Process data
|
|
350
|
+
for (const edge of edges) {
|
|
351
|
+
processRecord(edge.node);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
### Building-Block Extraction (Recommended) {#building-block-extraction}
|
|
357
|
+
|
|
358
|
+
For maximum flexibility, compose SDK services directly instead of using the orchestrator:
|
|
359
|
+
|
|
360
|
+
```typescript
|
|
361
|
+
// ✅ RECOMMENDED - Direct client.graphql() usage with auto-pagination
|
|
362
|
+
const result = await client.graphql({
|
|
363
|
+
query: VIRTUAL_POSITIONS_QUERY,
|
|
364
|
+
variables: { first: 100 },
|
|
365
|
+
// Auto-pagination enabled by default
|
|
366
|
+
});
|
|
367
|
+
|
|
368
|
+
// Extract and transform data
|
|
369
|
+
const items = result.data?.virtualPositions?.edges?.map(e => e.node) || [];
|
|
370
|
+
|
|
371
|
+
// Use UniversalMapper if needed
|
|
372
|
+
const mapper = new UniversalMapper(mappingConfig);
|
|
373
|
+
const transformed = await Promise.all(items.map(item => mapper.map(item)));
|
|
374
|
+
|
|
375
|
+
// Upload to S3/SFTP
|
|
376
|
+
await s3.uploadFile('output.json', JSON.stringify(transformed));
|
|
377
|
+
```
|
|
378
|
+
|
|
379
|
+
**Extraction Flow Diagram (Building Blocks):**
|
|
380
|
+
|
|
381
|
+
```mermaid
|
|
382
|
+
flowchart TD
|
|
383
|
+
START[Start Extraction] --> CLIENT[client.graphql with auto-pagination]
|
|
384
|
+
CLIENT --> EXTRACT[Extract nodes from edges]
|
|
385
|
+
EXTRACT --> TRANSFORM[Transform with UniversalMapper]
|
|
386
|
+
TRANSFORM --> UPLOAD[Upload to S3/SFTP]
|
|
387
|
+
UPLOAD --> END[Complete]
|
|
388
|
+
|
|
389
|
+
style START fill:#e3f2fd
|
|
390
|
+
style CLIENT fill:#fff3e0
|
|
391
|
+
style TRANSFORM fill:#f3e5f5
|
|
392
|
+
style UPLOAD fill:#e8f5e9
|
|
393
|
+
style END fill:#e3f2fd
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
**Recommendation:** Use building blocks for production. Use orchestrator for prototyping.
|
|
397
|
+
|
|
398
|
+
## 3. Transformation Flow
|
|
399
|
+
|
|
400
|
+
Transformation converts external data formats (XML, JSON) to Fluent Commerce GraphQL mutations.
|
|
401
|
+
|
|
402
|
+
### High-Level Flow
|
|
403
|
+
|
|
404
|
+
```mermaid
|
|
405
|
+
flowchart TD
|
|
406
|
+
START[Receive Data<br/>XML/JSON] --> PARSE[Parse Input<br/>XMLParser/JSONParser]
|
|
407
|
+
PARSE --> MAP[Apply Mutation Mapping<br/>GraphQLMutationMapper]
|
|
408
|
+
MAP --> VALIDATE[Validate Mutation]
|
|
409
|
+
|
|
410
|
+
VALIDATE --> EXECUTE[Execute GraphQL Mutation]
|
|
411
|
+
EXECUTE --> CHECK{Mutation<br/>Successful?}
|
|
412
|
+
|
|
413
|
+
CHECK -->|Yes| STATE[Update State]
|
|
414
|
+
CHECK -->|No| ERROR[Handle Error]
|
|
415
|
+
|
|
416
|
+
STATE --> RESPONSE[Return Success]
|
|
417
|
+
ERROR --> RETRY{Retry?}
|
|
418
|
+
|
|
419
|
+
RETRY -->|Yes| EXECUTE
|
|
420
|
+
RETRY -->|No| FAIL[Return Failure]
|
|
421
|
+
|
|
422
|
+
RESPONSE --> END[Complete]
|
|
423
|
+
FAIL --> END
|
|
424
|
+
|
|
425
|
+
style START fill:#e3f2fd
|
|
426
|
+
style PARSE fill:#fff3e0
|
|
427
|
+
style MAP fill:#f3e5f5
|
|
428
|
+
style EXECUTE fill:#e8f5e9
|
|
429
|
+
style END fill:#e3f2fd
|
|
430
|
+
style ERROR fill:#ffebee
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
### SFCC Order Example
|
|
434
|
+
|
|
435
|
+
Real-world example: Converting SFCC XML orders to Fluent Commerce mutations.
|
|
436
|
+
|
|
437
|
+
```mermaid
|
|
438
|
+
sequenceDiagram
|
|
439
|
+
participant SFCC
|
|
440
|
+
participant Webhook
|
|
441
|
+
participant XMLParser
|
|
442
|
+
participant MutationMapper
|
|
443
|
+
participant Fluent
|
|
444
|
+
|
|
445
|
+
SFCC->>Webhook: POST /order (XML payload)
|
|
446
|
+
Webhook->>XMLParser: Parse XML
|
|
447
|
+
|
|
448
|
+
XMLParser->>XMLParser: Extract fields<br/>(order-no, customer, items)
|
|
449
|
+
XMLParser-->>MutationMapper: Parsed data
|
|
450
|
+
|
|
451
|
+
MutationMapper->>MutationMapper: Load mapping config
|
|
452
|
+
MutationMapper->>MutationMapper: Build GraphQL mutation
|
|
453
|
+
MutationMapper->>MutationMapper: Map nested arrays<br/>(line items, addresses)
|
|
454
|
+
|
|
455
|
+
MutationMapper->>Fluent: Execute createOrder mutation
|
|
456
|
+
Fluent-->>MutationMapper: Order created
|
|
457
|
+
|
|
458
|
+
MutationMapper-->>Webhook: Success response
|
|
459
|
+
Webhook-->>SFCC: 200 OK
|
|
460
|
+
```
|
|
461
|
+
|
|
462
|
+
### Mutation Mapping Process
|
|
463
|
+
|
|
464
|
+
```mermaid
|
|
465
|
+
flowchart TB
|
|
466
|
+
XML[XML/JSON Input] --> PARSE[Parse to Object]
|
|
467
|
+
PARSE --> CONFIG[Load Mapping Config]
|
|
468
|
+
|
|
469
|
+
CONFIG --> ROOT[Map Root Fields]
|
|
470
|
+
ROOT --> NESTED{Has Nested<br/>Arrays?}
|
|
471
|
+
|
|
472
|
+
NESTED -->|Yes| ARRAY[Map Array Items]
|
|
473
|
+
NESTED -->|No| BUILD
|
|
474
|
+
|
|
475
|
+
ARRAY --> CONTEXT[Switch Context<br/>to Array Item]
|
|
476
|
+
CONTEXT --> MAP_ITEM[Map Item Fields]
|
|
477
|
+
MAP_ITEM --> NEXT{More Items?}
|
|
478
|
+
|
|
479
|
+
NEXT -->|Yes| ARRAY
|
|
480
|
+
NEXT -->|No| BUILD[Build GraphQL Mutation]
|
|
481
|
+
|
|
482
|
+
BUILD --> VARIABLES[Extract Variables]
|
|
483
|
+
VARIABLES --> MUTATION[Complete Mutation Object]
|
|
484
|
+
MUTATION --> EXECUTE[Execute Against API]
|
|
485
|
+
|
|
486
|
+
style XML fill:#e3f2fd
|
|
487
|
+
style PARSE fill:#fff3e0
|
|
488
|
+
style CONFIG fill:#f3e5f5
|
|
489
|
+
style EXECUTE fill:#e8f5e9
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
## Universal Mapping Engine
|
|
493
|
+
|
|
494
|
+
All three flows use the same Universal Mapper with consistent field resolution:
|
|
495
|
+
|
|
496
|
+
```mermaid
|
|
497
|
+
flowchart TD
|
|
498
|
+
START[Field Config] --> PRIORITY{Resolution<br/>Priority}
|
|
499
|
+
|
|
500
|
+
PRIORITY -->|1| STATIC{Has Static<br/>Value?}
|
|
501
|
+
PRIORITY -->|2| SOURCE{Has Source<br/>Path?}
|
|
502
|
+
PRIORITY -->|3| RESOLVER{Has Resolver?}
|
|
503
|
+
PRIORITY -->|4| DEFAULT{Has Default?}
|
|
504
|
+
|
|
505
|
+
STATIC -->|Yes| RETURN1[Return Static Value]
|
|
506
|
+
STATIC -->|No| SOURCE
|
|
507
|
+
|
|
508
|
+
SOURCE -->|Yes| EXTRACT[Extract from Source Data]
|
|
509
|
+
SOURCE -->|No| RESOLVER
|
|
510
|
+
|
|
511
|
+
EXTRACT --> RESOLVER
|
|
512
|
+
|
|
513
|
+
RESOLVER -->|Yes| TRANSFORM[Apply Resolver<br/>sdk.* or custom.*]
|
|
514
|
+
RESOLVER -->|No| DEFAULT
|
|
515
|
+
|
|
516
|
+
TRANSFORM --> VALIDATE
|
|
517
|
+
|
|
518
|
+
DEFAULT -->|Yes| RETURN2[Return Default]
|
|
519
|
+
DEFAULT -->|No| REQUIRED{Field<br/>Required?}
|
|
520
|
+
|
|
521
|
+
REQUIRED -->|Yes| ERROR[Throw Error]
|
|
522
|
+
REQUIRED -->|No| RETURN3[Return undefined]
|
|
523
|
+
|
|
524
|
+
RETURN1 --> VALIDATE[Validate Result]
|
|
525
|
+
RETURN2 --> VALIDATE
|
|
526
|
+
RETURN3 --> VALIDATE
|
|
527
|
+
|
|
528
|
+
VALIDATE --> END[Return Mapped Value]
|
|
529
|
+
|
|
530
|
+
style START fill:#e3f2fd
|
|
531
|
+
style TRANSFORM fill:#fff3e0
|
|
532
|
+
style VALIDATE fill:#e8f5e9
|
|
533
|
+
style ERROR fill:#ffebee
|
|
534
|
+
style END fill:#e3f2fd
|
|
535
|
+
```
|
|
536
|
+
|
|
537
|
+
## State Management Flow
|
|
538
|
+
|
|
539
|
+
All flows integrate with state management to prevent duplicate processing:
|
|
540
|
+
|
|
541
|
+
```mermaid
|
|
542
|
+
sequenceDiagram
|
|
543
|
+
participant Flow
|
|
544
|
+
participant StateService
|
|
545
|
+
participant KVStore
|
|
546
|
+
|
|
547
|
+
Flow->>StateService: isFileProcessed(kv, fileName, workflowId)
|
|
548
|
+
StateService->>KVStore: Get file key
|
|
549
|
+
KVStore-->>StateService: File status
|
|
550
|
+
|
|
551
|
+
alt File Already Processed
|
|
552
|
+
StateService-->>Flow: true (skip)
|
|
553
|
+
else File Not Processed
|
|
554
|
+
StateService-->>Flow: false (process)
|
|
555
|
+
Flow->>Flow: Process file
|
|
556
|
+
Flow->>StateService: updateSyncState(kv, processedFiles, workflowId)
|
|
557
|
+
StateService->>StateService: Add to processedFiles array
|
|
558
|
+
StateService->>KVStore: Update state
|
|
559
|
+
KVStore-->>StateService: Confirmation
|
|
560
|
+
StateService-->>Flow: Marked
|
|
561
|
+
end
|
|
562
|
+
```
|
|
563
|
+
|
|
564
|
+
**State Object Structure:**
|
|
565
|
+
|
|
566
|
+
```typescript
|
|
567
|
+
{
|
|
568
|
+
processedFiles: [
|
|
569
|
+
{ key: 'file1.csv', timestamp: '2025-01-15T10:00:00Z' },
|
|
570
|
+
{ key: 'file2.csv', timestamp: '2025-01-15T11:00:00Z' }
|
|
571
|
+
],
|
|
572
|
+
dailyJobId: 'job-123',
|
|
573
|
+
currentJobBatchCount: 5,
|
|
574
|
+
lastProcessedTimestamp: '2025-01-15T11:00:00Z'
|
|
575
|
+
}
|
|
576
|
+
```
|
|
577
|
+
|
|
578
|
+
## Error Handling Across Flows
|
|
579
|
+
|
|
580
|
+
```mermaid
|
|
581
|
+
flowchart TD
|
|
582
|
+
ERROR[Error Occurs] --> TYPE{Error Type}
|
|
583
|
+
|
|
584
|
+
TYPE -->|4xx Client Error| CLIENT[Client Error Handler]
|
|
585
|
+
TYPE -->|5xx Server Error| SERVER[Server Error Handler]
|
|
586
|
+
TYPE -->|Network Error| NETWORK[Network Error Handler]
|
|
587
|
+
TYPE -->|Validation Error| VALIDATION[Validation Error Handler]
|
|
588
|
+
|
|
589
|
+
CLIENT --> LOG1[Log Error]
|
|
590
|
+
LOG1 --> FAIL[Fail Fast<br/>No Retry]
|
|
591
|
+
|
|
592
|
+
SERVER --> LOG2[Log Error]
|
|
593
|
+
LOG2 --> RETRY{Retry Count<br/>< Max?}
|
|
594
|
+
|
|
595
|
+
RETRY -->|Yes| BACKOFF[Exponential Backoff<br/>1s, 2s, 4s]
|
|
596
|
+
RETRY -->|No| FAIL
|
|
597
|
+
|
|
598
|
+
BACKOFF --> REATTEMPT[Reattempt Operation]
|
|
599
|
+
REATTEMPT --> SUCCESS{Successful?}
|
|
600
|
+
|
|
601
|
+
SUCCESS -->|Yes| CONTINUE[Continue Processing]
|
|
602
|
+
SUCCESS -->|No| RETRY
|
|
603
|
+
|
|
604
|
+
NETWORK --> LOG3[Log Error]
|
|
605
|
+
LOG3 --> RETRY
|
|
606
|
+
|
|
607
|
+
VALIDATION --> LOG4[Log Error]
|
|
608
|
+
LOG4 --> STRATEGY{Error Strategy}
|
|
609
|
+
|
|
610
|
+
STRATEGY -->|fail-fast| FAIL
|
|
611
|
+
STRATEGY -->|continue-on-error| SKIP[Skip Item<br/>Continue]
|
|
612
|
+
|
|
613
|
+
SKIP --> CONTINUE
|
|
614
|
+
|
|
615
|
+
style ERROR fill:#ffebee
|
|
616
|
+
style FAIL fill:#ff5252
|
|
617
|
+
style CONTINUE fill:#e8f5e9
|
|
618
|
+
style BACKOFF fill:#fff3e0
|
|
619
|
+
```
|
|
620
|
+
|
|
621
|
+
## Performance Optimizations
|
|
622
|
+
|
|
623
|
+
### Streaming Pipeline
|
|
624
|
+
|
|
625
|
+
```mermaid
|
|
626
|
+
flowchart LR
|
|
627
|
+
FILE[Large File<br/>1GB] --> STREAM1[Stream Reader]
|
|
628
|
+
STREAM1 --> CHUNK1[Chunk 1]
|
|
629
|
+
STREAM1 --> CHUNK2[Chunk 2]
|
|
630
|
+
STREAM1 --> CHUNK3[Chunk N]
|
|
631
|
+
|
|
632
|
+
CHUNK1 --> PARSE1[Parse]
|
|
633
|
+
CHUNK2 --> PARSE2[Parse]
|
|
634
|
+
CHUNK3 --> PARSE3[Parse]
|
|
635
|
+
|
|
636
|
+
PARSE1 --> MAP1[Map]
|
|
637
|
+
PARSE2 --> MAP2[Map]
|
|
638
|
+
PARSE3 --> MAP3[Map]
|
|
639
|
+
|
|
640
|
+
MAP1 --> BATCH1[Batch 1]
|
|
641
|
+
MAP2 --> BATCH2[Batch 2]
|
|
642
|
+
MAP3 --> BATCH3[Batch N]
|
|
643
|
+
|
|
644
|
+
BATCH1 --> API[Fluent API]
|
|
645
|
+
BATCH2 --> API
|
|
646
|
+
BATCH3 --> API
|
|
647
|
+
|
|
648
|
+
style FILE fill:#ffebee
|
|
649
|
+
style STREAM1 fill:#e3f2fd
|
|
650
|
+
style API fill:#e8f5e9
|
|
651
|
+
```
|
|
652
|
+
|
|
653
|
+
**Benefits:**
|
|
654
|
+
|
|
655
|
+
- Constant memory usage regardless of file size
|
|
656
|
+
- Parallel processing of chunks
|
|
657
|
+
- Early error detection
|
|
658
|
+
- Faster overall throughput
|
|
659
|
+
|
|
660
|
+
### Parallel Operations
|
|
661
|
+
|
|
662
|
+
```mermaid
|
|
663
|
+
graph TB
|
|
664
|
+
START[Multiple Files] --> SPLIT[Split into Batches]
|
|
665
|
+
|
|
666
|
+
SPLIT --> P1[Process File 1]
|
|
667
|
+
SPLIT --> P2[Process File 2]
|
|
668
|
+
SPLIT --> P3[Process File 3]
|
|
669
|
+
SPLIT --> PN[Process File N]
|
|
670
|
+
|
|
671
|
+
P1 --> WAIT[Wait All Complete]
|
|
672
|
+
P2 --> WAIT
|
|
673
|
+
P3 --> WAIT
|
|
674
|
+
PN --> WAIT
|
|
675
|
+
|
|
676
|
+
WAIT --> AGGREGATE[Aggregate Results]
|
|
677
|
+
AGGREGATE --> END[Complete]
|
|
678
|
+
|
|
679
|
+
style START fill:#e3f2fd
|
|
680
|
+
style SPLIT fill:#fff3e0
|
|
681
|
+
style WAIT fill:#f3e5f5
|
|
682
|
+
style END fill:#e8f5e9
|
|
683
|
+
```
|
|
684
|
+
|
|
685
|
+
## Next Steps
|
|
686
|
+
|
|
687
|
+
- [Service Layer Architecture](./architecture-04-service-layer.md) - Explore service organization
|
|
688
|
+
- [Integration Architecture](./architecture-05-integration-architecture.md) - External system integrations
|
|
689
|
+
- [State Management](./architecture-06-state-management.md) - Distributed state patterns
|
|
690
|
+
- [Universal Mapping Guide](../../02-CORE-GUIDES/mapping/mapping-readme.md) - Field mapping details
|