@machinemetrics/mm-erp-sdk 0.2.0-beta.0 → 0.2.0-beta.1
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/README.md +0 -5
- package/dist/config-CvA-mFWF.js +418 -0
- package/dist/config-CvA-mFWF.js.map +1 -0
- package/dist/connector-factory-BPm2GVVF.js +30 -0
- package/dist/connector-factory-BPm2GVVF.js.map +1 -0
- package/dist/hashed-cache-manager-B15NN8hK.js +322 -0
- package/dist/hashed-cache-manager-B15NN8hK.js.map +1 -0
- package/dist/index-D8qO1NyK.js +192 -0
- package/dist/index-D8qO1NyK.js.map +1 -0
- package/dist/index.d.ts +43 -42
- package/dist/index.d.ts.map +1 -1
- package/dist/knexfile-Bng2Ru9c.js +20 -0
- package/dist/knexfile-Bng2Ru9c.js.map +1 -0
- package/dist/knexfile.d.ts.map +1 -1
- package/dist/logger-BWw0_z9q.js +17557 -0
- package/dist/logger-BWw0_z9q.js.map +1 -0
- package/dist/migrations/20241015162631_create_cache_table.js +15 -11
- package/dist/migrations/20241015162631_create_cache_table.js.map +1 -1
- package/dist/migrations/20241015162632_create_sdk_cache_table.js +15 -11
- package/dist/migrations/20241015162632_create_sdk_cache_table.js.map +1 -1
- package/dist/migrations/20250103162631_create_record_tracking_table.js +15 -14
- package/dist/migrations/20250103162631_create_record_tracking_table.js.map +1 -1
- package/dist/mm-erp-sdk.js +4978 -0
- package/dist/mm-erp-sdk.js.map +1 -0
- package/dist/services/caching-service/batch-cache-manager.d.ts +1 -1
- package/dist/services/caching-service/batch-cache-manager.d.ts.map +1 -1
- package/dist/services/caching-service/hashed-cache-manager.d.ts +2 -2
- package/dist/services/caching-service/hashed-cache-manager.d.ts.map +1 -1
- package/dist/services/caching-service/index.d.ts +1 -1
- package/dist/services/caching-service/index.d.ts.map +1 -1
- package/dist/services/caching-service/record-tracking-manager.d.ts +1 -1
- package/dist/services/caching-service/record-tracking-manager.d.ts.map +1 -1
- package/dist/services/data-sync-service/configuration-manager.d.ts +1 -1
- package/dist/services/data-sync-service/configuration-manager.d.ts.map +1 -1
- package/dist/services/data-sync-service/data-sync-service.d.ts.map +1 -1
- package/dist/services/data-sync-service/index.d.ts +3 -3
- package/dist/services/data-sync-service/index.d.ts.map +1 -1
- package/dist/services/data-sync-service/jobs/clean-up-expired-cache.d.ts.map +1 -1
- package/dist/services/data-sync-service/jobs/clean-up-expired-cache.js +40 -42
- package/dist/services/data-sync-service/jobs/clean-up-expired-cache.js.map +1 -1
- package/dist/services/data-sync-service/jobs/from-erp.d.ts.map +1 -1
- package/dist/services/data-sync-service/jobs/from-erp.js +37 -50
- package/dist/services/data-sync-service/jobs/from-erp.js.map +1 -1
- package/dist/services/data-sync-service/jobs/retry-failed-labor-tickets.d.ts.map +1 -1
- package/dist/services/data-sync-service/jobs/retry-failed-labor-tickets.js +36 -38
- package/dist/services/data-sync-service/jobs/retry-failed-labor-tickets.js.map +1 -1
- package/dist/services/data-sync-service/jobs/run-migrations.d.ts.map +1 -1
- package/dist/services/data-sync-service/jobs/run-migrations.js +22 -24
- package/dist/services/data-sync-service/jobs/run-migrations.js.map +1 -1
- package/dist/services/data-sync-service/jobs/to-erp.d.ts.map +1 -1
- package/dist/services/data-sync-service/jobs/to-erp.js +46 -50
- package/dist/services/data-sync-service/jobs/to-erp.js.map +1 -1
- package/dist/services/data-sync-service/nats-labor-ticket-listener.d.ts +30 -0
- package/dist/services/data-sync-service/nats-labor-ticket-listener.d.ts.map +1 -0
- package/dist/services/erp-api-services/errors.d.ts +1 -1
- package/dist/services/erp-api-services/errors.d.ts.map +1 -1
- package/dist/services/erp-api-services/graphql/graphql-service.d.ts +2 -2
- package/dist/services/erp-api-services/graphql/graphql-service.d.ts.map +1 -1
- package/dist/services/erp-api-services/index.d.ts +8 -8
- package/dist/services/erp-api-services/index.d.ts.map +1 -1
- package/dist/services/erp-api-services/rest/rest-api-service.d.ts +2 -2
- package/dist/services/erp-api-services/rest/rest-api-service.d.ts.map +1 -1
- package/dist/services/erp-api-services/types.d.ts +2 -2
- package/dist/services/erp-api-services/types.d.ts.map +1 -1
- package/dist/services/mm-api-service/company-info.d.ts +13 -0
- package/dist/services/mm-api-service/company-info.d.ts.map +1 -0
- package/dist/services/mm-api-service/index.d.ts +13 -6
- package/dist/services/mm-api-service/index.d.ts.map +1 -1
- package/dist/services/mm-api-service/mm-api-service.d.ts +13 -7
- package/dist/services/mm-api-service/mm-api-service.d.ts.map +1 -1
- package/dist/services/mm-api-service/types/entity-transformer.d.ts +2 -2
- package/dist/services/mm-api-service/types/entity-transformer.d.ts.map +1 -1
- package/dist/services/mm-api-service/types/receive-types.d.ts +3 -0
- package/dist/services/mm-api-service/types/receive-types.d.ts.map +1 -1
- package/dist/services/nats-service/nats-service.d.ts +114 -0
- package/dist/services/nats-service/nats-service.d.ts.map +1 -0
- package/dist/services/nats-service/test-nats-subscriber.d.ts +6 -0
- package/dist/services/nats-service/test-nats-subscriber.d.ts.map +1 -0
- package/dist/services/psql-erp-service/index.d.ts +3 -3
- package/dist/services/psql-erp-service/index.d.ts.map +1 -1
- package/dist/services/psql-erp-service/psql-service.d.ts +2 -2
- package/dist/services/psql-erp-service/psql-service.d.ts.map +1 -1
- package/dist/services/reporting-service/index.d.ts +1 -1
- package/dist/services/reporting-service/index.d.ts.map +1 -1
- package/dist/services/reporting-service/logger.d.ts.map +1 -1
- package/dist/services/sql-server-erp-service/index.d.ts +3 -3
- package/dist/services/sql-server-erp-service/index.d.ts.map +1 -1
- package/dist/services/sql-server-erp-service/internal/sql-labor-ticket-operations.d.ts +2 -2
- package/dist/services/sql-server-erp-service/internal/sql-labor-ticket-operations.d.ts.map +1 -1
- package/dist/services/sql-server-erp-service/sql-server-helpers.d.ts +3 -3
- package/dist/services/sql-server-erp-service/sql-server-helpers.d.ts.map +1 -1
- package/dist/services/sql-server-erp-service/sql-server-service.d.ts +2 -2
- package/dist/services/sql-server-erp-service/sql-server-service.d.ts.map +1 -1
- package/dist/services/sqlite-service/index.d.ts +1 -1
- package/dist/services/sqlite-service/index.d.ts.map +1 -1
- package/dist/types/erp-connector.d.ts +2 -9
- package/dist/types/erp-connector.d.ts.map +1 -1
- package/dist/types/index.d.ts +2 -3
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/connector-factory.d.ts +1 -1
- package/dist/utils/connector-factory.d.ts.map +1 -1
- package/dist/utils/connector-log/log-deduper.d.ts +1 -1
- package/dist/utils/connector-log/log-deduper.d.ts.map +1 -1
- package/dist/utils/connector-log/mm-connector-logger-example.d.ts +0 -1
- package/dist/utils/connector-log/mm-connector-logger.d.ts +1 -1
- package/dist/utils/connector-log/mm-connector-logger.d.ts.map +1 -1
- package/dist/utils/erp-type-from-entity.d.ts +1 -1
- package/dist/utils/erp-type-from-entity.d.ts.map +1 -1
- package/dist/utils/error-formatter.d.ts +19 -0
- package/dist/utils/error-formatter.d.ts.map +1 -0
- package/dist/utils/index.d.ts +38 -34
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/local-data-store/jobs-shared-data.d.ts +0 -2
- package/dist/utils/local-data-store/jobs-shared-data.d.ts.map +1 -1
- package/dist/utils/mm-labor-ticket-helpers.d.ts +5 -4
- package/dist/utils/mm-labor-ticket-helpers.d.ts.map +1 -1
- package/dist/utils/removeExtraneousFields.d.ts +1 -1
- package/dist/utils/removeExtraneousFields.d.ts.map +1 -1
- package/dist/utils/removeIdFieldFromPayload.d.ts +1 -1
- package/dist/utils/removeIdFieldFromPayload.d.ts.map +1 -1
- package/dist/utils/resource-group.d.ts +1 -1
- package/dist/utils/resource-group.d.ts.map +1 -1
- package/dist/utils/standard-process-drivers/error-processor.d.ts +3 -3
- package/dist/utils/standard-process-drivers/error-processor.d.ts.map +1 -1
- package/dist/utils/standard-process-drivers/index.d.ts +3 -3
- package/dist/utils/standard-process-drivers/index.d.ts.map +1 -1
- package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.d.ts +1 -1
- package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.d.ts.map +1 -1
- package/dist/utils/standard-process-drivers/mm-entity-processor.d.ts +5 -11
- package/dist/utils/standard-process-drivers/mm-entity-processor.d.ts.map +1 -1
- package/dist/utils/standard-process-drivers/standard-process-drivers.d.ts +6 -12
- package/dist/utils/standard-process-drivers/standard-process-drivers.d.ts.map +1 -1
- package/dist/utils/time-utils.d.ts.map +1 -1
- package/package.json +10 -8
- package/src/index.ts +45 -42
- package/src/knexfile.ts +0 -1
- package/src/services/caching-service/batch-cache-manager.ts +2 -2
- package/src/services/caching-service/hashed-cache-manager.ts +5 -5
- package/src/services/caching-service/index.ts +1 -1
- package/src/services/caching-service/record-tracking-manager.ts +2 -2
- package/src/services/data-sync-service/configuration-manager.ts +39 -52
- package/src/services/data-sync-service/data-sync-service.ts +19 -10
- package/src/services/data-sync-service/index.ts +3 -3
- package/src/services/data-sync-service/jobs/clean-up-expired-cache.ts +4 -5
- package/src/services/data-sync-service/jobs/from-erp.ts +6 -12
- package/src/services/data-sync-service/jobs/retry-failed-labor-tickets.ts +3 -4
- package/src/services/data-sync-service/jobs/run-migrations.ts +3 -4
- package/src/services/data-sync-service/jobs/to-erp.ts +8 -5
- package/src/services/data-sync-service/nats-labor-ticket-listener.ts +341 -0
- package/src/services/erp-api-services/errors.ts +3 -3
- package/src/services/erp-api-services/graphql/graphql-service.ts +5 -5
- package/src/services/erp-api-services/index.ts +8 -8
- package/src/services/erp-api-services/rest/rest-api-service.ts +4 -4
- package/src/services/erp-api-services/types.ts +2 -2
- package/src/services/mm-api-service/company-info.ts +87 -0
- package/src/services/mm-api-service/index.ts +14 -6
- package/src/services/mm-api-service/mm-api-service.ts +30 -13
- package/src/services/mm-api-service/token-mgr.ts +4 -4
- package/src/services/mm-api-service/types/entity-transformer.ts +3 -3
- package/src/services/mm-api-service/types/receive-types.ts +1 -0
- package/src/services/nats-service/nats-service.ts +351 -0
- package/src/services/nats-service/test-nats-subscriber.ts +96 -0
- package/src/services/psql-erp-service/index.ts +3 -3
- package/src/services/psql-erp-service/psql-service.ts +4 -4
- package/src/services/reporting-service/index.ts +1 -1
- package/src/services/reporting-service/logger.ts +81 -116
- package/src/services/sql-server-erp-service/index.ts +3 -3
- package/src/services/sql-server-erp-service/internal/sql-labor-ticket-operations.ts +2 -2
- package/src/services/sql-server-erp-service/internal/sql-transaction-manager.ts +1 -1
- package/src/services/sql-server-erp-service/sql-server-helpers.ts +6 -6
- package/src/services/sql-server-erp-service/sql-server-service.ts +4 -4
- package/src/services/sqlite-service/index.ts +1 -1
- package/src/services/sqlite-service/sqlite-coordinator.ts +2 -2
- package/src/types/erp-connector.ts +2 -9
- package/src/types/index.ts +2 -10
- package/src/utils/application-initializer.ts +5 -5
- package/src/utils/connector-factory.ts +2 -2
- package/src/utils/connector-log/log-deduper.ts +2 -2
- package/src/utils/connector-log/mm-connector-logger.ts +3 -3
- package/src/utils/erp-type-from-entity.ts +1 -1
- package/src/utils/error-formatter.ts +205 -0
- package/src/utils/http-client.ts +3 -2
- package/src/utils/index.ts +39 -38
- package/src/utils/local-data-store/database-lock.ts +1 -1
- package/src/utils/local-data-store/jobs-shared-data.ts +0 -2
- package/src/utils/mm-labor-ticket-helpers.ts +9 -12
- package/src/utils/removeExtraneousFields.ts +1 -1
- package/src/utils/removeIdFieldFromPayload.ts +1 -1
- package/src/utils/resource-group.ts +2 -2
- package/src/utils/standard-process-drivers/error-processor.ts +5 -5
- package/src/utils/standard-process-drivers/index.ts +3 -3
- package/src/utils/standard-process-drivers/labor-ticket-erp-synchronizer.ts +11 -16
- package/src/utils/standard-process-drivers/mm-entity-processor.ts +8 -14
- package/src/utils/standard-process-drivers/standard-process-drivers.ts +25 -39
- package/src/utils/time-utils.ts +3 -14
- package/src/utils/timezone.ts +2 -2
- package/dist/index.js +0 -48
- package/dist/index.js.map +0 -1
- package/dist/knexfile.js +0 -19
- package/dist/knexfile.js.map +0 -1
- package/dist/migrations/20241015162631_create_cache_table.d.ts +0 -4
- package/dist/migrations/20241015162631_create_cache_table.d.ts.map +0 -1
- package/dist/migrations/20241015162632_create_sdk_cache_table.d.ts +0 -4
- package/dist/migrations/20241015162632_create_sdk_cache_table.d.ts.map +0 -1
- package/dist/migrations/20250103162631_create_record_tracking_table.d.ts +0 -4
- package/dist/migrations/20250103162631_create_record_tracking_table.d.ts.map +0 -1
- package/dist/services/caching-service/batch-cache-manager.js +0 -84
- package/dist/services/caching-service/batch-cache-manager.js.map +0 -1
- package/dist/services/caching-service/hashed-cache-manager.js +0 -223
- package/dist/services/caching-service/hashed-cache-manager.js.map +0 -1
- package/dist/services/caching-service/index.js +0 -2
- package/dist/services/caching-service/index.js.map +0 -1
- package/dist/services/caching-service/record-tracking-manager.js +0 -28
- package/dist/services/caching-service/record-tracking-manager.js.map +0 -1
- package/dist/services/data-sync-service/configuration-manager.js +0 -163
- package/dist/services/data-sync-service/configuration-manager.js.map +0 -1
- package/dist/services/data-sync-service/data-sync-service.js +0 -95
- package/dist/services/data-sync-service/data-sync-service.js.map +0 -1
- package/dist/services/data-sync-service/index.js +0 -10
- package/dist/services/data-sync-service/index.js.map +0 -1
- package/dist/services/erp-api-services/errors.js +0 -83
- package/dist/services/erp-api-services/errors.js.map +0 -1
- package/dist/services/erp-api-services/graphql/graphql-service.js +0 -102
- package/dist/services/erp-api-services/graphql/graphql-service.js.map +0 -1
- package/dist/services/erp-api-services/graphql/types.js +0 -6
- package/dist/services/erp-api-services/graphql/types.js.map +0 -1
- package/dist/services/erp-api-services/index.js +0 -13
- package/dist/services/erp-api-services/index.js.map +0 -1
- package/dist/services/erp-api-services/oauth-client.js +0 -41
- package/dist/services/erp-api-services/oauth-client.js.map +0 -1
- package/dist/services/erp-api-services/rest/get-query-params.js +0 -23
- package/dist/services/erp-api-services/rest/get-query-params.js.map +0 -1
- package/dist/services/erp-api-services/rest/rest-api-service.js +0 -163
- package/dist/services/erp-api-services/rest/rest-api-service.js.map +0 -1
- package/dist/services/erp-api-services/types.js +0 -2
- package/dist/services/erp-api-services/types.js.map +0 -1
- package/dist/services/mm-api-service/index.js +0 -15
- package/dist/services/mm-api-service/index.js.map +0 -1
- package/dist/services/mm-api-service/mm-api-service.js +0 -519
- package/dist/services/mm-api-service/mm-api-service.js.map +0 -1
- package/dist/services/mm-api-service/token-mgr.js +0 -113
- package/dist/services/mm-api-service/token-mgr.js.map +0 -1
- package/dist/services/mm-api-service/types/checkpoint.js +0 -2
- package/dist/services/mm-api-service/types/checkpoint.js.map +0 -1
- package/dist/services/mm-api-service/types/entity-transformer.js +0 -186
- package/dist/services/mm-api-service/types/entity-transformer.js.map +0 -1
- package/dist/services/mm-api-service/types/mm-response-interfaces.js +0 -34
- package/dist/services/mm-api-service/types/mm-response-interfaces.js.map +0 -1
- package/dist/services/mm-api-service/types/receive-types.js +0 -55
- package/dist/services/mm-api-service/types/receive-types.js.map +0 -1
- package/dist/services/mm-api-service/types/send-types.js +0 -337
- package/dist/services/mm-api-service/types/send-types.js.map +0 -1
- package/dist/services/psql-erp-service/configuration.js +0 -2
- package/dist/services/psql-erp-service/configuration.js.map +0 -1
- package/dist/services/psql-erp-service/index.js +0 -10
- package/dist/services/psql-erp-service/index.js.map +0 -1
- package/dist/services/psql-erp-service/internal/types/psql-types.js +0 -5
- package/dist/services/psql-erp-service/internal/types/psql-types.js.map +0 -1
- package/dist/services/psql-erp-service/psql-helpers.js +0 -99
- package/dist/services/psql-erp-service/psql-helpers.js.map +0 -1
- package/dist/services/psql-erp-service/psql-service.js +0 -187
- package/dist/services/psql-erp-service/psql-service.js.map +0 -1
- package/dist/services/reporting-service/index.js +0 -5
- package/dist/services/reporting-service/index.js.map +0 -1
- package/dist/services/reporting-service/logger.js +0 -221
- package/dist/services/reporting-service/logger.js.map +0 -1
- package/dist/services/sql-server-erp-service/configuration.js +0 -2
- package/dist/services/sql-server-erp-service/configuration.js.map +0 -1
- package/dist/services/sql-server-erp-service/index.js +0 -11
- package/dist/services/sql-server-erp-service/index.js.map +0 -1
- package/dist/services/sql-server-erp-service/internal/sql-labor-ticket-operations.js +0 -50
- package/dist/services/sql-server-erp-service/internal/sql-labor-ticket-operations.js.map +0 -1
- package/dist/services/sql-server-erp-service/internal/sql-server-config.js +0 -40
- package/dist/services/sql-server-erp-service/internal/sql-server-config.js.map +0 -1
- package/dist/services/sql-server-erp-service/internal/sql-transaction-manager.js +0 -36
- package/dist/services/sql-server-erp-service/internal/sql-transaction-manager.js.map +0 -1
- package/dist/services/sql-server-erp-service/internal/types/sql-server-types.js +0 -2
- package/dist/services/sql-server-erp-service/internal/types/sql-server-types.js.map +0 -1
- package/dist/services/sql-server-erp-service/sql-server-helpers.js +0 -66
- package/dist/services/sql-server-erp-service/sql-server-helpers.js.map +0 -1
- package/dist/services/sql-server-erp-service/sql-server-service.js +0 -154
- package/dist/services/sql-server-erp-service/sql-server-service.js.map +0 -1
- package/dist/services/sql-server-erp-service/types/sql-input-param.js +0 -2
- package/dist/services/sql-server-erp-service/types/sql-input-param.js.map +0 -1
- package/dist/services/sqlite-service/index.js +0 -2
- package/dist/services/sqlite-service/index.js.map +0 -1
- package/dist/services/sqlite-service/sqlite-coordinator.js +0 -60
- package/dist/services/sqlite-service/sqlite-coordinator.js.map +0 -1
- package/dist/types/erp-connector.js +0 -2
- package/dist/types/erp-connector.js.map +0 -1
- package/dist/types/erp-types.js +0 -13
- package/dist/types/erp-types.js.map +0 -1
- package/dist/types/flattened-work-order.d.ts +0 -99
- package/dist/types/flattened-work-order.d.ts.map +0 -1
- package/dist/types/flattened-work-order.js +0 -2
- package/dist/types/flattened-work-order.js.map +0 -1
- package/dist/types/index.js +0 -6
- package/dist/types/index.js.map +0 -1
- package/dist/utils/application-initializer.js +0 -55
- package/dist/utils/application-initializer.js.map +0 -1
- package/dist/utils/cleanup-numbers.js +0 -6
- package/dist/utils/cleanup-numbers.js.map +0 -1
- package/dist/utils/connector-factory.js +0 -34
- package/dist/utils/connector-factory.js.map +0 -1
- package/dist/utils/connector-log/log-deduper.js +0 -240
- package/dist/utils/connector-log/log-deduper.js.map +0 -1
- package/dist/utils/connector-log/mm-connector-logger-example.js +0 -88
- package/dist/utils/connector-log/mm-connector-logger-example.js.map +0 -1
- package/dist/utils/connector-log/mm-connector-logger.js +0 -151
- package/dist/utils/connector-log/mm-connector-logger.js.map +0 -1
- package/dist/utils/data-transformation.js +0 -38
- package/dist/utils/data-transformation.js.map +0 -1
- package/dist/utils/env.d.ts +0 -8
- package/dist/utils/env.d.ts.map +0 -1
- package/dist/utils/env.js +0 -58
- package/dist/utils/env.js.map +0 -1
- package/dist/utils/erp-timezone-utils.d.ts +0 -20
- package/dist/utils/erp-timezone-utils.d.ts.map +0 -1
- package/dist/utils/erp-timezone-utils.js +0 -75
- package/dist/utils/erp-timezone-utils.js.map +0 -1
- package/dist/utils/erp-type-from-entity.js +0 -6
- package/dist/utils/erp-type-from-entity.js.map +0 -1
- package/dist/utils/error-utils.js +0 -21
- package/dist/utils/error-utils.js.map +0 -1
- package/dist/utils/http-client.js +0 -186
- package/dist/utils/http-client.js.map +0 -1
- package/dist/utils/index.js +0 -66
- package/dist/utils/index.js.map +0 -1
- package/dist/utils/local-data-store/database-lock.js +0 -68
- package/dist/utils/local-data-store/database-lock.js.map +0 -1
- package/dist/utils/local-data-store/jobs-shared-data.js +0 -118
- package/dist/utils/local-data-store/jobs-shared-data.js.map +0 -1
- package/dist/utils/mm-labor-ticket-helpers.js +0 -28
- package/dist/utils/mm-labor-ticket-helpers.js.map +0 -1
- package/dist/utils/removeExtraneousFields.js +0 -16
- package/dist/utils/removeExtraneousFields.js.map +0 -1
- package/dist/utils/removeIdFieldFromPayload.js +0 -16
- package/dist/utils/removeIdFieldFromPayload.js.map +0 -1
- package/dist/utils/resource-group.js +0 -59
- package/dist/utils/resource-group.js.map +0 -1
- package/dist/utils/standard-process-drivers/error-processor.js +0 -262
- package/dist/utils/standard-process-drivers/error-processor.js.map +0 -1
- package/dist/utils/standard-process-drivers/index.js +0 -4
- package/dist/utils/standard-process-drivers/index.js.map +0 -1
- package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.js +0 -173
- package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.js.map +0 -1
- package/dist/utils/standard-process-drivers/mm-entity-processor.js +0 -174
- package/dist/utils/standard-process-drivers/mm-entity-processor.js.map +0 -1
- package/dist/utils/standard-process-drivers/standard-process-drivers.js +0 -333
- package/dist/utils/standard-process-drivers/standard-process-drivers.js.map +0 -1
- package/dist/utils/time-utils.js +0 -103
- package/dist/utils/time-utils.js.map +0 -1
- package/dist/utils/timezone.js +0 -105
- package/dist/utils/timezone.js.map +0 -1
- package/dist/utils/trimObjectValues.js +0 -11
- package/dist/utils/trimObjectValues.js.map +0 -1
- package/dist/utils/uniqueRows.js +0 -35
- package/dist/utils/uniqueRows.js.map +0 -1
- package/src/types/flattened-work-order.ts +0 -108
- package/src/utils/env.ts +0 -75
- package/src/utils/erp-timezone-utils.ts +0 -99
|
@@ -1,37 +1,8 @@
|
|
|
1
1
|
import { createLogger, format, transports } from "winston";
|
|
2
2
|
import DailyRotateFile from "winston-daily-rotate-file";
|
|
3
3
|
import path from "path";
|
|
4
|
-
import { getEnvString } from "../../utils/env.js"; // Utility function to get environment variables with default values and validation
|
|
5
4
|
|
|
6
5
|
const logDirectory = "logs";
|
|
7
|
-
const initialLogLevel = getEnvString("LOG_LEVEL", "info");
|
|
8
|
-
const initialNodeEnv = getEnvString("NODE_ENV", "development");
|
|
9
|
-
|
|
10
|
-
const LOGGER_ERROR_PREFIX = "[mm-erp-sdk logger]";
|
|
11
|
-
|
|
12
|
-
const serializeLoggerError = (error: unknown): string => {
|
|
13
|
-
if (error instanceof Error) {
|
|
14
|
-
return error.stack ?? error.message;
|
|
15
|
-
}
|
|
16
|
-
if (typeof error === "string") {
|
|
17
|
-
return error;
|
|
18
|
-
}
|
|
19
|
-
try {
|
|
20
|
-
return JSON.stringify(error);
|
|
21
|
-
} catch {
|
|
22
|
-
return String(error);
|
|
23
|
-
}
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
const handleLoggerError = (error: unknown) => {
|
|
27
|
-
const serialized = serializeLoggerError(error);
|
|
28
|
-
try {
|
|
29
|
-
// eslint-disable-next-line no-console
|
|
30
|
-
console.error(`${LOGGER_ERROR_PREFIX} transport error: ${serialized}`);
|
|
31
|
-
} catch {
|
|
32
|
-
/* ignore failures when reporting logger errors */
|
|
33
|
-
}
|
|
34
|
-
};
|
|
35
6
|
|
|
36
7
|
const MSG_MAX_LEN = 60;
|
|
37
8
|
const MSG_MAX_CHARS = 2048;
|
|
@@ -52,8 +23,45 @@ const truncateString = (str: string): string => {
|
|
|
52
23
|
return result;
|
|
53
24
|
};
|
|
54
25
|
|
|
26
|
+
/**
|
|
27
|
+
* Safe JSON serializer that handles circular references and extracts meaningful error data
|
|
28
|
+
*/
|
|
29
|
+
const safeStringify = (obj: any, indent: number = 2): string => {
|
|
30
|
+
const seen = new WeakSet();
|
|
31
|
+
|
|
32
|
+
return JSON.stringify(
|
|
33
|
+
obj,
|
|
34
|
+
(key, value) => {
|
|
35
|
+
// Handle Error objects specially
|
|
36
|
+
if (value instanceof Error) {
|
|
37
|
+
return {
|
|
38
|
+
message: value.message,
|
|
39
|
+
name: value.name,
|
|
40
|
+
stack: value.stack,
|
|
41
|
+
...(value.constructor.name === 'HTTPError' || value.constructor.name === 'AxiosError' ? {
|
|
42
|
+
status: (value as any).status,
|
|
43
|
+
code: (value as any).code,
|
|
44
|
+
data: (value as any).data,
|
|
45
|
+
} : {}),
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Handle circular references
|
|
50
|
+
if (typeof value === "object" && value !== null) {
|
|
51
|
+
if (seen.has(value)) {
|
|
52
|
+
return "[Circular]";
|
|
53
|
+
}
|
|
54
|
+
seen.add(value);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return value;
|
|
58
|
+
},
|
|
59
|
+
indent
|
|
60
|
+
);
|
|
61
|
+
};
|
|
62
|
+
|
|
55
63
|
const baseFormat = format.printf(({ timestamp, level, message, ...rest }) => {
|
|
56
|
-
let restString =
|
|
64
|
+
let restString = safeStringify(rest, 2);
|
|
57
65
|
restString = restString === "{}" ? "" : restString;
|
|
58
66
|
|
|
59
67
|
let formattedMessage: string;
|
|
@@ -89,31 +97,25 @@ const logFormat = format.combine(
|
|
|
89
97
|
baseFormat
|
|
90
98
|
);
|
|
91
99
|
|
|
92
|
-
const createConsoleTransport = () => {
|
|
93
|
-
const consoleTransport = new transports.Console({
|
|
94
|
-
format: format.combine(
|
|
95
|
-
format.timestamp(),
|
|
96
|
-
format.splat(),
|
|
97
|
-
baseFormat,
|
|
98
|
-
format.colorize({ all: true })
|
|
99
|
-
),
|
|
100
|
-
});
|
|
101
|
-
consoleTransport.on("error", handleLoggerError);
|
|
102
|
-
return consoleTransport;
|
|
103
|
-
};
|
|
104
|
-
|
|
105
100
|
// Create a basic logger with default configuration
|
|
106
101
|
const logger = createLogger({
|
|
107
|
-
level:
|
|
102
|
+
level: process.env.LOG_LEVEL || "info",
|
|
108
103
|
format: logFormat,
|
|
109
|
-
transports: [
|
|
104
|
+
transports: [
|
|
105
|
+
new transports.Console({
|
|
106
|
+
format: format.combine(
|
|
107
|
+
format.timestamp(),
|
|
108
|
+
format.splat(),
|
|
109
|
+
baseFormat,
|
|
110
|
+
format.colorize({ all: true })
|
|
111
|
+
),
|
|
112
|
+
}),
|
|
113
|
+
],
|
|
110
114
|
});
|
|
111
115
|
|
|
112
|
-
logger.on("error", handleLoggerError);
|
|
113
|
-
|
|
114
116
|
// Helper function to create a file transport with shared configuration
|
|
115
117
|
const createFileTransport = (): DailyRotateFile => {
|
|
116
|
-
|
|
118
|
+
return new DailyRotateFile({
|
|
117
119
|
filename: path.join(logDirectory, "%DATE%.log"),
|
|
118
120
|
datePattern: "YYYY-MM-DD",
|
|
119
121
|
zippedArchive: true,
|
|
@@ -121,8 +123,6 @@ const createFileTransport = (): DailyRotateFile => {
|
|
|
121
123
|
maxFiles: "14d",
|
|
122
124
|
format: logFormat,
|
|
123
125
|
});
|
|
124
|
-
transport.on("error", handleLoggerError);
|
|
125
|
-
return transport;
|
|
126
126
|
};
|
|
127
127
|
|
|
128
128
|
// Rotate mitigation helper: attaches rotate handler to transport and recursively attaches to replacements
|
|
@@ -136,76 +136,35 @@ function attachRotateMitigation(
|
|
|
136
136
|
if (isRefreshing) return;
|
|
137
137
|
isRefreshing = true;
|
|
138
138
|
let removalTimer: NodeJS.Timeout | null = null;
|
|
139
|
-
let next: DailyRotateFile | null = null;
|
|
140
139
|
|
|
141
|
-
|
|
140
|
+
// Create replacement first to avoid any logging gap
|
|
141
|
+
const next = createFileTransport();
|
|
142
|
+
// When the new file is created, remove the old transport
|
|
143
|
+
next.on("new", () => {
|
|
142
144
|
if (removalTimer) {
|
|
143
145
|
clearTimeout(removalTimer);
|
|
144
146
|
removalTimer = null;
|
|
145
147
|
}
|
|
148
|
+
try {
|
|
149
|
+
logger.remove(transport);
|
|
150
|
+
} catch {}
|
|
146
151
|
isRefreshing = false;
|
|
147
|
-
};
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
if (removalTimer) {
|
|
155
|
-
clearTimeout(removalTimer);
|
|
156
|
-
removalTimer = null;
|
|
157
|
-
}
|
|
158
|
-
try {
|
|
159
|
-
logger.remove(transport);
|
|
160
|
-
} catch (error) {
|
|
161
|
-
handleLoggerError(error);
|
|
162
|
-
}
|
|
163
|
-
cleanupRefresh();
|
|
164
|
-
});
|
|
165
|
-
attachRotateMitigation(next, opts);
|
|
152
|
+
});
|
|
153
|
+
attachRotateMitigation(next, opts);
|
|
154
|
+
logger.add(next);
|
|
155
|
+
|
|
156
|
+
// Fallback: if the "new" event doesn't fire, remove the old transport after a grace period
|
|
157
|
+
const REMOVAL_GRACE_MS = 30000;
|
|
158
|
+
removalTimer = setTimeout(() => {
|
|
166
159
|
try {
|
|
167
|
-
logger.
|
|
168
|
-
} catch
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
logger.remove(next);
|
|
173
|
-
} catch {}
|
|
174
|
-
try {
|
|
175
|
-
if (typeof next.close === "function") {
|
|
176
|
-
next.close();
|
|
177
|
-
}
|
|
178
|
-
} catch {}
|
|
179
|
-
return;
|
|
180
|
-
}
|
|
160
|
+
logger.remove(transport);
|
|
161
|
+
} catch {}
|
|
162
|
+
isRefreshing = false;
|
|
163
|
+
removalTimer = null;
|
|
164
|
+
}, REMOVAL_GRACE_MS);
|
|
181
165
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
removalTimer = setTimeout(() => {
|
|
185
|
-
try {
|
|
186
|
-
logger.remove(transport);
|
|
187
|
-
} catch (error) {
|
|
188
|
-
handleLoggerError(error);
|
|
189
|
-
}
|
|
190
|
-
cleanupRefresh();
|
|
191
|
-
}, REMOVAL_GRACE_MS);
|
|
192
|
-
|
|
193
|
-
// Keep console and other transports intact; do not silence or clear
|
|
194
|
-
logger.level = logLevel;
|
|
195
|
-
} catch (error) {
|
|
196
|
-
cleanupRefresh();
|
|
197
|
-
handleLoggerError(error);
|
|
198
|
-
if (next) {
|
|
199
|
-
try {
|
|
200
|
-
logger.remove(next);
|
|
201
|
-
} catch {}
|
|
202
|
-
try {
|
|
203
|
-
if (typeof next.close === "function") {
|
|
204
|
-
next.close();
|
|
205
|
-
}
|
|
206
|
-
} catch {}
|
|
207
|
-
}
|
|
208
|
-
}
|
|
166
|
+
// Keep console and other transports intact; do not silence or clear
|
|
167
|
+
logger.level = logLevel;
|
|
209
168
|
});
|
|
210
169
|
}
|
|
211
170
|
|
|
@@ -235,16 +194,22 @@ export const configureLogger = (logLevel: string, nodeEnv: string) => {
|
|
|
235
194
|
|
|
236
195
|
// Add console transport in non-production environments
|
|
237
196
|
if (nodeEnv !== "production") {
|
|
238
|
-
logger.add(
|
|
197
|
+
logger.add(
|
|
198
|
+
new transports.Console({
|
|
199
|
+
format: format.combine(
|
|
200
|
+
format.timestamp(),
|
|
201
|
+
format.splat(),
|
|
202
|
+
baseFormat,
|
|
203
|
+
format.colorize({ all: true })
|
|
204
|
+
),
|
|
205
|
+
})
|
|
206
|
+
);
|
|
239
207
|
}
|
|
240
208
|
|
|
241
209
|
// Set the log level
|
|
242
210
|
logger.level = logLevel;
|
|
243
211
|
};
|
|
244
212
|
|
|
245
|
-
// Ensure file logging is configured as soon as the module loads
|
|
246
|
-
configureLogger(initialLogLevel, initialNodeEnv);
|
|
247
|
-
|
|
248
213
|
// Add fatal method for Graceful compatibility
|
|
249
214
|
(logger as any).fatal = (err: any, meta?: any) => logger.error(err, meta);
|
|
250
215
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { SqlServerService } from "./sql-server-service
|
|
2
|
-
import { SqlServerHelper } from "./sql-server-helpers
|
|
3
|
-
import { SQLInput } from "./types/sql-input-param
|
|
1
|
+
import { SqlServerService } from "./sql-server-service";
|
|
2
|
+
import { SqlServerHelper } from "./sql-server-helpers";
|
|
3
|
+
import { SQLInput } from "./types/sql-input-param";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* A class to manage interactions with SQL Server
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import sql from "mssql";
|
|
2
|
-
import { SQLInput } from "../types/sql-input-param
|
|
3
|
-
import { SQLTransactionOperation } from "./sql-transaction-manager
|
|
2
|
+
import { SQLInput } from "../types/sql-input-param";
|
|
3
|
+
import { SQLTransactionOperation } from "./sql-transaction-manager";
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Insert a new labor ticket into the database.
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { SQLTransactionManager } from "./internal/sql-transaction-manager
|
|
1
|
+
import { SQLTransactionManager } from "./internal/sql-transaction-manager";
|
|
2
2
|
import {
|
|
3
3
|
SQLLaborTicketInsertOperation,
|
|
4
4
|
SQLLaborTicketUpdateOperation,
|
|
5
|
-
} from "./internal/sql-labor-ticket-operations
|
|
6
|
-
import { MMReceiveLaborTicket } from "../mm-api-service/types/receive-types
|
|
7
|
-
import { SqlServerService } from "./sql-server-service
|
|
8
|
-
import logger from "../reporting-service/logger
|
|
9
|
-
import { SQLInput } from "./types/sql-input-param
|
|
5
|
+
} from "./internal/sql-labor-ticket-operations";
|
|
6
|
+
import { MMReceiveLaborTicket } from "../mm-api-service/types/receive-types";
|
|
7
|
+
import { SqlServerService } from "./sql-server-service";
|
|
8
|
+
import logger from "../reporting-service/logger";
|
|
9
|
+
import { SQLInput } from "./types/sql-input-param";
|
|
10
10
|
|
|
11
11
|
export class SqlServerHelper {
|
|
12
12
|
/**
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import sql, { ConnectionPool, IRecordSet } from "mssql";
|
|
2
|
-
import { SQLServerConfigSchema } from "./internal/sql-server-config
|
|
3
|
-
import logger from "../reporting-service/logger
|
|
4
|
-
import { ERPResponse } from "../../types/erp-types
|
|
5
|
-
import { SQLServerConfiguration } from "./configuration
|
|
2
|
+
import { SQLServerConfigSchema } from "./internal/sql-server-config";
|
|
3
|
+
import logger from "../reporting-service/logger";
|
|
4
|
+
import { ERPResponse } from "../../types/erp-types";
|
|
5
|
+
import { SQLServerConfiguration } from "./configuration";
|
|
6
6
|
|
|
7
7
|
type PagingParams = {
|
|
8
8
|
limit?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export { SQLiteCoordinator } from "./sqlite-coordinator
|
|
1
|
+
export { SQLiteCoordinator } from "./sqlite-coordinator";
|
|
@@ -2,8 +2,8 @@ import {
|
|
|
2
2
|
acquireDatabaseLock,
|
|
3
3
|
releaseDatabaseLock,
|
|
4
4
|
getDatabaseLock,
|
|
5
|
-
} from "../../utils/local-data-store/database-lock
|
|
6
|
-
import { logger } from "../reporting-service
|
|
5
|
+
} from "../../utils/local-data-store/database-lock";
|
|
6
|
+
import { logger } from "../reporting-service";
|
|
7
7
|
|
|
8
8
|
export class SQLiteCoordinator {
|
|
9
9
|
private static readonly LOCK_TIMEOUT_MS = 30_000; // 30 seconds
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { MMReceiveLaborTicket } from "../services/mm-api-service/types/receive-types
|
|
1
|
+
import { MMReceiveLaborTicket } from "../services/mm-api-service/types/receive-types";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Interface for ERP connectors.
|
|
@@ -14,10 +14,6 @@ export interface IERPConnector {
|
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
16
|
* Sync data from the ERP system to MM.
|
|
17
|
-
* Timezone expectations:
|
|
18
|
-
* - When sending ERP data to MachineMetrics (e.g., via StandardProcessDrivers or MMEntityProcessor),
|
|
19
|
-
* connectors MUST convert all datetime fields to ISO-8601 UTC strings (trailing `Z` or explicit offset)
|
|
20
|
-
* before invoking SDK helpers. The SDK validates/forwards these values but does not apply timezone shifts.
|
|
21
17
|
*/
|
|
22
18
|
syncFromERP(): Promise<void>;
|
|
23
19
|
syncFromERPCompleted(): Promise<void>;
|
|
@@ -35,16 +31,13 @@ export interface IERPConnector {
|
|
|
35
31
|
retryFailedLaborTicketsCompleted(): Promise<void>;
|
|
36
32
|
|
|
37
33
|
/**
|
|
38
|
-
* Start the connector. Typically a connector should delegate control to the data-sync-service
|
|
34
|
+
* Start the connector. Typically a connector should delegate control to the data-sync-service.
|
|
39
35
|
*/
|
|
40
36
|
startUp(): Promise<void>;
|
|
41
37
|
}
|
|
42
38
|
|
|
43
39
|
/**
|
|
44
40
|
* Interface for standard process methods that call ERP connectors back to create or update labor tickets.
|
|
45
|
-
*
|
|
46
|
-
* Timestamp fields on `MMReceiveLaborTicket` objects have already been converted by the SDKfrom MM's
|
|
47
|
-
* UTC API responses into the ERP's local timezone, based on the company's timezone setting.
|
|
48
41
|
*/
|
|
49
42
|
export interface IERPLaborTicketHandler {
|
|
50
43
|
createLaborTicketInERP(
|
package/src/types/index.ts
CHANGED
|
@@ -3,18 +3,10 @@
|
|
|
3
3
|
* This file re-exports all type definitions that are part of the public API.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
export type { IERPConnector } from "./erp-connector
|
|
6
|
+
export type { IERPConnector } from "./erp-connector";
|
|
7
7
|
export type {
|
|
8
8
|
ERPObjType,
|
|
9
9
|
ERPPagination,
|
|
10
10
|
ERPResponse,
|
|
11
11
|
ERPObject,
|
|
12
|
-
} from "./erp-types
|
|
13
|
-
export type {
|
|
14
|
-
FlattenedWorkOrderRow,
|
|
15
|
-
FlattenedWorkOrderRowBase,
|
|
16
|
-
FlattenedWorkOrderPartFields,
|
|
17
|
-
FlattenedWorkOrderPartOperationFields,
|
|
18
|
-
FlattenedWorkOrderFields,
|
|
19
|
-
FlattenedWorkOrderOperationFields,
|
|
20
|
-
} from "./flattened-work-order.js";
|
|
12
|
+
} from "./erp-types";
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import logger from "../services/reporting-service/logger
|
|
2
|
-
import { CoreConfiguration } from "../services/data-sync-service/configuration-manager
|
|
3
|
-
import { SQLiteCoordinator } from "../services/sqlite-service
|
|
4
|
-
import { getTimezoneOffsetAndPersist } from "./time-utils
|
|
1
|
+
import logger from "../services/reporting-service/logger";
|
|
2
|
+
import { CoreConfiguration } from "../services/data-sync-service/configuration-manager";
|
|
3
|
+
import { SQLiteCoordinator } from "../services/sqlite-service";
|
|
4
|
+
import { getTimezoneOffsetAndPersist } from "./time-utils";
|
|
5
5
|
import knex from "knex";
|
|
6
|
-
import config from "../knexfile
|
|
6
|
+
import config from "../knexfile";
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Utility class to handle application initialization tasks
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { IERPConnector } from "../types/erp-connector
|
|
2
|
-
import logger from "../services/reporting-service/logger
|
|
1
|
+
import { IERPConnector } from "../types/erp-connector";
|
|
2
|
+
import logger from "../services/reporting-service/logger";
|
|
3
3
|
import { pathToFileURL } from "url";
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import fs from 'fs';
|
|
2
2
|
import path from 'path';
|
|
3
|
-
import logger from '../../services/reporting-service/logger
|
|
4
|
-
import type { LogEntry, LogLevelString } from './mm-connector-logger
|
|
3
|
+
import logger from '../../services/reporting-service/logger';
|
|
4
|
+
import type { LogEntry, LogLevelString } from './mm-connector-logger';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Implement a custom LogDeduper or use the provided FileLogDeduper
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { MMApiClient } from '../../services/mm-api-service/mm-api-service
|
|
2
|
-
import logger from '../../services/reporting-service/logger
|
|
3
|
-
import type { LogDeduper } from './log-deduper
|
|
1
|
+
import { MMApiClient } from '../../services/mm-api-service/mm-api-service';
|
|
2
|
+
import logger from '../../services/reporting-service/logger';
|
|
3
|
+
import type { LogDeduper } from './log-deduper';
|
|
4
4
|
|
|
5
5
|
export type LogLevelString = 'info' | 'warn' | 'error';
|
|
6
6
|
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Error formatter utility for standardizing error messages across connectors
|
|
3
|
+
* Extracts human-readable messages from various error types (axios, custom errors, etc.)
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export interface FormattedError {
|
|
7
|
+
message: string;
|
|
8
|
+
code: string;
|
|
9
|
+
httpStatus?: number;
|
|
10
|
+
metadata?: Record<string, any>;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Extract meaningful error message from various error types
|
|
15
|
+
*/
|
|
16
|
+
export function formatError(error: any): FormattedError {
|
|
17
|
+
if (!error) {
|
|
18
|
+
return {
|
|
19
|
+
message: 'Unknown error occurred',
|
|
20
|
+
code: 'UNKNOWN_ERROR',
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Handle axios errors FIRST (before checking for FormattedError)
|
|
25
|
+
// because axios errors also have message and code properties
|
|
26
|
+
if (error.isAxiosError || error.name === 'AxiosError') {
|
|
27
|
+
return formatAxiosError(error);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// If it's already a FormattedError, return as-is
|
|
31
|
+
// Check for httpStatus or metadata to distinguish from axios errors
|
|
32
|
+
if (error.message && error.code && typeof error.message === 'string' && typeof error.code === 'string' && !error.config) {
|
|
33
|
+
return error as FormattedError;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Handle standard Error objects
|
|
37
|
+
if (error instanceof Error) {
|
|
38
|
+
return {
|
|
39
|
+
message: error.message || 'An error occurred',
|
|
40
|
+
code: 'ERROR',
|
|
41
|
+
metadata: {
|
|
42
|
+
name: error.name,
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Handle string errors
|
|
48
|
+
if (typeof error === 'string') {
|
|
49
|
+
return {
|
|
50
|
+
message: error,
|
|
51
|
+
code: 'ERROR',
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Last resort: try to extract any useful info
|
|
56
|
+
const message = error.message || error.toString?.() || 'Unknown error occurred';
|
|
57
|
+
return {
|
|
58
|
+
message: typeof message === 'string' ? message : JSON.stringify(message),
|
|
59
|
+
code: error.code || 'UNKNOWN_ERROR',
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Format axios-specific errors with detailed context
|
|
65
|
+
*/
|
|
66
|
+
function formatAxiosError(error: any): FormattedError {
|
|
67
|
+
const httpStatus = error.response?.status;
|
|
68
|
+
const method = error.config?.method?.toUpperCase();
|
|
69
|
+
const url = error.config?.url;
|
|
70
|
+
|
|
71
|
+
// First check if connector already extracted the message
|
|
72
|
+
let message = error._extractedMessage;
|
|
73
|
+
|
|
74
|
+
// If not, try to extract from response data
|
|
75
|
+
if (!message) {
|
|
76
|
+
const extractedMessage = extractErrorMessage(error.response?.data);
|
|
77
|
+
message = extractedMessage || error.response?.statusText || error.message || 'Request failed';
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Determine error code based on status
|
|
81
|
+
const code = categorizeHttpError(httpStatus);
|
|
82
|
+
|
|
83
|
+
const metadata: Record<string, any> = {
|
|
84
|
+
method,
|
|
85
|
+
url,
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
// Add additional context for specific error types
|
|
89
|
+
if (httpStatus === 401 || httpStatus === 403) {
|
|
90
|
+
metadata.hint = 'Check authentication credentials';
|
|
91
|
+
} else if (httpStatus === 404) {
|
|
92
|
+
metadata.hint = 'Resource not found - check endpoint URL';
|
|
93
|
+
} else if (httpStatus && httpStatus >= 500) {
|
|
94
|
+
metadata.hint = 'ERP system may be temporarily unavailable';
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
return {
|
|
98
|
+
message,
|
|
99
|
+
code,
|
|
100
|
+
httpStatus,
|
|
101
|
+
metadata,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Extract meaningful error message from response data
|
|
107
|
+
* Handles various ERP-specific response formats
|
|
108
|
+
*/
|
|
109
|
+
function extractErrorMessage(data: any): string | null {
|
|
110
|
+
if (!data) return null;
|
|
111
|
+
|
|
112
|
+
// Common error message fields across different ERPs
|
|
113
|
+
const possibleFields = [
|
|
114
|
+
'ErrorMessage', // Epicor
|
|
115
|
+
'error.message', // Common REST format
|
|
116
|
+
'error', // Simple format
|
|
117
|
+
'Message', // .NET style
|
|
118
|
+
'message', // JavaScript style
|
|
119
|
+
'errorMessage', // Camel case
|
|
120
|
+
'error_message', // Snake case
|
|
121
|
+
'errors[0].message', // Array of errors
|
|
122
|
+
'title', // Problem details format
|
|
123
|
+
'detail', // Problem details format
|
|
124
|
+
];
|
|
125
|
+
|
|
126
|
+
for (const field of possibleFields) {
|
|
127
|
+
const value = getNestedValue(data, field);
|
|
128
|
+
if (value && typeof value === 'string') {
|
|
129
|
+
return value;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// If data is a string, return it
|
|
134
|
+
if (typeof data === 'string') {
|
|
135
|
+
// Try to parse as JSON first
|
|
136
|
+
try {
|
|
137
|
+
const parsed = JSON.parse(data);
|
|
138
|
+
return extractErrorMessage(parsed);
|
|
139
|
+
} catch {
|
|
140
|
+
return data;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Get nested value from object using dot notation
|
|
149
|
+
*/
|
|
150
|
+
function getNestedValue(obj: any, path: string): any {
|
|
151
|
+
const parts = path.split('.');
|
|
152
|
+
let current = obj;
|
|
153
|
+
|
|
154
|
+
for (const part of parts) {
|
|
155
|
+
// Handle array notation like 'errors[0]'
|
|
156
|
+
const arrayMatch = part.match(/(\w+)\[(\d+)\]/);
|
|
157
|
+
if (arrayMatch) {
|
|
158
|
+
const [, key, index] = arrayMatch;
|
|
159
|
+
current = current?.[key]?.[parseInt(index, 10)];
|
|
160
|
+
} else {
|
|
161
|
+
current = current?.[part];
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
if (current === undefined || current === null) {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return current;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Categorize HTTP errors into standard codes
|
|
174
|
+
*/
|
|
175
|
+
function categorizeHttpError(status?: number): string {
|
|
176
|
+
if (!status) return 'NETWORK_ERROR';
|
|
177
|
+
|
|
178
|
+
if (status === 400) return 'VALIDATION_ERROR';
|
|
179
|
+
if (status === 401) return 'AUTHENTICATION_ERROR';
|
|
180
|
+
if (status === 403) return 'AUTHORIZATION_ERROR';
|
|
181
|
+
if (status === 404) return 'NOT_FOUND';
|
|
182
|
+
if (status === 409) return 'CONFLICT';
|
|
183
|
+
if (status === 422) return 'VALIDATION_ERROR';
|
|
184
|
+
if (status === 429) return 'RATE_LIMIT';
|
|
185
|
+
if (status >= 500) return 'ERP_SERVER_ERROR';
|
|
186
|
+
if (status >= 400) return 'CLIENT_ERROR';
|
|
187
|
+
|
|
188
|
+
return 'HTTP_ERROR';
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Format error for logging (shorter, cleaner version)
|
|
193
|
+
*/
|
|
194
|
+
export function formatErrorForLogging(error: any): string {
|
|
195
|
+
const formatted = formatError(error);
|
|
196
|
+
|
|
197
|
+
let message = `[${formatted.code}] ${formatted.message}`;
|
|
198
|
+
|
|
199
|
+
if (formatted.httpStatus) {
|
|
200
|
+
message = `[${formatted.httpStatus}] ${message}`;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
return message;
|
|
204
|
+
}
|
|
205
|
+
|
package/src/utils/http-client.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import axios, { AxiosError, AxiosInstance, AxiosRequestConfig } from "axios";
|
|
2
|
-
import logger from "../services/reporting-service/logger
|
|
2
|
+
import logger from "../services/reporting-service/logger";
|
|
3
3
|
|
|
4
4
|
export class HTTPError extends Error {
|
|
5
5
|
constructor(
|
|
@@ -64,9 +64,10 @@ class AxiosClient implements HTTPClient {
|
|
|
64
64
|
* It can be convenient to set `baseURL` for an instance of axios to pass relative URLs to methods of that instance.
|
|
65
65
|
*/
|
|
66
66
|
constructor(baseUrl: string, retryAttempts: number) {
|
|
67
|
+
const timeout = parseInt(process.env.MM_API_TIMEOUT || "30000");
|
|
67
68
|
this.client = axios.create({
|
|
68
69
|
baseURL: baseUrl,
|
|
69
|
-
timeout:
|
|
70
|
+
timeout: timeout,
|
|
70
71
|
headers: {
|
|
71
72
|
"Content-Type": "application/json",
|
|
72
73
|
},
|