@machinemetrics/mm-erp-sdk 0.1.9 → 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.js +39 -40
- 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 +36 -48
- package/dist/services/data-sync-service/jobs/from-erp.js.map +1 -1
- package/dist/services/data-sync-service/jobs/retry-failed-labor-tickets.js +35 -36
- package/dist/services/data-sync-service/jobs/retry-failed-labor-tickets.js.map +1 -1
- package/dist/services/data-sync-service/jobs/run-migrations.js +21 -22
- 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 +45 -48
- 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 +1 -1
- package/dist/types/erp-connector.d.ts.map +1 -1
- package/dist/types/index.d.ts +2 -2
- 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 -33
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/mm-labor-ticket-helpers.d.ts +1 -1
- 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 +4 -4
- 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 +4 -4
- package/dist/utils/standard-process-drivers/standard-process-drivers.d.ts.map +1 -1
- package/package.json +10 -6
- 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 +2 -2
- 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 +3 -3
- package/src/services/data-sync-service/jobs/from-erp.ts +5 -10
- package/src/services/data-sync-service/jobs/retry-failed-labor-tickets.ts +2 -2
- package/src/services/data-sync-service/jobs/run-migrations.ts +2 -2
- package/src/services/data-sync-service/jobs/to-erp.ts +7 -3
- 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 +29 -12
- 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 -111
- 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 +1 -1
- package/src/types/index.ts +2 -2
- 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 -33
- package/src/utils/local-data-store/database-lock.ts +1 -1
- package/src/utils/mm-labor-ticket-helpers.ts +2 -2
- 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 +6 -6
- package/src/utils/standard-process-drivers/mm-entity-processor.ts +7 -7
- package/src/utils/standard-process-drivers/standard-process-drivers.ts +6 -6
- package/src/utils/time-utils.ts +3 -3
- 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 -217
- 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/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/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 -65
- 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 -116
- package/dist/utils/local-data-store/jobs-shared-data.js.map +0 -1
- package/dist/utils/mm-labor-ticket-helpers.js +0 -23
- 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 -164
- 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 -168
- package/dist/utils/standard-process-drivers/mm-entity-processor.js.map +0 -1
- package/dist/utils/standard-process-drivers/standard-process-drivers.js +0 -324
- package/dist/utils/standard-process-drivers/standard-process-drivers.js.map +0 -1
- package/dist/utils/time-utils.js +0 -96
- 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
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { PsqlService } from "./psql-service
|
|
1
|
+
import { PsqlService } from "./psql-service";
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* A class to manage interactions with PSQL (Pervasive) databases via ODBC
|
|
@@ -8,7 +8,7 @@ export { PsqlService };
|
|
|
8
8
|
/**
|
|
9
9
|
* Configuration interface for PSQL connections
|
|
10
10
|
*/
|
|
11
|
-
export type { PsqlConfiguration } from "./configuration
|
|
11
|
+
export type { PsqlConfiguration } from "./configuration";
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* Helper functions for PSQL data formatting
|
|
@@ -19,4 +19,4 @@ export {
|
|
|
19
19
|
combinePsqlDateTime,
|
|
20
20
|
isPsqlDateEmpty,
|
|
21
21
|
cleanPsqlCharField,
|
|
22
|
-
} from "./psql-helpers
|
|
22
|
+
} from "./psql-helpers";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { PsqlConfiguration } from "./configuration
|
|
2
|
-
import { ERPResponse } from "../../types/erp-types
|
|
3
|
-
import { OdbcErrorResponse } from "./internal/types/psql-types
|
|
4
|
-
import logger from "../reporting-service/logger
|
|
1
|
+
import { PsqlConfiguration } from "./configuration";
|
|
2
|
+
import { ERPResponse } from "../../types/erp-types";
|
|
3
|
+
import { OdbcErrorResponse } from "./internal/types/psql-types";
|
|
4
|
+
import logger from "../reporting-service/logger";
|
|
5
5
|
|
|
6
6
|
type PagingParams = {
|
|
7
7
|
limit?: number;
|
|
@@ -3,33 +3,6 @@ import DailyRotateFile from "winston-daily-rotate-file";
|
|
|
3
3
|
import path from "path";
|
|
4
4
|
|
|
5
5
|
const logDirectory = "logs";
|
|
6
|
-
const initialLogLevel = process.env.LOG_LEVEL || "info";
|
|
7
|
-
|
|
8
|
-
const LOGGER_ERROR_PREFIX = "[mm-erp-sdk logger]";
|
|
9
|
-
|
|
10
|
-
const serializeLoggerError = (error: unknown): string => {
|
|
11
|
-
if (error instanceof Error) {
|
|
12
|
-
return error.stack ?? error.message;
|
|
13
|
-
}
|
|
14
|
-
if (typeof error === "string") {
|
|
15
|
-
return error;
|
|
16
|
-
}
|
|
17
|
-
try {
|
|
18
|
-
return JSON.stringify(error);
|
|
19
|
-
} catch {
|
|
20
|
-
return String(error);
|
|
21
|
-
}
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
const handleLoggerError = (error: unknown) => {
|
|
25
|
-
const serialized = serializeLoggerError(error);
|
|
26
|
-
try {
|
|
27
|
-
// eslint-disable-next-line no-console
|
|
28
|
-
console.error(`${LOGGER_ERROR_PREFIX} transport error: ${serialized}`);
|
|
29
|
-
} catch {
|
|
30
|
-
/* ignore failures when reporting logger errors */
|
|
31
|
-
}
|
|
32
|
-
};
|
|
33
6
|
|
|
34
7
|
const MSG_MAX_LEN = 60;
|
|
35
8
|
const MSG_MAX_CHARS = 2048;
|
|
@@ -50,8 +23,45 @@ const truncateString = (str: string): string => {
|
|
|
50
23
|
return result;
|
|
51
24
|
};
|
|
52
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
|
+
|
|
53
63
|
const baseFormat = format.printf(({ timestamp, level, message, ...rest }) => {
|
|
54
|
-
let restString =
|
|
64
|
+
let restString = safeStringify(rest, 2);
|
|
55
65
|
restString = restString === "{}" ? "" : restString;
|
|
56
66
|
|
|
57
67
|
let formattedMessage: string;
|
|
@@ -87,31 +97,25 @@ const logFormat = format.combine(
|
|
|
87
97
|
baseFormat
|
|
88
98
|
);
|
|
89
99
|
|
|
90
|
-
const createConsoleTransport = () => {
|
|
91
|
-
const consoleTransport = new transports.Console({
|
|
92
|
-
format: format.combine(
|
|
93
|
-
format.timestamp(),
|
|
94
|
-
format.splat(),
|
|
95
|
-
baseFormat,
|
|
96
|
-
format.colorize({ all: true })
|
|
97
|
-
),
|
|
98
|
-
});
|
|
99
|
-
consoleTransport.on("error", handleLoggerError);
|
|
100
|
-
return consoleTransport;
|
|
101
|
-
};
|
|
102
|
-
|
|
103
100
|
// Create a basic logger with default configuration
|
|
104
101
|
const logger = createLogger({
|
|
105
|
-
level:
|
|
102
|
+
level: process.env.LOG_LEVEL || "info",
|
|
106
103
|
format: logFormat,
|
|
107
|
-
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
|
+
],
|
|
108
114
|
});
|
|
109
115
|
|
|
110
|
-
logger.on("error", handleLoggerError);
|
|
111
|
-
|
|
112
116
|
// Helper function to create a file transport with shared configuration
|
|
113
117
|
const createFileTransport = (): DailyRotateFile => {
|
|
114
|
-
|
|
118
|
+
return new DailyRotateFile({
|
|
115
119
|
filename: path.join(logDirectory, "%DATE%.log"),
|
|
116
120
|
datePattern: "YYYY-MM-DD",
|
|
117
121
|
zippedArchive: true,
|
|
@@ -119,8 +123,6 @@ const createFileTransport = (): DailyRotateFile => {
|
|
|
119
123
|
maxFiles: "14d",
|
|
120
124
|
format: logFormat,
|
|
121
125
|
});
|
|
122
|
-
transport.on("error", handleLoggerError);
|
|
123
|
-
return transport;
|
|
124
126
|
};
|
|
125
127
|
|
|
126
128
|
// Rotate mitigation helper: attaches rotate handler to transport and recursively attaches to replacements
|
|
@@ -134,76 +136,35 @@ function attachRotateMitigation(
|
|
|
134
136
|
if (isRefreshing) return;
|
|
135
137
|
isRefreshing = true;
|
|
136
138
|
let removalTimer: NodeJS.Timeout | null = null;
|
|
137
|
-
let next: DailyRotateFile | null = null;
|
|
138
139
|
|
|
139
|
-
|
|
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", () => {
|
|
140
144
|
if (removalTimer) {
|
|
141
145
|
clearTimeout(removalTimer);
|
|
142
146
|
removalTimer = null;
|
|
143
147
|
}
|
|
148
|
+
try {
|
|
149
|
+
logger.remove(transport);
|
|
150
|
+
} catch {}
|
|
144
151
|
isRefreshing = false;
|
|
145
|
-
};
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
if (removalTimer) {
|
|
153
|
-
clearTimeout(removalTimer);
|
|
154
|
-
removalTimer = null;
|
|
155
|
-
}
|
|
156
|
-
try {
|
|
157
|
-
logger.remove(transport);
|
|
158
|
-
} catch (error) {
|
|
159
|
-
handleLoggerError(error);
|
|
160
|
-
}
|
|
161
|
-
cleanupRefresh();
|
|
162
|
-
});
|
|
163
|
-
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(() => {
|
|
164
159
|
try {
|
|
165
|
-
logger.
|
|
166
|
-
} catch
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
logger.remove(next);
|
|
171
|
-
} catch {}
|
|
172
|
-
try {
|
|
173
|
-
if (typeof next.close === "function") {
|
|
174
|
-
next.close();
|
|
175
|
-
}
|
|
176
|
-
} catch {}
|
|
177
|
-
return;
|
|
178
|
-
}
|
|
160
|
+
logger.remove(transport);
|
|
161
|
+
} catch {}
|
|
162
|
+
isRefreshing = false;
|
|
163
|
+
removalTimer = null;
|
|
164
|
+
}, REMOVAL_GRACE_MS);
|
|
179
165
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
removalTimer = setTimeout(() => {
|
|
183
|
-
try {
|
|
184
|
-
logger.remove(transport);
|
|
185
|
-
} catch (error) {
|
|
186
|
-
handleLoggerError(error);
|
|
187
|
-
}
|
|
188
|
-
cleanupRefresh();
|
|
189
|
-
}, REMOVAL_GRACE_MS);
|
|
190
|
-
|
|
191
|
-
// Keep console and other transports intact; do not silence or clear
|
|
192
|
-
logger.level = logLevel;
|
|
193
|
-
} catch (error) {
|
|
194
|
-
cleanupRefresh();
|
|
195
|
-
handleLoggerError(error);
|
|
196
|
-
if (next) {
|
|
197
|
-
try {
|
|
198
|
-
logger.remove(next);
|
|
199
|
-
} catch {}
|
|
200
|
-
try {
|
|
201
|
-
if (typeof next.close === "function") {
|
|
202
|
-
next.close();
|
|
203
|
-
}
|
|
204
|
-
} catch {}
|
|
205
|
-
}
|
|
206
|
-
}
|
|
166
|
+
// Keep console and other transports intact; do not silence or clear
|
|
167
|
+
logger.level = logLevel;
|
|
207
168
|
});
|
|
208
169
|
}
|
|
209
170
|
|
|
@@ -233,7 +194,16 @@ export const configureLogger = (logLevel: string, nodeEnv: string) => {
|
|
|
233
194
|
|
|
234
195
|
// Add console transport in non-production environments
|
|
235
196
|
if (nodeEnv !== "production") {
|
|
236
|
-
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
|
+
);
|
|
237
207
|
}
|
|
238
208
|
|
|
239
209
|
// Set the log level
|
|
@@ -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
|
package/src/types/index.ts
CHANGED
|
@@ -3,10 +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
|
|
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
|
},
|