@machinemetrics/mm-erp-sdk 0.2.0-beta.3 → 0.3.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 +5 -0
- package/dist/index.d.ts +43 -43
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +48 -0
- package/dist/index.js.map +1 -0
- package/dist/knexfile.d.ts.map +1 -1
- package/dist/knexfile.js +19 -0
- package/dist/knexfile.js.map +1 -0
- package/dist/migrations/20241015162631_create_cache_table.d.ts +4 -0
- package/dist/migrations/20241015162631_create_cache_table.d.ts.map +1 -0
- package/dist/migrations/20241015162631_create_cache_table.js +11 -15
- package/dist/migrations/20241015162631_create_cache_table.js.map +1 -1
- package/dist/migrations/20241015162632_create_sdk_cache_table.d.ts +4 -0
- package/dist/migrations/20241015162632_create_sdk_cache_table.d.ts.map +1 -0
- package/dist/migrations/20241015162632_create_sdk_cache_table.js +11 -15
- package/dist/migrations/20241015162632_create_sdk_cache_table.js.map +1 -1
- package/dist/migrations/20250103162631_create_record_tracking_table.d.ts +4 -0
- package/dist/migrations/20250103162631_create_record_tracking_table.d.ts.map +1 -0
- package/dist/migrations/20250103162631_create_record_tracking_table.js +14 -15
- package/dist/migrations/20250103162631_create_record_tracking_table.js.map +1 -1
- 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/batch-cache-manager.js +84 -0
- package/dist/services/caching-service/batch-cache-manager.js.map +1 -0
- 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/hashed-cache-manager.js +223 -0
- package/dist/services/caching-service/hashed-cache-manager.js.map +1 -0
- 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/index.js +2 -0
- package/dist/services/caching-service/index.js.map +1 -0
- 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/caching-service/record-tracking-manager.js +28 -0
- package/dist/services/caching-service/record-tracking-manager.js.map +1 -0
- 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/configuration-manager.js +163 -0
- package/dist/services/data-sync-service/configuration-manager.js.map +1 -0
- package/dist/services/data-sync-service/data-sync-service.d.ts.map +1 -1
- package/dist/services/data-sync-service/data-sync-service.js +104 -0
- package/dist/services/data-sync-service/data-sync-service.js.map +1 -0
- 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/index.js +10 -0
- package/dist/services/data-sync-service/index.js.map +1 -0
- package/dist/services/data-sync-service/jobs/clean-up-expired-cache.js +40 -39
- 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 +43 -36
- 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 +36 -35
- 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 +22 -21
- package/dist/services/data-sync-service/jobs/run-migrations.js.map +1 -1
- package/dist/services/data-sync-service/jobs/to-erp.js +57 -48
- package/dist/services/data-sync-service/jobs/to-erp.js.map +1 -1
- package/dist/services/data-sync-service/nats-labor-ticket-listener.js +290 -0
- package/dist/services/data-sync-service/nats-labor-ticket-listener.js.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/errors.js +83 -0
- package/dist/services/erp-api-services/errors.js.map +1 -0
- 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/graphql/graphql-service.js +102 -0
- package/dist/services/erp-api-services/graphql/graphql-service.js.map +1 -0
- package/dist/services/erp-api-services/graphql/types.js +6 -0
- package/dist/services/erp-api-services/graphql/types.js.map +1 -0
- 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/index.js +13 -0
- package/dist/services/erp-api-services/index.js.map +1 -0
- package/dist/services/erp-api-services/oauth-client.js +41 -0
- package/dist/services/erp-api-services/oauth-client.js.map +1 -0
- package/dist/services/erp-api-services/rest/get-query-params.js +23 -0
- package/dist/services/erp-api-services/rest/get-query-params.js.map +1 -0
- 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/rest/rest-api-service.js +163 -0
- package/dist/services/erp-api-services/rest/rest-api-service.js.map +1 -0
- 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/erp-api-services/types.js +2 -0
- package/dist/services/erp-api-services/types.js.map +1 -0
- package/dist/services/mm-api-service/company-info.js +60 -0
- package/dist/services/mm-api-service/company-info.js.map +1 -0
- package/dist/services/mm-api-service/index.d.ts +8 -8
- package/dist/services/mm-api-service/index.d.ts.map +1 -1
- package/dist/services/mm-api-service/index.js +20 -0
- package/dist/services/mm-api-service/index.js.map +1 -0
- package/dist/services/mm-api-service/mm-api-service.d.ts +7 -7
- package/dist/services/mm-api-service/mm-api-service.d.ts.map +1 -1
- package/dist/services/mm-api-service/mm-api-service.js +531 -0
- package/dist/services/mm-api-service/mm-api-service.js.map +1 -0
- package/dist/services/mm-api-service/token-mgr.js +113 -0
- package/dist/services/mm-api-service/token-mgr.js.map +1 -0
- package/dist/services/mm-api-service/types/checkpoint.js +2 -0
- package/dist/services/mm-api-service/types/checkpoint.js.map +1 -0
- 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/entity-transformer.js +186 -0
- package/dist/services/mm-api-service/types/entity-transformer.js.map +1 -0
- package/dist/services/mm-api-service/types/mm-response-interfaces.js +34 -0
- package/dist/services/mm-api-service/types/mm-response-interfaces.js.map +1 -0
- package/dist/services/mm-api-service/types/receive-types.js +56 -0
- package/dist/services/mm-api-service/types/receive-types.js.map +1 -0
- package/dist/services/mm-api-service/types/send-types.js +337 -0
- package/dist/services/mm-api-service/types/send-types.js.map +1 -0
- package/dist/services/nats-service/nats-service.js +244 -0
- package/dist/services/nats-service/nats-service.js.map +1 -0
- package/dist/services/nats-service/test-nats-subscriber.js +79 -0
- package/dist/services/nats-service/test-nats-subscriber.js.map +1 -0
- package/dist/services/psql-erp-service/configuration.js +2 -0
- package/dist/services/psql-erp-service/configuration.js.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/index.js +10 -0
- package/dist/services/psql-erp-service/index.js.map +1 -0
- package/dist/services/psql-erp-service/internal/types/psql-types.js +5 -0
- package/dist/services/psql-erp-service/internal/types/psql-types.js.map +1 -0
- package/dist/services/psql-erp-service/psql-helpers.js +99 -0
- package/dist/services/psql-erp-service/psql-helpers.js.map +1 -0
- 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/psql-erp-service/psql-service.js +187 -0
- package/dist/services/psql-erp-service/psql-service.js.map +1 -0
- 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/index.js +5 -0
- package/dist/services/reporting-service/index.js.map +1 -0
- package/dist/services/reporting-service/logger.d.ts.map +1 -1
- package/dist/services/reporting-service/logger.js +246 -0
- package/dist/services/reporting-service/logger.js.map +1 -0
- package/dist/services/sql-server-erp-service/configuration.js +2 -0
- package/dist/services/sql-server-erp-service/configuration.js.map +1 -0
- 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/index.js +11 -0
- package/dist/services/sql-server-erp-service/index.js.map +1 -0
- 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/internal/sql-labor-ticket-operations.js +50 -0
- package/dist/services/sql-server-erp-service/internal/sql-labor-ticket-operations.js.map +1 -0
- package/dist/services/sql-server-erp-service/internal/sql-server-config.js +40 -0
- package/dist/services/sql-server-erp-service/internal/sql-server-config.js.map +1 -0
- package/dist/services/sql-server-erp-service/internal/sql-transaction-manager.js +36 -0
- package/dist/services/sql-server-erp-service/internal/sql-transaction-manager.js.map +1 -0
- package/dist/services/sql-server-erp-service/internal/types/sql-server-types.js +2 -0
- package/dist/services/sql-server-erp-service/internal/types/sql-server-types.js.map +1 -0
- 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-helpers.js +66 -0
- package/dist/services/sql-server-erp-service/sql-server-helpers.js.map +1 -0
- 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/sql-server-erp-service/sql-server-service.js +154 -0
- package/dist/services/sql-server-erp-service/sql-server-service.js.map +1 -0
- package/dist/services/sql-server-erp-service/types/sql-input-param.js +2 -0
- package/dist/services/sql-server-erp-service/types/sql-input-param.js.map +1 -0
- package/dist/services/sqlite-service/index.d.ts +1 -1
- package/dist/services/sqlite-service/index.d.ts.map +1 -1
- package/dist/services/sqlite-service/index.js +2 -0
- package/dist/services/sqlite-service/index.js.map +1 -0
- package/dist/services/sqlite-service/sqlite-coordinator.js +60 -0
- package/dist/services/sqlite-service/sqlite-coordinator.js.map +1 -0
- package/dist/types/erp-connector.d.ts +1 -1
- package/dist/types/erp-connector.d.ts.map +1 -1
- package/dist/types/erp-connector.js +2 -0
- package/dist/types/erp-connector.js.map +1 -0
- package/dist/types/erp-types.js +13 -0
- package/dist/types/erp-types.js.map +1 -0
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/application-initializer.js +55 -0
- package/dist/utils/application-initializer.js.map +1 -0
- package/dist/utils/cleanup-numbers.js +6 -0
- package/dist/utils/cleanup-numbers.js.map +1 -0
- package/dist/utils/connector-factory.d.ts +1 -1
- package/dist/utils/connector-factory.d.ts.map +1 -1
- package/dist/utils/connector-factory.js +34 -0
- package/dist/utils/connector-factory.js.map +1 -0
- 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/log-deduper.js +240 -0
- package/dist/utils/connector-log/log-deduper.js.map +1 -0
- package/dist/utils/connector-log/mm-connector-logger-example.d.ts +1 -0
- package/dist/utils/connector-log/mm-connector-logger-example.js +88 -0
- package/dist/utils/connector-log/mm-connector-logger-example.js.map +1 -0
- 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/connector-log/mm-connector-logger.js +151 -0
- package/dist/utils/connector-log/mm-connector-logger.js.map +1 -0
- package/dist/utils/data-transformation.js +38 -0
- package/dist/utils/data-transformation.js.map +1 -0
- 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/erp-type-from-entity.js +6 -0
- package/dist/utils/erp-type-from-entity.js.map +1 -0
- package/dist/utils/error-formatter.js +184 -0
- package/dist/utils/error-formatter.js.map +1 -0
- package/dist/utils/error-utils.js +21 -0
- package/dist/utils/error-utils.js.map +1 -0
- package/dist/utils/http-client.js +187 -0
- package/dist/utils/http-client.js.map +1 -0
- package/dist/utils/index.d.ts +35 -35
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +69 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/local-data-store/database-lock.js +68 -0
- package/dist/utils/local-data-store/database-lock.js.map +1 -0
- package/dist/utils/local-data-store/jobs-shared-data.js +116 -0
- package/dist/utils/local-data-store/jobs-shared-data.js.map +1 -0
- 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/mm-labor-ticket-helpers.js +23 -0
- package/dist/utils/mm-labor-ticket-helpers.js.map +1 -0
- package/dist/utils/removeExtraneousFields.d.ts +1 -1
- package/dist/utils/removeExtraneousFields.d.ts.map +1 -1
- package/dist/utils/removeExtraneousFields.js +16 -0
- package/dist/utils/removeExtraneousFields.js.map +1 -0
- package/dist/utils/removeIdFieldFromPayload.d.ts +1 -1
- package/dist/utils/removeIdFieldFromPayload.d.ts.map +1 -1
- package/dist/utils/removeIdFieldFromPayload.js +16 -0
- package/dist/utils/removeIdFieldFromPayload.js.map +1 -0
- package/dist/utils/resource-group.d.ts +1 -1
- package/dist/utils/resource-group.d.ts.map +1 -1
- package/dist/utils/resource-group.js +59 -0
- package/dist/utils/resource-group.js.map +1 -0
- 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/error-processor.js +262 -0
- package/dist/utils/standard-process-drivers/error-processor.js.map +1 -0
- 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/index.js +4 -0
- package/dist/utils/standard-process-drivers/index.js.map +1 -0
- 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/labor-ticket-erp-synchronizer.js +165 -0
- package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.js.map +1 -0
- 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/mm-entity-processor.js +168 -0
- package/dist/utils/standard-process-drivers/mm-entity-processor.js.map +1 -0
- 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/dist/utils/standard-process-drivers/standard-process-drivers.js +324 -0
- package/dist/utils/standard-process-drivers/standard-process-drivers.js.map +1 -0
- package/dist/utils/time-utils.js +96 -0
- package/dist/utils/time-utils.js.map +1 -0
- package/dist/utils/timezone.js +105 -0
- package/dist/utils/timezone.js.map +1 -0
- package/dist/utils/trimObjectValues.js +11 -0
- package/dist/utils/trimObjectValues.js.map +1 -0
- package/dist/utils/uniqueRows.js +35 -0
- package/dist/utils/uniqueRows.js.map +1 -0
- package/package.json +5 -6
- package/src/index.ts +43 -43
- package/src/knexfile.ts +1 -0
- 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 +12 -11
- 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 +6 -6
- 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 +3 -3
- package/src/services/data-sync-service/nats-labor-ticket-listener.ts +8 -8
- 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 +3 -3
- package/src/services/mm-api-service/index.ts +8 -8
- package/src/services/mm-api-service/mm-api-service.ts +10 -10
- 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/nats-service/nats-service.ts +1 -1
- package/src/services/nats-service/test-nats-subscriber.ts +1 -1
- 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 +109 -42
- 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/http-client.ts +1 -1
- package/src/utils/index.ts +35 -35
- 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/config-CvA-mFWF.js +0 -418
- package/dist/config-CvA-mFWF.js.map +0 -1
- package/dist/connector-factory-BPm2GVVF.js +0 -30
- package/dist/connector-factory-BPm2GVVF.js.map +0 -1
- package/dist/hashed-cache-manager-B15NN8hK.js +0 -322
- package/dist/hashed-cache-manager-B15NN8hK.js.map +0 -1
- package/dist/index-D8qO1NyK.js +0 -192
- package/dist/index-D8qO1NyK.js.map +0 -1
- package/dist/knexfile-Bng2Ru9c.js +0 -20
- package/dist/knexfile-Bng2Ru9c.js.map +0 -1
- package/dist/logger-BWw0_z9q.js +0 -17557
- package/dist/logger-BWw0_z9q.js.map +0 -1
- package/dist/mm-erp-sdk.js +0 -4978
- package/dist/mm-erp-sdk.js.map +0 -1
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import logger from "../reporting-service/logger.js";
|
|
2
|
+
import { formatError } from "../../utils/error-formatter.js";
|
|
3
|
+
import { NatsService } from "../nats-service/nats-service.js";
|
|
4
|
+
import { MMReceiveLaborTicket, MMApiClient, getCompanyInfo } from "../mm-api-service/index.js";
|
|
5
|
+
import { SQLiteCoordinator } from "../sqlite-service/index.js";
|
|
6
|
+
/**
|
|
7
|
+
* Manages NATS-based real-time labor ticket processing
|
|
8
|
+
*/
|
|
9
|
+
export class NatsLaborTicketListener {
|
|
10
|
+
connector;
|
|
11
|
+
natsService;
|
|
12
|
+
constructor(connector) {
|
|
13
|
+
this.connector = connector;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Start listening for labor ticket events via NATS
|
|
17
|
+
*/
|
|
18
|
+
async start() {
|
|
19
|
+
try {
|
|
20
|
+
// Fetch company info from MM API (includes locationRef)
|
|
21
|
+
const companyInfo = await getCompanyInfo();
|
|
22
|
+
const erpType = this.connector.type || "unknown";
|
|
23
|
+
logger.info("Starting NATS listener for labor tickets", {
|
|
24
|
+
locationRef: companyInfo.locationRef,
|
|
25
|
+
companyId: companyInfo.companyId,
|
|
26
|
+
erpType,
|
|
27
|
+
servers: process.env.NATS_SERVERS || "nats://localhost:4222",
|
|
28
|
+
});
|
|
29
|
+
this.natsService = new NatsService({
|
|
30
|
+
servers: process.env.NATS_SERVERS || "nats://localhost:4222",
|
|
31
|
+
name: `${erpType}-connector`,
|
|
32
|
+
locationRef: companyInfo.locationRef,
|
|
33
|
+
erpType,
|
|
34
|
+
enabled: true,
|
|
35
|
+
reconnect: true,
|
|
36
|
+
maxReconnectAttempts: -1,
|
|
37
|
+
reconnectTimeWait: 2000,
|
|
38
|
+
});
|
|
39
|
+
// Register health check handler
|
|
40
|
+
this.registerHealthCheckHandler(companyInfo.locationRef, erpType);
|
|
41
|
+
// Register labor ticket handler
|
|
42
|
+
this.registerLaborTicketHandler(companyInfo.locationRef, erpType);
|
|
43
|
+
// Connect to NATS
|
|
44
|
+
await this.natsService.connect();
|
|
45
|
+
logger.info("NATS listener started successfully", {
|
|
46
|
+
subject: `mm.16.${companyInfo.locationRef}.labor-ticket.*`,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
logger.error("Failed to start NATS listener", { error });
|
|
51
|
+
// Don't throw - allow REST polling to continue
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Register health check handler - responds immediately to let Dashboard know connector is online
|
|
56
|
+
*/
|
|
57
|
+
registerHealthCheckHandler(locationRef, erpType) {
|
|
58
|
+
if (!this.natsService)
|
|
59
|
+
return;
|
|
60
|
+
this.natsService.registerHandler({
|
|
61
|
+
subject: `mm.16.${locationRef}.health`,
|
|
62
|
+
description: "Health check - responds immediately to indicate connector is online",
|
|
63
|
+
handler: {
|
|
64
|
+
handle: async () => {
|
|
65
|
+
logger.debug("Health check received, sending pong");
|
|
66
|
+
return {
|
|
67
|
+
status: "online",
|
|
68
|
+
timestamp: new Date().toISOString(),
|
|
69
|
+
locationRef,
|
|
70
|
+
erpType,
|
|
71
|
+
};
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Register labor ticket processing handler
|
|
78
|
+
*/
|
|
79
|
+
registerLaborTicketHandler(locationRef, erpType) {
|
|
80
|
+
if (!this.natsService)
|
|
81
|
+
return;
|
|
82
|
+
this.natsService.registerHandler({
|
|
83
|
+
subject: `mm.16.${locationRef}.labor-ticket.*`,
|
|
84
|
+
description: "Process labor tickets in real-time from NATS",
|
|
85
|
+
handler: {
|
|
86
|
+
handle: async ({ data }, subject) => {
|
|
87
|
+
const action = subject.split(".").pop();
|
|
88
|
+
const { actionPayload } = data;
|
|
89
|
+
const startTime = Date.now();
|
|
90
|
+
const { laborTicketRef } = actionPayload;
|
|
91
|
+
logger.info("Received labor ticket via NATS", {
|
|
92
|
+
action,
|
|
93
|
+
requestId: data.requestId,
|
|
94
|
+
laborTicketRef,
|
|
95
|
+
});
|
|
96
|
+
// Use the same lock as to-erp job to prevent concurrent processing
|
|
97
|
+
return await SQLiteCoordinator.executeWithLock("to-erp", async () => {
|
|
98
|
+
try {
|
|
99
|
+
let laborTicketData;
|
|
100
|
+
if (laborTicketRef) {
|
|
101
|
+
// Fetch the full labor ticket data using the laborTicketRef
|
|
102
|
+
const mmApiClient = new MMApiClient();
|
|
103
|
+
const laborTicket = await mmApiClient.fetchLaborTicketByRef(laborTicketRef);
|
|
104
|
+
logger.info("Fetched labor ticket data from MM API", {
|
|
105
|
+
laborTicketRef,
|
|
106
|
+
laborTicketId: laborTicket.laborTicketId,
|
|
107
|
+
});
|
|
108
|
+
// Merge changed fields from actionPayload to ensure we process the actual changes
|
|
109
|
+
laborTicketData = {
|
|
110
|
+
...laborTicket,
|
|
111
|
+
...actionPayload,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
// No laborTicketRef provided, use the actionPayload directly
|
|
116
|
+
logger.info("No laborTicketRef provided, using actionPayload directly", {
|
|
117
|
+
requestId: data.requestId,
|
|
118
|
+
});
|
|
119
|
+
laborTicketData = actionPayload;
|
|
120
|
+
}
|
|
121
|
+
const mergedLaborTicket = new MMReceiveLaborTicket(laborTicketData);
|
|
122
|
+
// Process labor ticket: ERP operation first, then create MM entities with ERP ID
|
|
123
|
+
const result = await this.processLaborTicket(mergedLaborTicket, action || "unknown");
|
|
124
|
+
// Update checkpoint to prevent to-erp polling job from reprocessing this ticket
|
|
125
|
+
await this.updateCheckpoint(erpType, result);
|
|
126
|
+
// Return response with full labor ticket data for immediate frontend state update
|
|
127
|
+
return {
|
|
128
|
+
status: "success",
|
|
129
|
+
requestId: data.requestId,
|
|
130
|
+
action,
|
|
131
|
+
timestamp: new Date().toISOString(),
|
|
132
|
+
processingTimeMs: Date.now() - startTime,
|
|
133
|
+
laborTicketRef: result.laborTicketRef,
|
|
134
|
+
laborTicket: result.laborTicket,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
// Check if error was already formatted in inner catch block
|
|
139
|
+
const formattedError = error?._formatted || formatError(error);
|
|
140
|
+
// Debug logging
|
|
141
|
+
logger.debug("Error details", {
|
|
142
|
+
hasFormatted: !!error?._formatted,
|
|
143
|
+
isAxiosError: error?.isAxiosError,
|
|
144
|
+
errorMessage: error?.message,
|
|
145
|
+
responseStatus: error?.response?.status,
|
|
146
|
+
responseData: error?.response?.data,
|
|
147
|
+
});
|
|
148
|
+
logger.error("Error handling labor ticket from NATS", {
|
|
149
|
+
error: formattedError.message,
|
|
150
|
+
code: formattedError.code,
|
|
151
|
+
requestId: data.requestId,
|
|
152
|
+
laborTicketRef,
|
|
153
|
+
});
|
|
154
|
+
return {
|
|
155
|
+
status: "error",
|
|
156
|
+
requestId: data.requestId,
|
|
157
|
+
action,
|
|
158
|
+
timestamp: new Date().toISOString(),
|
|
159
|
+
processingTimeMs: Date.now() - startTime,
|
|
160
|
+
error: {
|
|
161
|
+
message: formattedError.message,
|
|
162
|
+
code: formattedError.code,
|
|
163
|
+
httpStatus: formattedError.httpStatus,
|
|
164
|
+
metadata: formattedError.metadata,
|
|
165
|
+
laborTicketRef,
|
|
166
|
+
},
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
},
|
|
171
|
+
},
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Process labor ticket in ERP and then create MM entities with ERP ID attached
|
|
176
|
+
*/
|
|
177
|
+
async processLaborTicket(laborTicket, action) {
|
|
178
|
+
const { MMEntityProcessor } = await import("../../utils/standard-process-drivers/mm-entity-processor.js");
|
|
179
|
+
const { ERPObjType } = await import("../../types/erp-types.js");
|
|
180
|
+
const { MMSendLaborTicket } = await import("../mm-api-service/index.js");
|
|
181
|
+
logger.info("Processing labor ticket: ERP first, then MM creation", {
|
|
182
|
+
laborTicketRef: laborTicket.laborTicketRef,
|
|
183
|
+
action,
|
|
184
|
+
hasLaborTicketId: !!laborTicket.laborTicketId,
|
|
185
|
+
});
|
|
186
|
+
try {
|
|
187
|
+
let erpResult;
|
|
188
|
+
if (action === "create" || !laborTicket.laborTicketId) {
|
|
189
|
+
// Create new labor ticket in ERP
|
|
190
|
+
erpResult = await this.connector.createLaborTicketInERP(laborTicket);
|
|
191
|
+
logger.info("Successfully created labor ticket in ERP", {
|
|
192
|
+
laborTicketRef: laborTicket.laborTicketRef,
|
|
193
|
+
erpUid: erpResult.erpUid,
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
// Update existing labor ticket in ERP
|
|
198
|
+
erpResult = { laborTicket: await this.connector.updateLaborTicketInERP(laborTicket) };
|
|
199
|
+
logger.info("Successfully updated labor ticket in ERP", {
|
|
200
|
+
laborTicketRef: laborTicket.laborTicketRef,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
// Now update MM entities with ERP ID attached
|
|
204
|
+
const laborTicketForMM = { ...laborTicket };
|
|
205
|
+
if (erpResult.erpUid) {
|
|
206
|
+
laborTicketForMM.laborTicketId = erpResult.erpUid;
|
|
207
|
+
// If this was a create (no initial laborTicketId) with a laborTicketRef,
|
|
208
|
+
// patch the existing orphaned MM record with the new ERP ID first
|
|
209
|
+
if (!laborTicket.laborTicketId && laborTicketForMM.laborTicketRef) {
|
|
210
|
+
const mmApiClient = new MMApiClient();
|
|
211
|
+
await mmApiClient.updateLaborTicketIdByRef(laborTicketForMM.laborTicketRef, erpResult.erpUid);
|
|
212
|
+
logger.info("Patched existing MM labor ticket with new ERP ID", {
|
|
213
|
+
laborTicketRef: laborTicketForMM.laborTicketRef,
|
|
214
|
+
laborTicketId: erpResult.erpUid,
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
// Set state based on clockOut before writing to MM
|
|
219
|
+
laborTicketForMM.state = laborTicketForMM.clockOut ? "CLOSED" : "OPEN";
|
|
220
|
+
// Write all fields to MM (this updates the existing record now that it has laborTicketId)
|
|
221
|
+
const mmLaborTicket = MMSendLaborTicket.fromPlainObject(laborTicketForMM);
|
|
222
|
+
const mmResult = await MMEntityProcessor.writeEntities(ERPObjType.LABOR_TICKETS, [mmLaborTicket], null // No caching for real-time operations
|
|
223
|
+
);
|
|
224
|
+
logger.info("Successfully updated MM entities after ERP operation", {
|
|
225
|
+
laborTicketRef: laborTicketForMM.laborTicketRef,
|
|
226
|
+
laborTicketId: laborTicketForMM.laborTicketId,
|
|
227
|
+
entitiesCreated: mmResult.upsertedEntities,
|
|
228
|
+
});
|
|
229
|
+
return {
|
|
230
|
+
laborTicketRef: laborTicketForMM.laborTicketRef,
|
|
231
|
+
laborTicket: laborTicketForMM,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
// Format error to preserve meaningful message
|
|
236
|
+
const formattedError = formatError(error);
|
|
237
|
+
logger.error("Failed to process labor ticket with MM creation", {
|
|
238
|
+
laborTicketRef: laborTicket.laborTicketRef,
|
|
239
|
+
action,
|
|
240
|
+
error: formattedError.message,
|
|
241
|
+
code: formattedError.code,
|
|
242
|
+
});
|
|
243
|
+
// Create enhanced error to propagate
|
|
244
|
+
const enhancedError = error;
|
|
245
|
+
enhancedError._formatted = formattedError;
|
|
246
|
+
throw enhancedError;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Update checkpoint to prevent to-erp polling job from reprocessing this ticket
|
|
251
|
+
* Only updates if the new timestamp is later than the current checkpoint (prevents moving backwards)
|
|
252
|
+
*/
|
|
253
|
+
async updateCheckpoint(erpType, result) {
|
|
254
|
+
const mmApiClient = new MMApiClient();
|
|
255
|
+
const newTimestamp = new Date().toISOString();
|
|
256
|
+
const currentCheckpoint = await mmApiClient.getCheckpoint({
|
|
257
|
+
system: erpType,
|
|
258
|
+
table: "labor_tickets",
|
|
259
|
+
checkpointType: "export",
|
|
260
|
+
checkpointValue: {
|
|
261
|
+
timestamp: "",
|
|
262
|
+
},
|
|
263
|
+
});
|
|
264
|
+
const currentTimestamp = currentCheckpoint?.timestamp;
|
|
265
|
+
// Only update checkpoint if new timestamp is later than current (prevents moving backwards)
|
|
266
|
+
if (!currentTimestamp || new Date(newTimestamp) > new Date(currentTimestamp)) {
|
|
267
|
+
await mmApiClient.saveCheckpoint({
|
|
268
|
+
system: erpType,
|
|
269
|
+
table: "labor_tickets",
|
|
270
|
+
checkpointType: "export",
|
|
271
|
+
checkpointValue: {
|
|
272
|
+
timestamp: newTimestamp,
|
|
273
|
+
},
|
|
274
|
+
});
|
|
275
|
+
logger.debug("Updated export checkpoint after NATS processing", {
|
|
276
|
+
laborTicketRef: result.laborTicketRef,
|
|
277
|
+
previousCheckpoint: currentTimestamp,
|
|
278
|
+
newCheckpoint: newTimestamp,
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
logger.debug("Skipped checkpoint update (timestamp not newer)", {
|
|
283
|
+
laborTicketRef: result.laborTicketRef,
|
|
284
|
+
currentCheckpoint: currentTimestamp,
|
|
285
|
+
ticketTimestamp: newTimestamp,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=nats-labor-ticket-listener.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nats-labor-ticket-listener.js","sourceRoot":"","sources":["../../../src/services/data-sync-service/nats-labor-ticket-listener.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/services/erp-api-services/errors.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/services/erp-api-services/errors.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAGxD;;GAEG;AACH,qBAAa,YAAa,SAAQ,KAAK;IAG5B,MAAM,EAAE,kBAAkB,EAAE;gBADnC,OAAO,EAAE,MAAM,EACR,MAAM,EAAE,kBAAkB,EAAE;CAKtC;AAED;;;GAGG;AACH,qBAAa,YAAY;IACvB;;;;;OAKG;IACH,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK;CAqFrC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { AxiosError } from "axios";
|
|
2
|
+
import logger from "../reporting-service/logger.js";
|
|
3
|
+
import { HTTPError } from "../../utils/http-client.js";
|
|
4
|
+
/**
|
|
5
|
+
* Represents GraphQL specific errors (validation, missing fields, etc.)
|
|
6
|
+
*/
|
|
7
|
+
export class GraphQLError extends Error {
|
|
8
|
+
errors;
|
|
9
|
+
constructor(message, errors) {
|
|
10
|
+
super(message);
|
|
11
|
+
this.errors = errors;
|
|
12
|
+
this.name = "GraphQLError";
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Centralized error handling for API requests.
|
|
17
|
+
* Transforms various error types into standardized HTTPError or GraphQLError.
|
|
18
|
+
*/
|
|
19
|
+
export class ErrorHandler {
|
|
20
|
+
/**
|
|
21
|
+
* Transforms any error into a standardized HTTPError or GraphQLError and throws it.
|
|
22
|
+
* Never returns - always throws an error.
|
|
23
|
+
*
|
|
24
|
+
* @throws {HTTPError|GraphQLError} Standardized error with appropriate details
|
|
25
|
+
*/
|
|
26
|
+
static handle(error) {
|
|
27
|
+
// Handle HTTPError (already processed by http-client)
|
|
28
|
+
if (error instanceof HTTPError) {
|
|
29
|
+
// For GraphQL responses with errors in the data
|
|
30
|
+
if (error.data &&
|
|
31
|
+
typeof error.data === "object" &&
|
|
32
|
+
"errors" in error.data) {
|
|
33
|
+
const graphqlError = new GraphQLError("GraphQL Error", error.data.errors);
|
|
34
|
+
// Log the error
|
|
35
|
+
logger.error("Error>>GraphQL", {
|
|
36
|
+
message: graphqlError.message,
|
|
37
|
+
errors: graphqlError.errors,
|
|
38
|
+
});
|
|
39
|
+
throw graphqlError;
|
|
40
|
+
}
|
|
41
|
+
// Log HTTP error with generic response data
|
|
42
|
+
logger.error("Error>>HTTP", {
|
|
43
|
+
status: error.status,
|
|
44
|
+
message: error.message,
|
|
45
|
+
code: error.code,
|
|
46
|
+
data: error.data,
|
|
47
|
+
});
|
|
48
|
+
throw error; // Re-throw the original HTTPError
|
|
49
|
+
}
|
|
50
|
+
// Handle raw AxiosError (direct usage, not through http-client)
|
|
51
|
+
if (error instanceof AxiosError) {
|
|
52
|
+
// For GraphQL responses with errors
|
|
53
|
+
if (error.response?.data?.errors) {
|
|
54
|
+
const graphqlError = new GraphQLError("GraphQL Error", error.response.data.errors);
|
|
55
|
+
// Log the error
|
|
56
|
+
logger.error("Error>>GraphQL", {
|
|
57
|
+
message: graphqlError.message,
|
|
58
|
+
errors: graphqlError.errors,
|
|
59
|
+
});
|
|
60
|
+
throw graphqlError;
|
|
61
|
+
}
|
|
62
|
+
// For HTTP errors - create HTTPError and log with response data
|
|
63
|
+
const httpError = new HTTPError(error.message, error.response?.status || 500, error.code, error.response?.data);
|
|
64
|
+
// Log HTTP error with generic response data
|
|
65
|
+
logger.error("Error>>HTTP", {
|
|
66
|
+
status: httpError.status,
|
|
67
|
+
message: httpError.message,
|
|
68
|
+
code: httpError.code,
|
|
69
|
+
data: httpError.data,
|
|
70
|
+
});
|
|
71
|
+
throw httpError;
|
|
72
|
+
}
|
|
73
|
+
// For other errors
|
|
74
|
+
const httpError = new HTTPError(error instanceof Error ? error.message : "An unknown error occurred", 500);
|
|
75
|
+
// Log the error
|
|
76
|
+
logger.error("Error>>Unknown", {
|
|
77
|
+
message: httpError.message,
|
|
78
|
+
status: httpError.status,
|
|
79
|
+
});
|
|
80
|
+
throw httpError;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/services/erp-api-services/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graphql-service.d.ts","sourceRoot":"","sources":["../../../../src/services/erp-api-services/graphql/graphql-service.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"graphql-service.d.ts","sourceRoot":"","sources":["../../../../src/services/erp-api-services/graphql/graphql-service.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,QAAQ,CAAS;gBAEb,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM;YAa5D,UAAU;IASxB;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,qBAAqB;IAY7B;;;;;;OAMG;IACG,KAAK,CAAC,CAAC,EACX,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAgB1B;;;;;;OAMG;IACG,MAAM,CAAC,CAAC,EACZ,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAgB1B;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { HTTPClientFactory, } from "../../../utils/http-client.js";
|
|
2
|
+
import { ErrorHandler } from "../errors.js";
|
|
3
|
+
const DEFAULT_RETRY_ATTEMPTS = 0; // One try only, no retries
|
|
4
|
+
export class GraphQLService {
|
|
5
|
+
client;
|
|
6
|
+
config;
|
|
7
|
+
endpoint;
|
|
8
|
+
constructor(config, endpoint, retryAttempts) {
|
|
9
|
+
this.config = config;
|
|
10
|
+
this.endpoint = endpoint
|
|
11
|
+
? endpoint.startsWith("/")
|
|
12
|
+
? endpoint
|
|
13
|
+
: `/${endpoint}`
|
|
14
|
+
: "";
|
|
15
|
+
this.client = HTTPClientFactory.getInstance({
|
|
16
|
+
baseUrl: config.apiUrl,
|
|
17
|
+
retryAttempts: retryAttempts ?? DEFAULT_RETRY_ATTEMPTS,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
async getHeaders() {
|
|
21
|
+
const token = await this.config.getAuthToken();
|
|
22
|
+
return {
|
|
23
|
+
"Content-Type": "application/json",
|
|
24
|
+
Accept: "application/json",
|
|
25
|
+
...(token ? { Authorization: `Bearer ${token}` } : {}),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Handles a GraphQL response, properly handling both successful responses
|
|
30
|
+
* and GraphQL-level errors (which come in a 200 HTTP response)
|
|
31
|
+
*
|
|
32
|
+
* From the GraphQL specification (https://spec.graphql.org/draft/#sec-Errors):
|
|
33
|
+
> * "When a GraphQL server encounters an error, it should return a response with a
|
|
34
|
+
> * top-level "errors" field containing the error information. The response may still contain
|
|
35
|
+
* a partial result in the "data" field if the error occurred after some data was already resolved."
|
|
36
|
+
*
|
|
37
|
+
* And specifically about HTTP status codes:
|
|
38
|
+
* "A server should return a 200 status code when a GraphQL operation successfully executes, including when
|
|
39
|
+
* the operation returns errors. A server should return a 400 status code when a GraphQL operation fails to execute."
|
|
40
|
+
*/
|
|
41
|
+
handleGraphQLResponse(response) {
|
|
42
|
+
return {
|
|
43
|
+
data: response.data.data,
|
|
44
|
+
metadata: {
|
|
45
|
+
errors: response.data.errors,
|
|
46
|
+
extensions: response.data.extensions,
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Executes a GraphQL query
|
|
52
|
+
* @param query The GraphQL query string
|
|
53
|
+
* @param variables Optional variables for the query
|
|
54
|
+
* @returns The query result
|
|
55
|
+
* @throws {HTTPError} For HTTP/network errors only
|
|
56
|
+
*/
|
|
57
|
+
async query(query, variables) {
|
|
58
|
+
try {
|
|
59
|
+
const headers = await this.getHeaders();
|
|
60
|
+
const response = await this.client.request({
|
|
61
|
+
method: "POST",
|
|
62
|
+
url: this.endpoint,
|
|
63
|
+
data: { query, variables },
|
|
64
|
+
headers,
|
|
65
|
+
});
|
|
66
|
+
return this.handleGraphQLResponse(response);
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
ErrorHandler.handle(error);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Executes a GraphQL mutation
|
|
74
|
+
* @param mutation The GraphQL mutation string
|
|
75
|
+
* @param variables Optional variables for the mutation
|
|
76
|
+
* @returns The mutation result
|
|
77
|
+
* @throws {HTTPError} For HTTP/network errors only
|
|
78
|
+
*/
|
|
79
|
+
async mutate(mutation, variables) {
|
|
80
|
+
try {
|
|
81
|
+
const headers = await this.getHeaders();
|
|
82
|
+
const response = await this.client.request({
|
|
83
|
+
method: "POST",
|
|
84
|
+
url: this.endpoint,
|
|
85
|
+
data: { query: mutation, variables },
|
|
86
|
+
headers,
|
|
87
|
+
});
|
|
88
|
+
return this.handleGraphQLResponse(response);
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
ErrorHandler.handle(error);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Cleanup all HTTP connections and resources
|
|
96
|
+
* Call this when the service is no longer needed
|
|
97
|
+
*/
|
|
98
|
+
async destroy() {
|
|
99
|
+
await this.client.destroy();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=graphql-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphql-service.js","sourceRoot":"","sources":["../../../../src/services/erp-api-services/graphql/graphql-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/services/erp-api-services/graphql/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
* ERP API Services for the MachineMetrics ERP Connector SDK.
|
|
3
3
|
* This file exports the public interfaces and types for ERP API services.
|
|
4
4
|
*/
|
|
5
|
-
export { RestAPIService } from "./rest/rest-api-service";
|
|
6
|
-
export type { QueryParams } from "./rest/get-query-params";
|
|
7
|
-
export { GraphQLService } from "./graphql/graphql-service";
|
|
8
|
-
export type { GraphQLServerError } from './graphql/types';
|
|
9
|
-
export { OAuthClient } from './oauth-client';
|
|
10
|
-
export type { OAuthConfig } from './oauth-client';
|
|
11
|
-
export type { APIResponse } from './types';
|
|
12
|
-
export { ErrorHandler, GraphQLError } from './errors';
|
|
5
|
+
export { RestAPIService } from "./rest/rest-api-service.js";
|
|
6
|
+
export type { QueryParams } from "./rest/get-query-params.js";
|
|
7
|
+
export { GraphQLService } from "./graphql/graphql-service.js";
|
|
8
|
+
export type { GraphQLServerError } from './graphql/types.js';
|
|
9
|
+
export { OAuthClient } from './oauth-client.js';
|
|
10
|
+
export type { OAuthConfig } from './oauth-client.js';
|
|
11
|
+
export type { APIResponse } from './types.js';
|
|
12
|
+
export { ErrorHandler, GraphQLError } from './errors.js';
|
|
13
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/erp-api-services/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/erp-api-services/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,YAAY,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAG9D,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAG7D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGrD,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ERP API Services for the MachineMetrics ERP Connector SDK.
|
|
3
|
+
* This file exports the public interfaces and types for ERP API services.
|
|
4
|
+
*/
|
|
5
|
+
// REST API Service
|
|
6
|
+
export { RestAPIService } from "./rest/rest-api-service.js";
|
|
7
|
+
// GraphQL Service
|
|
8
|
+
export { GraphQLService } from "./graphql/graphql-service.js";
|
|
9
|
+
// OAuth Client
|
|
10
|
+
export { OAuthClient } from './oauth-client.js';
|
|
11
|
+
// Error classes
|
|
12
|
+
export { ErrorHandler, GraphQLError } from './errors.js';
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/erp-api-services/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,mBAAmB;AACnB,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAG5D,kBAAkB;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAG9D,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAMhD,gBAAgB;AAChB,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A utility class for handling OAuth client credentials flow.
|
|
3
|
+
* This is specifically for the client credentials grant type,
|
|
4
|
+
* which is used for server-to-server authentication.
|
|
5
|
+
*/
|
|
6
|
+
export class OAuthClient {
|
|
7
|
+
config;
|
|
8
|
+
constructor(config) {
|
|
9
|
+
this.config = config;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Requests an OAuth token using the client credentials flow.
|
|
13
|
+
* The request is sent as application/x-www-form-urlencoded.
|
|
14
|
+
* @returns A promise that resolves to the token response containing access_token and expires_in
|
|
15
|
+
* @throws Error if the token request fails
|
|
16
|
+
*/
|
|
17
|
+
async getToken() {
|
|
18
|
+
const formData = new URLSearchParams({
|
|
19
|
+
grant_type: "client_credentials",
|
|
20
|
+
client_id: this.config.clientId,
|
|
21
|
+
client_secret: this.config.clientSecret,
|
|
22
|
+
scope: this.config.scope,
|
|
23
|
+
});
|
|
24
|
+
const response = await fetch(this.config.authUrl, {
|
|
25
|
+
method: "POST",
|
|
26
|
+
headers: {
|
|
27
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
28
|
+
},
|
|
29
|
+
body: formData,
|
|
30
|
+
});
|
|
31
|
+
if (!response.ok) {
|
|
32
|
+
throw new Error(`OAuth token request failed: ${response.statusText}`);
|
|
33
|
+
}
|
|
34
|
+
const data = (await response.json());
|
|
35
|
+
if (data.token_type !== "Bearer") {
|
|
36
|
+
throw new Error(`Unexpected token type: ${data.token_type}`);
|
|
37
|
+
}
|
|
38
|
+
return data;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=oauth-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth-client.js","sourceRoot":"","sources":["../../../src/services/erp-api-services/oauth-client.ts"],"names":[],"mappings":"AA8BA;;;;GAIG;AACH,MAAM,OAAO,WAAW;IACF;IAApB,YAAoB,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;IAAG,CAAC;IAE3C;;;;;OAKG;IACH,KAAK,CAAC,QAAQ;QACZ,MAAM,QAAQ,GAAG,IAAI,eAAe,CAAC;YACnC,UAAU,EAAE,oBAAoB;YAChC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;YAC/B,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY;YACvC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;SACzB,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;YAChD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,mCAAmC;aACpD;YACD,IAAI,EAAE,QAAQ;SACf,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAuB,CAAC;QAC3D,IAAI,IAAI,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAC/D,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF"}
|