@freighttech/shipment-tracking 0.6.0
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/LICENSE +21 -0
- package/NOTICE +25 -0
- package/dist/generated/entities/bic_config/index.js +21 -0
- package/dist/generated/entities/bic_config/index.js.map +7 -0
- package/dist/generated/entities/carrier_config/index.js +27 -0
- package/dist/generated/entities/carrier_config/index.js.map +7 -0
- package/dist/generated/entities/location_override/index.js +33 -0
- package/dist/generated/entities/location_override/index.js.map +7 -0
- package/dist/generated/entities/shipment/index.js +73 -0
- package/dist/generated/entities/shipment/index.js.map +7 -0
- package/dist/generated/entities/ships_go_config/index.js +31 -0
- package/dist/generated/entities/ships_go_config/index.js.map +7 -0
- package/dist/generated/entities/tracking_event/index.js +101 -0
- package/dist/generated/entities/tracking_event/index.js.map +7 -0
- package/dist/generated/entities/tracking_job/index.js +47 -0
- package/dist/generated/entities/tracking_job/index.js.map +7 -0
- package/dist/generated/entities/webhook/index.js +25 -0
- package/dist/generated/entities/webhook/index.js.map +7 -0
- package/dist/generated/entities/webhook_delivery/index.js +25 -0
- package/dist/generated/entities/webhook_delivery/index.js.map +7 -0
- package/dist/generated/entities.ids.generated.js +21 -0
- package/dist/generated/entities.ids.generated.js.map +7 -0
- package/dist/index.js +41 -0
- package/dist/index.js.map +7 -0
- package/dist/modules/shipment_tracking/acl.js +22 -0
- package/dist/modules/shipment_tracking/acl.js.map +7 -0
- package/dist/modules/shipment_tracking/api/bic-configs/route.js +176 -0
- package/dist/modules/shipment_tracking/api/bic-configs/route.js.map +7 -0
- package/dist/modules/shipment_tracking/api/bic-configs/test/route.js +95 -0
- package/dist/modules/shipment_tracking/api/bic-configs/test/route.js.map +7 -0
- package/dist/modules/shipment_tracking/api/cargo-events/route.js +93 -0
- package/dist/modules/shipment_tracking/api/cargo-events/route.js.map +7 -0
- package/dist/modules/shipment_tracking/api/carrier-configs/route.js +139 -0
- package/dist/modules/shipment_tracking/api/carrier-configs/route.js.map +7 -0
- package/dist/modules/shipment_tracking/api/dashboard/ships-map/route.js +177 -0
- package/dist/modules/shipment_tracking/api/dashboard/ships-map/route.js.map +7 -0
- package/dist/modules/shipment_tracking/api/location-overrides/route.js +179 -0
- package/dist/modules/shipment_tracking/api/location-overrides/route.js.map +7 -0
- package/dist/modules/shipment_tracking/api/openapi.js +27 -0
- package/dist/modules/shipment_tracking/api/openapi.js.map +7 -0
- package/dist/modules/shipment_tracking/api/shipments/route.js +192 -0
- package/dist/modules/shipment_tracking/api/shipments/route.js.map +7 -0
- package/dist/modules/shipment_tracking/api/shipsgo-configs/route.js +185 -0
- package/dist/modules/shipment_tracking/api/shipsgo-configs/route.js.map +7 -0
- package/dist/modules/shipment_tracking/api/tracking-jobs/route.js +144 -0
- package/dist/modules/shipment_tracking/api/tracking-jobs/route.js.map +7 -0
- package/dist/modules/shipment_tracking/api/tracking-jobs/sync/route.js +107 -0
- package/dist/modules/shipment_tracking/api/tracking-jobs/sync/route.js.map +7 -0
- package/dist/modules/shipment_tracking/api/utils.js +12 -0
- package/dist/modules/shipment_tracking/api/utils.js.map +7 -0
- package/dist/modules/shipment_tracking/api/webhooks/deliveries/route.js +76 -0
- package/dist/modules/shipment_tracking/api/webhooks/deliveries/route.js.map +7 -0
- package/dist/modules/shipment_tracking/api/webhooks/route.js +135 -0
- package/dist/modules/shipment_tracking/api/webhooks/route.js.map +7 -0
- package/dist/modules/shipment_tracking/api/webhooks/test/route.js +71 -0
- package/dist/modules/shipment_tracking/api/webhooks/test/route.js.map +7 -0
- package/dist/modules/shipment_tracking/assets/carriers/cma_cgm.png +0 -0
- package/dist/modules/shipment_tracking/assets/carriers/cosco.png +0 -0
- package/dist/modules/shipment_tracking/assets/carriers/evergreen.png +0 -0
- package/dist/modules/shipment_tracking/assets/carriers/hapag_lloyd.png +0 -0
- package/dist/modules/shipment_tracking/assets/carriers/maersk.png +0 -0
- package/dist/modules/shipment_tracking/assets/carriers/msc.png +0 -0
- package/dist/modules/shipment_tracking/assets/carriers/one.png +0 -0
- package/dist/modules/shipment_tracking/assets/carriers/oocl.png +0 -0
- package/dist/modules/shipment_tracking/assets/carriers/yang_ming.png +0 -0
- package/dist/modules/shipment_tracking/assets/carriers/zim.png +0 -0
- package/dist/modules/shipment_tracking/assets/index.js +52 -0
- package/dist/modules/shipment_tracking/assets/index.js.map +7 -0
- package/dist/modules/shipment_tracking/backend/carrier-configs/page.js +621 -0
- package/dist/modules/shipment_tracking/backend/carrier-configs/page.js.map +7 -0
- package/dist/modules/shipment_tracking/backend/carrier-configs/page.meta.js +19 -0
- package/dist/modules/shipment_tracking/backend/carrier-configs/page.meta.js.map +7 -0
- package/dist/modules/shipment_tracking/backend/location-overrides/page.js +198 -0
- package/dist/modules/shipment_tracking/backend/location-overrides/page.js.map +7 -0
- package/dist/modules/shipment_tracking/backend/location-overrides/page.meta.js +19 -0
- package/dist/modules/shipment_tracking/backend/location-overrides/page.meta.js.map +7 -0
- package/dist/modules/shipment_tracking/backend/shipment-tracking/page.js +279 -0
- package/dist/modules/shipment_tracking/backend/shipment-tracking/page.js.map +7 -0
- package/dist/modules/shipment_tracking/backend/shipment-tracking/page.meta.js +19 -0
- package/dist/modules/shipment_tracking/backend/shipment-tracking/page.meta.js.map +7 -0
- package/dist/modules/shipment_tracking/backend/tracking-jobs/page.js +10 -0
- package/dist/modules/shipment_tracking/backend/tracking-jobs/page.js.map +7 -0
- package/dist/modules/shipment_tracking/backend/tracking-jobs/page.meta.js +19 -0
- package/dist/modules/shipment_tracking/backend/tracking-jobs/page.meta.js.map +7 -0
- package/dist/modules/shipment_tracking/backend/webhooks/page.js +198 -0
- package/dist/modules/shipment_tracking/backend/webhooks/page.js.map +7 -0
- package/dist/modules/shipment_tracking/backend/webhooks/page.meta.js +19 -0
- package/dist/modules/shipment_tracking/backend/webhooks/page.meta.js.map +7 -0
- package/dist/modules/shipment_tracking/ce.js +52 -0
- package/dist/modules/shipment_tracking/ce.js.map +7 -0
- package/dist/modules/shipment_tracking/cli.js +229 -0
- package/dist/modules/shipment_tracking/cli.js.map +7 -0
- package/dist/modules/shipment_tracking/commands/bic-configs.js +66 -0
- package/dist/modules/shipment_tracking/commands/bic-configs.js.map +7 -0
- package/dist/modules/shipment_tracking/commands/carrier-configs.js +65 -0
- package/dist/modules/shipment_tracking/commands/carrier-configs.js.map +7 -0
- package/dist/modules/shipment_tracking/commands/index.js +9 -0
- package/dist/modules/shipment_tracking/commands/index.js.map +7 -0
- package/dist/modules/shipment_tracking/commands/location-overrides.js +93 -0
- package/dist/modules/shipment_tracking/commands/location-overrides.js.map +7 -0
- package/dist/modules/shipment_tracking/commands/shipments.js +200 -0
- package/dist/modules/shipment_tracking/commands/shipments.js.map +7 -0
- package/dist/modules/shipment_tracking/commands/shipsgo-configs.js +75 -0
- package/dist/modules/shipment_tracking/commands/shipsgo-configs.js.map +7 -0
- package/dist/modules/shipment_tracking/commands/tracking-jobs.js +120 -0
- package/dist/modules/shipment_tracking/commands/tracking-jobs.js.map +7 -0
- package/dist/modules/shipment_tracking/commands/tracking.js +140 -0
- package/dist/modules/shipment_tracking/commands/tracking.js.map +7 -0
- package/dist/modules/shipment_tracking/commands/webhooks.js +115 -0
- package/dist/modules/shipment_tracking/commands/webhooks.js.map +7 -0
- package/dist/modules/shipment_tracking/components/CombinedTimestampCell.js +168 -0
- package/dist/modules/shipment_tracking/components/CombinedTimestampCell.js.map +7 -0
- package/dist/modules/shipment_tracking/components/FacilityLocationInput.js +202 -0
- package/dist/modules/shipment_tracking/components/FacilityLocationInput.js.map +7 -0
- package/dist/modules/shipment_tracking/components/LocationOverrideDrawer.js +501 -0
- package/dist/modules/shipment_tracking/components/LocationOverrideDrawer.js.map +7 -0
- package/dist/modules/shipment_tracking/components/ShipmentDetailsDrawer.js +818 -0
- package/dist/modules/shipment_tracking/components/ShipmentDetailsDrawer.js.map +7 -0
- package/dist/modules/shipment_tracking/components/ShipmentDrawer.js +404 -0
- package/dist/modules/shipment_tracking/components/ShipmentDrawer.js.map +7 -0
- package/dist/modules/shipment_tracking/components/ShipsGoConfigSection.js +200 -0
- package/dist/modules/shipment_tracking/components/ShipsGoConfigSection.js.map +7 -0
- package/dist/modules/shipment_tracking/components/TimestampCell.js +108 -0
- package/dist/modules/shipment_tracking/components/TimestampCell.js.map +7 -0
- package/dist/modules/shipment_tracking/components/TrackingJobDrawer.js +343 -0
- package/dist/modules/shipment_tracking/components/TrackingJobDrawer.js.map +7 -0
- package/dist/modules/shipment_tracking/components/VesselTrackingMap.js +496 -0
- package/dist/modules/shipment_tracking/components/VesselTrackingMap.js.map +7 -0
- package/dist/modules/shipment_tracking/components/WebhookDrawer.js +332 -0
- package/dist/modules/shipment_tracking/components/WebhookDrawer.js.map +7 -0
- package/dist/modules/shipment_tracking/data/entities.js +686 -0
- package/dist/modules/shipment_tracking/data/entities.js.map +7 -0
- package/dist/modules/shipment_tracking/data/validators.js +434 -0
- package/dist/modules/shipment_tracking/data/validators.js.map +7 -0
- package/dist/modules/shipment_tracking/di.js +60 -0
- package/dist/modules/shipment_tracking/di.js.map +7 -0
- package/dist/modules/shipment_tracking/encryption.js +12 -0
- package/dist/modules/shipment_tracking/encryption.js.map +7 -0
- package/dist/modules/shipment_tracking/events.js +87 -0
- package/dist/modules/shipment_tracking/events.js.map +7 -0
- package/dist/modules/shipment_tracking/hooks/useVesselTracking.js +137 -0
- package/dist/modules/shipment_tracking/hooks/useVesselTracking.js.map +7 -0
- package/dist/modules/shipment_tracking/i18n/de.json +327 -0
- package/dist/modules/shipment_tracking/i18n/en.json +327 -0
- package/dist/modules/shipment_tracking/i18n/es.json +327 -0
- package/dist/modules/shipment_tracking/i18n/pl.json +327 -0
- package/dist/modules/shipment_tracking/index.js +15 -0
- package/dist/modules/shipment_tracking/index.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/adapters/cma-cgm.js +66 -0
- package/dist/modules/shipment_tracking/lib/adapters/cma-cgm.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/adapters/cosco-types.js +1 -0
- package/dist/modules/shipment_tracking/lib/adapters/cosco-types.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/adapters/cosco.js +236 -0
- package/dist/modules/shipment_tracking/lib/adapters/cosco.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/adapters/evergreen.js +87 -0
- package/dist/modules/shipment_tracking/lib/adapters/evergreen.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/adapters/hapag-lloyd.js +68 -0
- package/dist/modules/shipment_tracking/lib/adapters/hapag-lloyd.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/adapters/index.js +20 -0
- package/dist/modules/shipment_tracking/lib/adapters/index.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/adapters/maersk.js +84 -0
- package/dist/modules/shipment_tracking/lib/adapters/maersk.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/adapters/msc.js +170 -0
- package/dist/modules/shipment_tracking/lib/adapters/msc.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/adapters/zim.js +85 -0
- package/dist/modules/shipment_tracking/lib/adapters/zim.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/audit-helpers.js +20 -0
- package/dist/modules/shipment_tracking/lib/audit-helpers.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/auth/base64url.js +8 -0
- package/dist/modules/shipment_tracking/lib/auth/base64url.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/auth/oauth-client.js +38 -0
- package/dist/modules/shipment_tracking/lib/auth/oauth-client.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/background.js +15 -0
- package/dist/modules/shipment_tracking/lib/background.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/bic-api-client.js +106 -0
- package/dist/modules/shipment_tracking/lib/bic-api-client.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/carrier-adapter.js +17 -0
- package/dist/modules/shipment_tracking/lib/carrier-adapter.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/current-vessel.js +149 -0
- package/dist/modules/shipment_tracking/lib/current-vessel.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/dcsa-event-mapping.js +124 -0
- package/dist/modules/shipment_tracking/lib/dcsa-event-mapping.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/dcsa-event-parser.js +112 -0
- package/dist/modules/shipment_tracking/lib/dcsa-event-parser.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/dcsa-params.js +16 -0
- package/dist/modules/shipment_tracking/lib/dcsa-params.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/empty-return.js +48 -0
- package/dist/modules/shipment_tracking/lib/empty-return.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/location-overrides.js +85 -0
- package/dist/modules/shipment_tracking/lib/location-overrides.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/location-types.js +59 -0
- package/dist/modules/shipment_tracking/lib/location-types.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/logger.js +113 -0
- package/dist/modules/shipment_tracking/lib/logger.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/poi-event-processor.js +183 -0
- package/dist/modules/shipment_tracking/lib/poi-event-processor.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/poi-nats-config.js +52 -0
- package/dist/modules/shipment_tracking/lib/poi-nats-config.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/poi-types.js +43 -0
- package/dist/modules/shipment_tracking/lib/poi-types.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/rate-limiter.js +31 -0
- package/dist/modules/shipment_tracking/lib/rate-limiter.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/route-extraction.js +187 -0
- package/dist/modules/shipment_tracking/lib/route-extraction.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/route-inference.js +106 -0
- package/dist/modules/shipment_tracking/lib/route-inference.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/schedule-generator.js +63 -0
- package/dist/modules/shipment_tracking/lib/schedule-generator.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/shipsgo-client.js +143 -0
- package/dist/modules/shipment_tracking/lib/shipsgo-client.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/shipsgo-mapper.js +204 -0
- package/dist/modules/shipment_tracking/lib/shipsgo-mapper.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/status-machine.js +131 -0
- package/dist/modules/shipment_tracking/lib/status-machine.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/time-extraction.js +41 -0
- package/dist/modules/shipment_tracking/lib/time-extraction.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/timestamp-utils.js +100 -0
- package/dist/modules/shipment_tracking/lib/timestamp-utils.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/vessel-api.js +111 -0
- package/dist/modules/shipment_tracking/lib/vessel-api.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/vessel-cache.js +50 -0
- package/dist/modules/shipment_tracking/lib/vessel-cache.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/vessel-extraction.js +13 -0
- package/dist/modules/shipment_tracking/lib/vessel-extraction.js.map +7 -0
- package/dist/modules/shipment_tracking/lib/webhook-dispatcher.js +62 -0
- package/dist/modules/shipment_tracking/lib/webhook-dispatcher.js.map +7 -0
- package/dist/modules/shipment_tracking/migrations/Migration20260422161208_shipment_tracking.js +48 -0
- package/dist/modules/shipment_tracking/migrations/Migration20260422161208_shipment_tracking.js.map +7 -0
- package/dist/modules/shipment_tracking/migrations/Migration20260529120000_shipment_tracking_poi_region_names.js +15 -0
- package/dist/modules/shipment_tracking/migrations/Migration20260529120000_shipment_tracking_poi_region_names.js.map +7 -0
- package/dist/modules/shipment_tracking/migrations/Migration20260821120000_shipment_tracking_shipsgo.js +47 -0
- package/dist/modules/shipment_tracking/migrations/Migration20260821120000_shipment_tracking_shipsgo.js.map +7 -0
- package/dist/modules/shipment_tracking/notifications.js +145 -0
- package/dist/modules/shipment_tracking/notifications.js.map +7 -0
- package/dist/modules/shipment_tracking/services/carrierRegistry.js +24 -0
- package/dist/modules/shipment_tracking/services/carrierRegistry.js.map +7 -0
- package/dist/modules/shipment_tracking/services/poiNatsService.js +397 -0
- package/dist/modules/shipment_tracking/services/poiNatsService.js.map +7 -0
- package/dist/modules/shipment_tracking/services/shipsGoProvider.js +163 -0
- package/dist/modules/shipment_tracking/services/shipsGoProvider.js.map +7 -0
- package/dist/modules/shipment_tracking/services/trackingService.js +1283 -0
- package/dist/modules/shipment_tracking/services/trackingService.js.map +7 -0
- package/dist/modules/shipment_tracking/services/webhookService.js +263 -0
- package/dist/modules/shipment_tracking/services/webhookService.js.map +7 -0
- package/dist/modules/shipment_tracking/setup.js +72 -0
- package/dist/modules/shipment_tracking/setup.js.map +7 -0
- package/dist/modules/shipment_tracking/subscribers/cargo-event-created.js +60 -0
- package/dist/modules/shipment_tracking/subscribers/cargo-event-created.js.map +7 -0
- package/dist/modules/shipment_tracking/subscribers/dcsa-event-webhook-dispatch.js +58 -0
- package/dist/modules/shipment_tracking/subscribers/dcsa-event-webhook-dispatch.js.map +7 -0
- package/dist/modules/shipment_tracking/subscribers/poi-event-notification.js +82 -0
- package/dist/modules/shipment_tracking/subscribers/poi-event-notification.js.map +7 -0
- package/dist/modules/shipment_tracking/subscribers/poi-event-webhook-dispatch.js +53 -0
- package/dist/modules/shipment_tracking/subscribers/poi-event-webhook-dispatch.js.map +7 -0
- package/dist/modules/shipment_tracking/subscribers/shipment-status-changed.js +28 -0
- package/dist/modules/shipment_tracking/subscribers/shipment-status-changed.js.map +7 -0
- package/dist/modules/shipment_tracking/subscribers/terminal-event-ingest.js +67 -0
- package/dist/modules/shipment_tracking/subscribers/terminal-event-ingest.js.map +7 -0
- package/dist/modules/shipment_tracking/subscribers/tracking-job-initial-poll.js +30 -0
- package/dist/modules/shipment_tracking/subscribers/tracking-job-initial-poll.js.map +7 -0
- package/dist/modules/shipment_tracking/subscribers/tracking-job-webhook-dispatch.js +19 -0
- package/dist/modules/shipment_tracking/subscribers/tracking-job-webhook-dispatch.js.map +7 -0
- package/dist/modules/shipment_tracking/tables/index.js +6 -0
- package/dist/modules/shipment_tracking/tables/index.js.map +7 -0
- package/dist/modules/shipment_tracking/tables/tracking_job/table.client.js +284 -0
- package/dist/modules/shipment_tracking/tables/tracking_job/table.client.js.map +7 -0
- package/dist/modules/shipment_tracking/tables/tracking_job/table.js +36 -0
- package/dist/modules/shipment_tracking/tables/tracking_job/table.js.map +7 -0
- package/dist/modules/shipment_tracking/widgets/dashboard/ships-map/config.js +25 -0
- package/dist/modules/shipment_tracking/widgets/dashboard/ships-map/config.js.map +7 -0
- package/dist/modules/shipment_tracking/widgets/dashboard/ships-map/widget.client.js +355 -0
- package/dist/modules/shipment_tracking/widgets/dashboard/ships-map/widget.client.js.map +7 -0
- package/dist/modules/shipment_tracking/widgets/dashboard/ships-map/widget.js +26 -0
- package/dist/modules/shipment_tracking/widgets/dashboard/ships-map/widget.js.map +7 -0
- package/dist/types/assets.d.js +1 -0
- package/dist/types/assets.d.js.map +7 -0
- package/generated/entities/bic_config/index.ts +20 -0
- package/generated/entities/carrier_config/index.ts +23 -0
- package/generated/entities/location_override/index.ts +26 -0
- package/generated/entities/shipment/index.ts +46 -0
- package/generated/entities/ships_go_config/index.ts +25 -0
- package/generated/entities/tracking_event/index.ts +60 -0
- package/generated/entities/tracking_job/index.ts +33 -0
- package/generated/entities/webhook/index.ts +22 -0
- package/generated/entities/webhook_delivery/index.ts +22 -0
- package/generated/entities.ids.generated.ts +47 -0
- package/package.json +81 -0
- package/src/index.ts +39 -0
- package/src/modules/shipment_tracking/__integration__/TC-TRACK-410-shipsgo-config-api.spec.ts +133 -0
- package/src/modules/shipment_tracking/__integration__/meta.ts +4 -0
- package/src/modules/shipment_tracking/__tests__/empty-return-stop.test.ts +231 -0
- package/src/modules/shipment_tracking/__tests__/fixtures/hapag-lloyd-transship-container.json +702 -0
- package/src/modules/shipment_tracking/__tests__/fixtures/index.ts +434 -0
- package/src/modules/shipment_tracking/__tests__/fixtures/maersk-multi-transship-completed.json +1518 -0
- package/src/modules/shipment_tracking/__tests__/fixtures/maersk-transship-intransit.json +558 -0
- package/src/modules/shipment_tracking/__tests__/fixtures/msc-direct.json +222 -0
- package/src/modules/shipment_tracking/__tests__/fixtures/msc-multi-transship-completed.json +974 -0
- package/src/modules/shipment_tracking/__tests__/fixtures/msc-multi.json +4846 -0
- package/src/modules/shipment_tracking/__tests__/fixtures/msc-transship.json +409 -0
- package/src/modules/shipment_tracking/__tests__/fixtures/poi-events.json +240 -0
- package/src/modules/shipment_tracking/__tests__/fixtures/synthetic/index.ts +138 -0
- package/src/modules/shipment_tracking/__tests__/fixtures/synthetic-eta-updates.json +288 -0
- package/src/modules/shipment_tracking/__tests__/fixtures/synthetic-route-inference.json +201 -0
- package/src/modules/shipment_tracking/__tests__/fixtures/synthetic-voyage-progression.json +410 -0
- package/src/modules/shipment_tracking/__tests__/shipsgo-air-mapper.test.ts +157 -0
- package/src/modules/shipment_tracking/__tests__/shipsgo-client.test.ts +155 -0
- package/src/modules/shipment_tracking/__tests__/shipsgo-mapper.test.ts +201 -0
- package/src/modules/shipment_tracking/__tests__/shipsgo-poll.test.ts +357 -0
- package/src/modules/shipment_tracking/__tests__/shipsgo-provider.test.ts +364 -0
- package/src/modules/shipment_tracking/__tests__/trackingService.integration.test.ts +2248 -0
- package/src/modules/shipment_tracking/__tests__/webhookPayload.test.ts +151 -0
- package/src/modules/shipment_tracking/acl.ts +18 -0
- package/src/modules/shipment_tracking/api/bic-configs/route.ts +206 -0
- package/src/modules/shipment_tracking/api/bic-configs/test/route.ts +108 -0
- package/src/modules/shipment_tracking/api/cargo-events/route.ts +101 -0
- package/src/modules/shipment_tracking/api/carrier-configs/route.ts +142 -0
- package/src/modules/shipment_tracking/api/dashboard/ships-map/route.ts +246 -0
- package/src/modules/shipment_tracking/api/location-overrides/route.ts +185 -0
- package/src/modules/shipment_tracking/api/openapi.ts +28 -0
- package/src/modules/shipment_tracking/api/shipments/route.ts +197 -0
- package/src/modules/shipment_tracking/api/shipsgo-configs/route.ts +215 -0
- package/src/modules/shipment_tracking/api/tracking-jobs/route.ts +149 -0
- package/src/modules/shipment_tracking/api/tracking-jobs/sync/route.ts +116 -0
- package/src/modules/shipment_tracking/api/utils.ts +10 -0
- package/src/modules/shipment_tracking/api/webhooks/deliveries/route.ts +82 -0
- package/src/modules/shipment_tracking/api/webhooks/route.ts +138 -0
- package/src/modules/shipment_tracking/api/webhooks/test/route.ts +84 -0
- package/src/modules/shipment_tracking/assets/carriers/cma_cgm.png +0 -0
- package/src/modules/shipment_tracking/assets/carriers/cosco.png +0 -0
- package/src/modules/shipment_tracking/assets/carriers/evergreen.png +0 -0
- package/src/modules/shipment_tracking/assets/carriers/hapag_lloyd.png +0 -0
- package/src/modules/shipment_tracking/assets/carriers/maersk.png +0 -0
- package/src/modules/shipment_tracking/assets/carriers/msc.png +0 -0
- package/src/modules/shipment_tracking/assets/carriers/one.png +0 -0
- package/src/modules/shipment_tracking/assets/carriers/oocl.png +0 -0
- package/src/modules/shipment_tracking/assets/carriers/yang_ming.png +0 -0
- package/src/modules/shipment_tracking/assets/carriers/zim.png +0 -0
- package/src/modules/shipment_tracking/assets/index.ts +66 -0
- package/src/modules/shipment_tracking/backend/carrier-configs/page.meta.ts +16 -0
- package/src/modules/shipment_tracking/backend/carrier-configs/page.tsx +782 -0
- package/src/modules/shipment_tracking/backend/location-overrides/page.meta.ts +16 -0
- package/src/modules/shipment_tracking/backend/location-overrides/page.tsx +241 -0
- package/src/modules/shipment_tracking/backend/shipment-tracking/page.meta.ts +16 -0
- package/src/modules/shipment_tracking/backend/shipment-tracking/page.tsx +340 -0
- package/src/modules/shipment_tracking/backend/tracking-jobs/page.meta.ts +16 -0
- package/src/modules/shipment_tracking/backend/tracking-jobs/page.tsx +16 -0
- package/src/modules/shipment_tracking/backend/webhooks/page.meta.ts +16 -0
- package/src/modules/shipment_tracking/backend/webhooks/page.tsx +228 -0
- package/src/modules/shipment_tracking/ce.ts +48 -0
- package/src/modules/shipment_tracking/cli.ts +321 -0
- package/src/modules/shipment_tracking/commands/bic-configs.ts +94 -0
- package/src/modules/shipment_tracking/commands/carrier-configs.ts +89 -0
- package/src/modules/shipment_tracking/commands/index.ts +8 -0
- package/src/modules/shipment_tracking/commands/location-overrides.ts +119 -0
- package/src/modules/shipment_tracking/commands/shipments.ts +247 -0
- package/src/modules/shipment_tracking/commands/shipsgo-configs.ts +101 -0
- package/src/modules/shipment_tracking/commands/tracking-jobs.ts +158 -0
- package/src/modules/shipment_tracking/commands/tracking.ts +230 -0
- package/src/modules/shipment_tracking/commands/webhooks.ts +159 -0
- package/src/modules/shipment_tracking/components/CombinedTimestampCell.tsx +236 -0
- package/src/modules/shipment_tracking/components/FacilityLocationInput.tsx +235 -0
- package/src/modules/shipment_tracking/components/LocationOverrideDrawer.tsx +586 -0
- package/src/modules/shipment_tracking/components/ShipmentDetailsDrawer.tsx +1364 -0
- package/src/modules/shipment_tracking/components/ShipmentDrawer.tsx +498 -0
- package/src/modules/shipment_tracking/components/ShipsGoConfigSection.tsx +266 -0
- package/src/modules/shipment_tracking/components/TimestampCell.tsx +146 -0
- package/src/modules/shipment_tracking/components/TrackingJobDrawer.tsx +467 -0
- package/src/modules/shipment_tracking/components/VesselTrackingMap.tsx +761 -0
- package/src/modules/shipment_tracking/components/WebhookDrawer.tsx +434 -0
- package/src/modules/shipment_tracking/data/entities.ts +748 -0
- package/src/modules/shipment_tracking/data/validators.ts +523 -0
- package/src/modules/shipment_tracking/di.ts +73 -0
- package/src/modules/shipment_tracking/encryption.ts +17 -0
- package/src/modules/shipment_tracking/events.ts +122 -0
- package/src/modules/shipment_tracking/hooks/useVesselTracking.ts +297 -0
- package/src/modules/shipment_tracking/i18n/de.json +327 -0
- package/src/modules/shipment_tracking/i18n/en.json +327 -0
- package/src/modules/shipment_tracking/i18n/es.json +327 -0
- package/src/modules/shipment_tracking/i18n/pl.json +327 -0
- package/src/modules/shipment_tracking/index.ts +13 -0
- package/src/modules/shipment_tracking/lib/__tests__/dcsa-event-mapping.test.ts +385 -0
- package/src/modules/shipment_tracking/lib/__tests__/dcsa-event-parser.test.ts +398 -0
- package/src/modules/shipment_tracking/lib/__tests__/empty-return.test.ts +174 -0
- package/src/modules/shipment_tracking/lib/__tests__/poi-event-processor.test.ts +699 -0
- package/src/modules/shipment_tracking/lib/__tests__/route-inference.test.ts +402 -0
- package/src/modules/shipment_tracking/lib/__tests__/status-machine.test.ts +447 -0
- package/src/modules/shipment_tracking/lib/__tests__/time-extraction.test.ts +331 -0
- package/src/modules/shipment_tracking/lib/__tests__/timestamp-utils.test.ts +260 -0
- package/src/modules/shipment_tracking/lib/__tests__/vessel-api.test.ts +125 -0
- package/src/modules/shipment_tracking/lib/__tests__/vessel-extraction.test.ts +108 -0
- package/src/modules/shipment_tracking/lib/adapters/cma-cgm.ts +84 -0
- package/src/modules/shipment_tracking/lib/adapters/cosco-types.ts +145 -0
- package/src/modules/shipment_tracking/lib/adapters/cosco.ts +314 -0
- package/src/modules/shipment_tracking/lib/adapters/evergreen.ts +107 -0
- package/src/modules/shipment_tracking/lib/adapters/hapag-lloyd.ts +88 -0
- package/src/modules/shipment_tracking/lib/adapters/index.ts +18 -0
- package/src/modules/shipment_tracking/lib/adapters/maersk.ts +104 -0
- package/src/modules/shipment_tracking/lib/adapters/msc.ts +223 -0
- package/src/modules/shipment_tracking/lib/adapters/zim.ts +106 -0
- package/src/modules/shipment_tracking/lib/audit-helpers.ts +29 -0
- package/src/modules/shipment_tracking/lib/auth/base64url.ts +4 -0
- package/src/modules/shipment_tracking/lib/auth/oauth-client.ts +53 -0
- package/src/modules/shipment_tracking/lib/background.ts +24 -0
- package/src/modules/shipment_tracking/lib/bic-api-client.ts +199 -0
- package/src/modules/shipment_tracking/lib/carrier-adapter.ts +136 -0
- package/src/modules/shipment_tracking/lib/current-vessel.ts +274 -0
- package/src/modules/shipment_tracking/lib/dcsa-event-mapping.ts +202 -0
- package/src/modules/shipment_tracking/lib/dcsa-event-parser.ts +163 -0
- package/src/modules/shipment_tracking/lib/dcsa-params.ts +14 -0
- package/src/modules/shipment_tracking/lib/empty-return.ts +122 -0
- package/src/modules/shipment_tracking/lib/location-overrides.ts +150 -0
- package/src/modules/shipment_tracking/lib/location-types.ts +154 -0
- package/src/modules/shipment_tracking/lib/logger.ts +195 -0
- package/src/modules/shipment_tracking/lib/poi-event-processor.ts +302 -0
- package/src/modules/shipment_tracking/lib/poi-nats-config.ts +134 -0
- package/src/modules/shipment_tracking/lib/poi-types.ts +198 -0
- package/src/modules/shipment_tracking/lib/rate-limiter.ts +58 -0
- package/src/modules/shipment_tracking/lib/route-extraction.ts +439 -0
- package/src/modules/shipment_tracking/lib/route-inference.ts +238 -0
- package/src/modules/shipment_tracking/lib/schedule-generator.ts +92 -0
- package/src/modules/shipment_tracking/lib/shipsgo-client.ts +350 -0
- package/src/modules/shipment_tracking/lib/shipsgo-mapper.ts +296 -0
- package/src/modules/shipment_tracking/lib/status-machine.ts +230 -0
- package/src/modules/shipment_tracking/lib/time-extraction.ts +85 -0
- package/src/modules/shipment_tracking/lib/timestamp-utils.ts +244 -0
- package/src/modules/shipment_tracking/lib/vessel-api.ts +299 -0
- package/src/modules/shipment_tracking/lib/vessel-cache.ts +102 -0
- package/src/modules/shipment_tracking/lib/vessel-extraction.ts +39 -0
- package/src/modules/shipment_tracking/lib/webhook-dispatcher.ts +93 -0
- package/src/modules/shipment_tracking/migrations/.snapshot-open-mercato.json +2914 -0
- package/src/modules/shipment_tracking/migrations/Migration20260422161208_shipment_tracking.ts +60 -0
- package/src/modules/shipment_tracking/migrations/Migration20260529120000_shipment_tracking_poi_region_names.ts +22 -0
- package/src/modules/shipment_tracking/migrations/Migration20260821120000_shipment_tracking_shipsgo.ts +65 -0
- package/src/modules/shipment_tracking/notifications.ts +151 -0
- package/src/modules/shipment_tracking/services/carrierRegistry.ts +29 -0
- package/src/modules/shipment_tracking/services/poiNatsService.ts +526 -0
- package/src/modules/shipment_tracking/services/shipsGoProvider.ts +231 -0
- package/src/modules/shipment_tracking/services/trackingService.ts +1777 -0
- package/src/modules/shipment_tracking/services/webhookService.ts +347 -0
- package/src/modules/shipment_tracking/setup.ts +99 -0
- package/src/modules/shipment_tracking/subscribers/__tests__/terminal-event-ingest.test.ts +141 -0
- package/src/modules/shipment_tracking/subscribers/cargo-event-created.ts +115 -0
- package/src/modules/shipment_tracking/subscribers/dcsa-event-webhook-dispatch.ts +115 -0
- package/src/modules/shipment_tracking/subscribers/poi-event-notification.ts +144 -0
- package/src/modules/shipment_tracking/subscribers/poi-event-webhook-dispatch.ts +94 -0
- package/src/modules/shipment_tracking/subscribers/shipment-status-changed.ts +41 -0
- package/src/modules/shipment_tracking/subscribers/terminal-event-ingest.ts +109 -0
- package/src/modules/shipment_tracking/subscribers/tracking-job-initial-poll.ts +53 -0
- package/src/modules/shipment_tracking/subscribers/tracking-job-webhook-dispatch.ts +50 -0
- package/src/modules/shipment_tracking/tables/index.ts +4 -0
- package/src/modules/shipment_tracking/tables/tracking_job/table.client.tsx +337 -0
- package/src/modules/shipment_tracking/tables/tracking_job/table.ts +34 -0
- package/src/modules/shipment_tracking/widgets/dashboard/ships-map/config.ts +32 -0
- package/src/modules/shipment_tracking/widgets/dashboard/ships-map/widget.client.tsx +448 -0
- package/src/modules/shipment_tracking/widgets/dashboard/ships-map/widget.ts +25 -0
- package/src/types/assets.d.ts +5 -0
|
@@ -0,0 +1,523 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
|
|
3
|
+
const uuid = () => z.string().uuid()
|
|
4
|
+
|
|
5
|
+
const scopedSchema = z.object({
|
|
6
|
+
organizationId: uuid(),
|
|
7
|
+
tenantId: uuid(),
|
|
8
|
+
})
|
|
9
|
+
|
|
10
|
+
// ─── Timestamp Schemas ───────────────────────────────────────
|
|
11
|
+
|
|
12
|
+
export const timestampSourceSchema = z.enum(['carrier_api', 'manual', 'ais', 'port', 'edi'])
|
|
13
|
+
export type TimestampSourceInput = z.infer<typeof timestampSourceSchema>
|
|
14
|
+
|
|
15
|
+
export const shipmentTimestampEntrySchema = z.object({
|
|
16
|
+
value: z.string().datetime({ message: 'Must be ISO 8601 datetime' }),
|
|
17
|
+
offset: z.string().regex(/^[+-]\d{2}:\d{2}$|^Z$/, 'Must be timezone offset like +08:00 or Z').nullable(),
|
|
18
|
+
source: timestampSourceSchema,
|
|
19
|
+
updatedAt: z.string().datetime({ message: 'Must be ISO 8601 datetime' }),
|
|
20
|
+
sourceEventId: z.string().nullable().optional(),
|
|
21
|
+
})
|
|
22
|
+
export type ShipmentTimestampEntryInput = z.infer<typeof shipmentTimestampEntrySchema>
|
|
23
|
+
|
|
24
|
+
export const timestampEntryInputSchema = z.object({
|
|
25
|
+
value: z.string().datetime({ message: 'Must be ISO 8601 datetime' }),
|
|
26
|
+
offset: z.string().regex(/^[+-]\d{2}:\d{2}$|^Z$/, 'Must be timezone offset like +08:00 or Z').nullable().optional(),
|
|
27
|
+
source: timestampSourceSchema,
|
|
28
|
+
sourceEventId: z.string().nullable().optional(),
|
|
29
|
+
})
|
|
30
|
+
export type TimestampEntryInput = z.infer<typeof timestampEntryInputSchema>
|
|
31
|
+
|
|
32
|
+
// UN/LOCODE format: 2 uppercase letters (country) + 3 alphanumeric characters (location)
|
|
33
|
+
// Example: PLGDY (Poland, Gdynia), CRMOB (Costa Rica, Moín), BEANR (Belgium, Antwerp)
|
|
34
|
+
export const unLocodeSchema = z.string()
|
|
35
|
+
.trim()
|
|
36
|
+
.toUpperCase()
|
|
37
|
+
.length(5, 'UN/LOCODE must be exactly 5 characters')
|
|
38
|
+
.regex(/^[A-Z]{2}[A-Z0-9]{3}$/, 'Invalid UN/LOCODE format (expected: 2 letters + 3 alphanumeric)')
|
|
39
|
+
|
|
40
|
+
// Optional UN/LOCODE - will be auto-inferred from tracking events if not provided
|
|
41
|
+
export const optionalUnLocodeSchema = unLocodeSchema.optional()
|
|
42
|
+
|
|
43
|
+
// ─── Enums ───────────────────────────────────────────────────
|
|
44
|
+
|
|
45
|
+
export const shipmentStatusSchema = z.enum(['PENDING', 'BOOKED', 'DEPARTED', 'IN_TRANSIT', 'PRE_ARRIVAL', 'ARRIVED', 'DELIVERED'])
|
|
46
|
+
export type ShipmentStatus = z.infer<typeof shipmentStatusSchema>
|
|
47
|
+
|
|
48
|
+
export const trackingEventSourceSchema = z.enum(['dcsa', 'ais', 'port', 'edi', 'manual', 'shipsgo'])
|
|
49
|
+
export type TrackingEventSource = z.infer<typeof trackingEventSourceSchema>
|
|
50
|
+
|
|
51
|
+
export const trackingReferenceTypeSchema = z.enum(['container', 'booking', 'bol', 'awb'])
|
|
52
|
+
export type TrackingReferenceType = z.infer<typeof trackingReferenceTypeSchema>
|
|
53
|
+
|
|
54
|
+
export const trackingProviderSchema = z.enum(['carrier', 'shipsgo'])
|
|
55
|
+
export type TrackingProvider = z.infer<typeof trackingProviderSchema>
|
|
56
|
+
|
|
57
|
+
export const trackingModeSchema = z.enum(['ocean', 'air'])
|
|
58
|
+
export type TrackingMode = z.infer<typeof trackingModeSchema>
|
|
59
|
+
|
|
60
|
+
// ─── Facility Location (JSONB) ───────────────────────────────
|
|
61
|
+
|
|
62
|
+
export const facilityCodeListProviderSchema = z.enum(['BIC', 'SMDG'])
|
|
63
|
+
export type FacilityCodeListProvider = z.infer<typeof facilityCodeListProviderSchema>
|
|
64
|
+
|
|
65
|
+
export const facilityLocationSourceSchema = z.enum(['dcsa', 'bic', 'manual'])
|
|
66
|
+
export type FacilityLocationSource = z.infer<typeof facilityLocationSourceSchema>
|
|
67
|
+
|
|
68
|
+
export const coordsSchema = z.object({
|
|
69
|
+
latitude: z.number(),
|
|
70
|
+
longitude: z.number(),
|
|
71
|
+
})
|
|
72
|
+
export type Coords = z.infer<typeof coordsSchema>
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Rich location data for origin, destination, or transshipment points.
|
|
76
|
+
* Combines port-level (UN/LOCODE) with facility-level (terminal) details.
|
|
77
|
+
*/
|
|
78
|
+
export const facilityLocationSchema = z.object({
|
|
79
|
+
// Display name (terminal or port name)
|
|
80
|
+
name: z.string(),
|
|
81
|
+
|
|
82
|
+
// Port-level identifiers
|
|
83
|
+
unlocode: z.string().nullable(), // UN/LOCODE (e.g., "PLGDN")
|
|
84
|
+
countryCode: z.string().nullable(), // ISO 3166-1 alpha-2 (e.g., "PL")
|
|
85
|
+
|
|
86
|
+
// Facility/terminal identifiers (separate fields)
|
|
87
|
+
facilityCode: z.string().nullable(), // SMDG/BIC code (e.g., "DCT")
|
|
88
|
+
facilityCodeListProvider: facilityCodeListProviderSchema.nullable(),
|
|
89
|
+
facilityTypeCode: z.string().nullable(), // POTE (port terminal), DEPO (depot), etc.
|
|
90
|
+
|
|
91
|
+
// Address (from DCSA otherFacility or BIC API)
|
|
92
|
+
address: z.string().nullable(), // Full address string
|
|
93
|
+
|
|
94
|
+
// Coordinates
|
|
95
|
+
coords: coordsSchema.nullable(),
|
|
96
|
+
|
|
97
|
+
// Operator (from BIC API enrichment only)
|
|
98
|
+
operatorName: z.string().nullable(),
|
|
99
|
+
|
|
100
|
+
// Source of the data
|
|
101
|
+
source: facilityLocationSourceSchema,
|
|
102
|
+
})
|
|
103
|
+
export type FacilityLocationInput = z.infer<typeof facilityLocationSchema>
|
|
104
|
+
|
|
105
|
+
// ─── Route & Event Entries (JSONB) ───────────────────────────
|
|
106
|
+
|
|
107
|
+
export const routeStopEntrySchema = z.object({
|
|
108
|
+
location: z.string(),
|
|
109
|
+
unlocode: z.string().nullable().optional(),
|
|
110
|
+
type: z.enum(['origin', 'transshipment', 'destination']),
|
|
111
|
+
vesselName: z.string().nullable().optional(),
|
|
112
|
+
ata: z.string().nullable().optional(), // Actual arrival
|
|
113
|
+
atd: z.string().nullable().optional(), // Actual departure
|
|
114
|
+
eta: z.string().nullable().optional(), // Estimated arrival (for delay calculation)
|
|
115
|
+
etd: z.string().nullable().optional(), // Estimated departure (for delay calculation)
|
|
116
|
+
// Facility/terminal details
|
|
117
|
+
facilityCode: z.string().nullable().optional(),
|
|
118
|
+
facilityCodeListProvider: facilityCodeListProviderSchema.nullable().optional(),
|
|
119
|
+
facilityTypeCode: z.string().nullable().optional(),
|
|
120
|
+
facilityAddress: z.string().nullable().optional(),
|
|
121
|
+
coords: coordsSchema.nullable().optional(),
|
|
122
|
+
})
|
|
123
|
+
export type RouteStopEntryInput = z.infer<typeof routeStopEntrySchema>
|
|
124
|
+
|
|
125
|
+
// Seal information (from DCSA events)
|
|
126
|
+
export const sealInfoSchema = z.object({
|
|
127
|
+
number: z.string(),
|
|
128
|
+
source: z.string().nullable().optional(), // CAR, SHI, TER, CUS
|
|
129
|
+
type: z.string().nullable().optional(),
|
|
130
|
+
})
|
|
131
|
+
export type SealInfoInput = z.infer<typeof sealInfoSchema>
|
|
132
|
+
|
|
133
|
+
export const cargoEventEntrySchema = z.object({
|
|
134
|
+
id: z.string(),
|
|
135
|
+
eventType: z.string(),
|
|
136
|
+
eventCode: z.string(),
|
|
137
|
+
eventClassifierCode: z.enum(['ACT', 'PLN', 'EST']).nullable().optional(),
|
|
138
|
+
eventDateTime: z.string(),
|
|
139
|
+
description: z.string().nullable().optional(),
|
|
140
|
+
locationName: z.string().nullable().optional(),
|
|
141
|
+
locationUnlocode: z.string().nullable().optional(),
|
|
142
|
+
vesselName: z.string().nullable().optional(),
|
|
143
|
+
vesselImo: z.string().nullable().optional(),
|
|
144
|
+
voyageNumber: z.string().nullable().optional(),
|
|
145
|
+
isTransshipmentMove: z.boolean().nullable().optional(),
|
|
146
|
+
// Facility/terminal details
|
|
147
|
+
facilityCode: z.string().nullable().optional(),
|
|
148
|
+
facilityCodeListProvider: facilityCodeListProviderSchema.nullable().optional(),
|
|
149
|
+
facilityTypeCode: z.string().nullable().optional(),
|
|
150
|
+
facilityAddress: z.string().nullable().optional(),
|
|
151
|
+
latitude: z.number().nullable().optional(),
|
|
152
|
+
longitude: z.number().nullable().optional(),
|
|
153
|
+
// Seal information
|
|
154
|
+
seals: z.array(sealInfoSchema).nullable().optional(),
|
|
155
|
+
})
|
|
156
|
+
export type CargoEventEntryInput = z.infer<typeof cargoEventEntrySchema>
|
|
157
|
+
|
|
158
|
+
// ─── Shipment ────────────────────────────────────────────────
|
|
159
|
+
|
|
160
|
+
export const shipmentCreateSchema = scopedSchema.extend({
|
|
161
|
+
// Optional: link to existing tracking job
|
|
162
|
+
trackingJobId: uuid().optional(),
|
|
163
|
+
carrierCode: z.string().trim().max(20).optional(),
|
|
164
|
+
containerNumber: z.string().trim().max(50).optional(),
|
|
165
|
+
bookingNumber: z.string().trim().max(100).optional(),
|
|
166
|
+
bolNumber: z.string().trim().max(100).optional(),
|
|
167
|
+
// Multi-source timestamps (JSONB arrays)
|
|
168
|
+
etdTimestamps: z.array(shipmentTimestampEntrySchema).optional(),
|
|
169
|
+
etaTimestamps: z.array(shipmentTimestampEntrySchema).optional(),
|
|
170
|
+
atdTimestamps: z.array(shipmentTimestampEntrySchema).optional(),
|
|
171
|
+
ataTimestamps: z.array(shipmentTimestampEntrySchema).optional(),
|
|
172
|
+
// Location data (JSONB)
|
|
173
|
+
originLocation: facilityLocationSchema.optional(),
|
|
174
|
+
destinationLocation: facilityLocationSchema.optional(),
|
|
175
|
+
vesselName: z.string().trim().max(200).optional(),
|
|
176
|
+
vesselImo: z.string().trim().max(20).optional(),
|
|
177
|
+
voyageNumber: z.string().trim().max(50).optional(),
|
|
178
|
+
extra: z.record(z.string(), z.unknown()).optional(),
|
|
179
|
+
})
|
|
180
|
+
|
|
181
|
+
export const shipmentUpdateSchema = z.object({
|
|
182
|
+
id: uuid(),
|
|
183
|
+
}).merge(
|
|
184
|
+
scopedSchema.extend({
|
|
185
|
+
trackingJobId: uuid().optional().nullable(),
|
|
186
|
+
carrierCode: z.string().trim().max(20).optional().nullable(),
|
|
187
|
+
containerNumber: z.string().trim().max(50).optional().nullable(),
|
|
188
|
+
bookingNumber: z.string().trim().max(100).optional().nullable(),
|
|
189
|
+
bolNumber: z.string().trim().max(100).optional().nullable(),
|
|
190
|
+
status: shipmentStatusSchema.optional(),
|
|
191
|
+
// Multi-source timestamps - can replace entire arrays or add entries
|
|
192
|
+
etdTimestamps: z.array(shipmentTimestampEntrySchema).optional().nullable(),
|
|
193
|
+
etaTimestamps: z.array(shipmentTimestampEntrySchema).optional().nullable(),
|
|
194
|
+
atdTimestamps: z.array(shipmentTimestampEntrySchema).optional().nullable(),
|
|
195
|
+
ataTimestamps: z.array(shipmentTimestampEntrySchema).optional().nullable(),
|
|
196
|
+
// Add single timestamp entries (convenience for manual updates)
|
|
197
|
+
addEtdTimestamp: timestampEntryInputSchema.optional(),
|
|
198
|
+
addEtaTimestamp: timestampEntryInputSchema.optional(),
|
|
199
|
+
addAtdTimestamp: timestampEntryInputSchema.optional(),
|
|
200
|
+
addAtaTimestamp: timestampEntryInputSchema.optional(),
|
|
201
|
+
// Location data (JSONB)
|
|
202
|
+
originLocation: facilityLocationSchema.optional().nullable(),
|
|
203
|
+
destinationLocation: facilityLocationSchema.optional().nullable(),
|
|
204
|
+
vesselName: z.string().trim().max(200).optional().nullable(),
|
|
205
|
+
vesselImo: z.string().trim().max(20).optional().nullable(),
|
|
206
|
+
voyageNumber: z.string().trim().max(50).optional().nullable(),
|
|
207
|
+
extra: z.record(z.string(), z.unknown()).optional().nullable(),
|
|
208
|
+
}).partial(),
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
export const shipmentListSchema = z.object({
|
|
212
|
+
id: z.string().uuid().optional(),
|
|
213
|
+
page: z.coerce.number().min(1).default(1),
|
|
214
|
+
pageSize: z.coerce.number().min(1).max(100).default(50),
|
|
215
|
+
search: z.string().optional(),
|
|
216
|
+
status: z.string().optional(),
|
|
217
|
+
carrierCode: z.string().optional(),
|
|
218
|
+
sortField: z.string().optional(),
|
|
219
|
+
sortDir: z.enum(['asc', 'desc']).optional(),
|
|
220
|
+
}).passthrough()
|
|
221
|
+
|
|
222
|
+
export type ShipmentCreateInput = z.infer<typeof shipmentCreateSchema>
|
|
223
|
+
export type ShipmentUpdateInput = z.infer<typeof shipmentUpdateSchema>
|
|
224
|
+
|
|
225
|
+
// ─── TrackingJob ─────────────────────────────────────────────
|
|
226
|
+
|
|
227
|
+
export const trackingJobCreateSchema = scopedSchema.extend({
|
|
228
|
+
carrierCode: z.string().trim().min(1).max(50),
|
|
229
|
+
referenceType: trackingReferenceTypeSchema,
|
|
230
|
+
referenceValue: z.string().trim().min(1).max(100),
|
|
231
|
+
// Origin/destination are optional - will be auto-inferred from tracking events if not provided
|
|
232
|
+
originUnlocode: optionalUnLocodeSchema,
|
|
233
|
+
destinationUnlocode: optionalUnLocodeSchema,
|
|
234
|
+
schedule: z.array(z.string()).optional(),
|
|
235
|
+
})
|
|
236
|
+
|
|
237
|
+
export const trackingJobUpdateSchema = z.object({
|
|
238
|
+
id: uuid(),
|
|
239
|
+
}).merge(
|
|
240
|
+
scopedSchema.extend({
|
|
241
|
+
status: z.enum(['active', 'paused', 'deactivated', 'failed', 'completed']).optional(),
|
|
242
|
+
schedule: z.array(z.string()).optional().nullable(),
|
|
243
|
+
nextPollAt: z.coerce.date().optional().nullable(),
|
|
244
|
+
}).partial(),
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
export const trackingJobListSchema = z.object({
|
|
248
|
+
page: z.coerce.number().min(1).default(1),
|
|
249
|
+
pageSize: z.coerce.number().min(1).max(100).default(50),
|
|
250
|
+
status: z.string().optional(),
|
|
251
|
+
carrierCode: z.string().optional(),
|
|
252
|
+
referenceType: z.string().optional(),
|
|
253
|
+
referenceValue: z.string().optional(),
|
|
254
|
+
sortField: z.string().optional(),
|
|
255
|
+
sortDir: z.enum(['asc', 'desc']).optional(),
|
|
256
|
+
}).passthrough()
|
|
257
|
+
|
|
258
|
+
export type TrackingJobCreateInput = z.infer<typeof trackingJobCreateSchema>
|
|
259
|
+
export type TrackingJobUpdateInput = z.infer<typeof trackingJobUpdateSchema>
|
|
260
|
+
|
|
261
|
+
// ─── TrackingEvent ───────────────────────────────────────────
|
|
262
|
+
|
|
263
|
+
export const trackingEventListSchema = z.object({
|
|
264
|
+
page: z.coerce.number().min(1).default(1),
|
|
265
|
+
pageSize: z.coerce.number().min(1).max(100).default(50),
|
|
266
|
+
trackingJobId: uuid().optional(),
|
|
267
|
+
equipmentReference: z.string().optional(),
|
|
268
|
+
source: trackingEventSourceSchema.optional(),
|
|
269
|
+
eventType: z.string().optional(),
|
|
270
|
+
eventCode: z.string().optional(),
|
|
271
|
+
sortField: z.string().optional(),
|
|
272
|
+
sortDir: z.enum(['asc', 'desc']).optional(),
|
|
273
|
+
}).passthrough()
|
|
274
|
+
|
|
275
|
+
/** @deprecated Use trackingEventListSchema instead */
|
|
276
|
+
export const cargoEventListSchema = trackingEventListSchema
|
|
277
|
+
|
|
278
|
+
// ─── CarrierConfig ───────────────────────────────────────────
|
|
279
|
+
|
|
280
|
+
export const carrierConfigCreateSchema = scopedSchema.extend({
|
|
281
|
+
carrierCode: z.string().trim().min(1).max(50),
|
|
282
|
+
apiEndpoint: z.string().trim().url().max(500).optional(),
|
|
283
|
+
authConfig: z.record(z.string(), z.unknown()).optional(),
|
|
284
|
+
rateLimitRequests: z.coerce.number().int().min(1).max(10000).default(60),
|
|
285
|
+
rateLimitWindowSeconds: z.coerce.number().int().min(1).max(86400).default(60),
|
|
286
|
+
isActive: z.boolean().default(true),
|
|
287
|
+
})
|
|
288
|
+
|
|
289
|
+
export const carrierConfigUpdateSchema = z.object({
|
|
290
|
+
id: uuid(),
|
|
291
|
+
}).merge(
|
|
292
|
+
scopedSchema.extend({
|
|
293
|
+
apiEndpoint: z.string().trim().url().max(500).optional().nullable(),
|
|
294
|
+
authConfig: z.record(z.string(), z.unknown()).optional().nullable(),
|
|
295
|
+
rateLimitRequests: z.coerce.number().int().min(1).max(10000).optional(),
|
|
296
|
+
rateLimitWindowSeconds: z.coerce.number().int().min(1).max(86400).optional(),
|
|
297
|
+
isActive: z.boolean().optional(),
|
|
298
|
+
}).partial(),
|
|
299
|
+
)
|
|
300
|
+
|
|
301
|
+
export const carrierConfigListSchema = z.object({
|
|
302
|
+
page: z.coerce.number().min(1).default(1),
|
|
303
|
+
pageSize: z.coerce.number().min(1).max(100).default(50),
|
|
304
|
+
carrierCode: z.string().optional(),
|
|
305
|
+
isActive: z.string().optional(),
|
|
306
|
+
sortField: z.string().optional(),
|
|
307
|
+
sortDir: z.enum(['asc', 'desc']).optional(),
|
|
308
|
+
}).passthrough()
|
|
309
|
+
|
|
310
|
+
export type CarrierConfigCreateInput = z.infer<typeof carrierConfigCreateSchema>
|
|
311
|
+
export type CarrierConfigUpdateInput = z.infer<typeof carrierConfigUpdateSchema>
|
|
312
|
+
|
|
313
|
+
// ─── BicConfig ───────────────────────────────────────────────
|
|
314
|
+
|
|
315
|
+
export const bicConfigUpsertSchema = scopedSchema.extend({
|
|
316
|
+
isEnabled: z.boolean().default(false),
|
|
317
|
+
username: z.string().trim().min(1, 'Username is required').max(200),
|
|
318
|
+
password: z.string().trim().min(1, 'Password is required').max(500),
|
|
319
|
+
baseUrl: z.string().trim().url().max(500).default('https://api.bic-code.org'),
|
|
320
|
+
})
|
|
321
|
+
|
|
322
|
+
export const bicConfigResponseSchema = z.object({
|
|
323
|
+
id: uuid(),
|
|
324
|
+
organizationId: uuid(),
|
|
325
|
+
tenantId: uuid(),
|
|
326
|
+
isEnabled: z.boolean(),
|
|
327
|
+
username: z.string(),
|
|
328
|
+
// Password is NOT included in response for security
|
|
329
|
+
baseUrl: z.string(),
|
|
330
|
+
createdAt: z.string(),
|
|
331
|
+
updatedAt: z.string(),
|
|
332
|
+
})
|
|
333
|
+
|
|
334
|
+
export const bicConfigTestSchema = scopedSchema.extend({
|
|
335
|
+
username: z.string().trim().min(1),
|
|
336
|
+
password: z.string().trim().min(1),
|
|
337
|
+
baseUrl: z.string().trim().url().default('https://api.bic-code.org'),
|
|
338
|
+
})
|
|
339
|
+
|
|
340
|
+
export type BicConfigUpsertInput = z.infer<typeof bicConfigUpsertSchema>
|
|
341
|
+
export type BicConfigResponse = z.infer<typeof bicConfigResponseSchema>
|
|
342
|
+
export type BicConfigTestInput = z.infer<typeof bicConfigTestSchema>
|
|
343
|
+
|
|
344
|
+
// ─── ShipsGoConfig ───────────────────────────────────────────
|
|
345
|
+
// One row per organization/tenant. Upsert semantics (like BicConfig). The API
|
|
346
|
+
// token is write-only in responses; on update the sentinel '__UNCHANGED__'
|
|
347
|
+
// leaves the stored token intact.
|
|
348
|
+
|
|
349
|
+
export const shipsGoConfigUpsertSchema = scopedSchema.extend({
|
|
350
|
+
isEnabled: z.boolean().default(false),
|
|
351
|
+
apiToken: z.string().trim().min(1, 'API token is required').max(500),
|
|
352
|
+
baseUrl: z.string().trim().url().max(500).default('https://api.shipsgo.com/v2'),
|
|
353
|
+
oceanEnabled: z.boolean().default(true),
|
|
354
|
+
airEnabled: z.boolean().default(true),
|
|
355
|
+
rateLimitRequests: z.coerce.number().int().min(1).max(10000).default(60),
|
|
356
|
+
rateLimitWindowSeconds: z.coerce.number().int().min(1).max(86400).default(60),
|
|
357
|
+
})
|
|
358
|
+
|
|
359
|
+
export const shipsGoConfigResponseSchema = z.object({
|
|
360
|
+
id: uuid(),
|
|
361
|
+
organizationId: uuid(),
|
|
362
|
+
tenantId: uuid(),
|
|
363
|
+
isEnabled: z.boolean(),
|
|
364
|
+
// apiToken is NOT included in responses for security
|
|
365
|
+
baseUrl: z.string(),
|
|
366
|
+
oceanEnabled: z.boolean(),
|
|
367
|
+
airEnabled: z.boolean(),
|
|
368
|
+
rateLimitRequests: z.number(),
|
|
369
|
+
rateLimitWindowSeconds: z.number(),
|
|
370
|
+
createdAt: z.string(),
|
|
371
|
+
updatedAt: z.string(),
|
|
372
|
+
})
|
|
373
|
+
|
|
374
|
+
export type ShipsGoConfigUpsertInput = z.infer<typeof shipsGoConfigUpsertSchema>
|
|
375
|
+
export type ShipsGoConfigResponse = z.infer<typeof shipsGoConfigResponseSchema>
|
|
376
|
+
|
|
377
|
+
// ─── Webhook ─────────────────────────────────────────────────
|
|
378
|
+
|
|
379
|
+
export const webhookCreateSchema = scopedSchema.extend({
|
|
380
|
+
url: z.string().trim().url().max(500),
|
|
381
|
+
eventsSubscribed: z.array(z.string().trim().min(1)).min(1),
|
|
382
|
+
hmacSecret: z.string().trim().max(256).optional(),
|
|
383
|
+
isActive: z.boolean().default(true),
|
|
384
|
+
})
|
|
385
|
+
|
|
386
|
+
export const webhookUpdateSchema = z.object({
|
|
387
|
+
id: uuid(),
|
|
388
|
+
}).merge(
|
|
389
|
+
scopedSchema.extend({
|
|
390
|
+
url: z.string().trim().url().max(500).optional(),
|
|
391
|
+
eventsSubscribed: z.array(z.string().trim().min(1)).min(1).optional(),
|
|
392
|
+
hmacSecret: z.string().trim().max(256).optional().nullable(),
|
|
393
|
+
isActive: z.boolean().optional(),
|
|
394
|
+
}).partial(),
|
|
395
|
+
)
|
|
396
|
+
|
|
397
|
+
export const webhookListSchema = z.object({
|
|
398
|
+
id: z.string().uuid().optional(),
|
|
399
|
+
page: z.coerce.number().min(1).default(1),
|
|
400
|
+
pageSize: z.coerce.number().min(1).max(100).default(50),
|
|
401
|
+
isActive: z.string().optional(),
|
|
402
|
+
sortField: z.string().optional(),
|
|
403
|
+
sortDir: z.enum(['asc', 'desc']).optional(),
|
|
404
|
+
}).passthrough()
|
|
405
|
+
|
|
406
|
+
export type WebhookCreateInput = z.infer<typeof webhookCreateSchema>
|
|
407
|
+
export type WebhookUpdateInput = z.infer<typeof webhookUpdateSchema>
|
|
408
|
+
|
|
409
|
+
// ─── WebhookDelivery ─────────────────────────────────────────
|
|
410
|
+
|
|
411
|
+
export const webhookDeliveryListSchema = z.object({
|
|
412
|
+
page: z.coerce.number().min(1).default(1),
|
|
413
|
+
pageSize: z.coerce.number().min(1).max(100).default(50),
|
|
414
|
+
webhookId: uuid().optional(),
|
|
415
|
+
status: z.string().optional(),
|
|
416
|
+
eventType: z.string().optional(),
|
|
417
|
+
sortField: z.string().optional(),
|
|
418
|
+
sortDir: z.enum(['asc', 'desc']).optional(),
|
|
419
|
+
}).passthrough()
|
|
420
|
+
|
|
421
|
+
// ─── LocationOverride ────────────────────────────────────────
|
|
422
|
+
|
|
423
|
+
export const locationOverrideDataSchema = z.object({
|
|
424
|
+
name: z.string().trim().min(1, 'Name is required').max(200),
|
|
425
|
+
address: z.string().trim().max(500).nullable().optional(),
|
|
426
|
+
operatorName: z.string().trim().max(200).nullable().optional(),
|
|
427
|
+
countryCode: z.string().trim().length(2, 'Country code must be 2 characters').toUpperCase().nullable().optional(),
|
|
428
|
+
facilityTypeCode: z.string().trim().max(20).nullable().optional(),
|
|
429
|
+
coords: coordsSchema.nullable().optional(),
|
|
430
|
+
})
|
|
431
|
+
export type LocationOverrideData = z.infer<typeof locationOverrideDataSchema>
|
|
432
|
+
|
|
433
|
+
export const locationOverrideCreateSchema = scopedSchema.extend({
|
|
434
|
+
carrierCode: z.string().trim().max(20).nullable().optional(),
|
|
435
|
+
unlocode: unLocodeSchema,
|
|
436
|
+
facilityCode: z.string().trim().min(1, 'Facility code is required').max(50),
|
|
437
|
+
facilityCodeListProvider: facilityCodeListProviderSchema,
|
|
438
|
+
overrideData: locationOverrideDataSchema,
|
|
439
|
+
description: z.string().trim().max(500).nullable().optional(),
|
|
440
|
+
isActive: z.boolean().default(true),
|
|
441
|
+
})
|
|
442
|
+
|
|
443
|
+
export const locationOverrideUpdateSchema = z.object({
|
|
444
|
+
id: uuid(),
|
|
445
|
+
}).merge(
|
|
446
|
+
scopedSchema.extend({
|
|
447
|
+
carrierCode: z.string().trim().max(20).nullable().optional(),
|
|
448
|
+
unlocode: unLocodeSchema.optional(),
|
|
449
|
+
facilityCode: z.string().trim().min(1).max(50).optional(),
|
|
450
|
+
facilityCodeListProvider: facilityCodeListProviderSchema.optional(),
|
|
451
|
+
overrideData: locationOverrideDataSchema.optional(),
|
|
452
|
+
description: z.string().trim().max(500).nullable().optional(),
|
|
453
|
+
isActive: z.boolean().optional(),
|
|
454
|
+
}).partial(),
|
|
455
|
+
)
|
|
456
|
+
|
|
457
|
+
export const locationOverrideListSchema = z.object({
|
|
458
|
+
page: z.coerce.number().min(1).default(1),
|
|
459
|
+
pageSize: z.coerce.number().min(1).max(100).default(50),
|
|
460
|
+
carrierCode: z.string().optional(),
|
|
461
|
+
unlocode: z.string().optional(),
|
|
462
|
+
facilityCode: z.string().optional(),
|
|
463
|
+
isActive: z.string().optional(),
|
|
464
|
+
search: z.string().optional(),
|
|
465
|
+
sortField: z.string().optional(),
|
|
466
|
+
sortDir: z.enum(['asc', 'desc']).optional(),
|
|
467
|
+
}).passthrough()
|
|
468
|
+
|
|
469
|
+
export type LocationOverrideCreateInput = z.infer<typeof locationOverrideCreateSchema>
|
|
470
|
+
export type LocationOverrideUpdateInput = z.infer<typeof locationOverrideUpdateSchema>
|
|
471
|
+
|
|
472
|
+
// ─── Ships Map Dashboard Widget ──────────────────────────────
|
|
473
|
+
|
|
474
|
+
/** Optional scope filter for the ships-map aggregation route. */
|
|
475
|
+
export const shipsMapQuerySchema = z.object({
|
|
476
|
+
scope: z.enum(['in_transit', 'at_port', 'all']).optional().default('all'),
|
|
477
|
+
})
|
|
478
|
+
export type ShipsMapQueryInput = z.infer<typeof shipsMapQuerySchema>
|
|
479
|
+
|
|
480
|
+
/** A single shipment grouped under a map marker. */
|
|
481
|
+
export const shipsMapShipmentSchema = z.object({
|
|
482
|
+
id: z.string(),
|
|
483
|
+
containerNumber: z.string().nullable(),
|
|
484
|
+
status: z.string(),
|
|
485
|
+
eta: z.string().nullable(),
|
|
486
|
+
destinationLocation: z.string().nullable(),
|
|
487
|
+
})
|
|
488
|
+
|
|
489
|
+
/**
|
|
490
|
+
* Map marker discriminated by `kind`:
|
|
491
|
+
* - `vessel`: a live AIS position for a vessel actually carrying in-transit cargo.
|
|
492
|
+
* - `port`: a port where at-rest cargo is waiting (the planned onward vessel's AIS is unrelated).
|
|
493
|
+
*/
|
|
494
|
+
export const shipsMapMarkerSchema = z.discriminatedUnion('kind', [
|
|
495
|
+
z.object({
|
|
496
|
+
kind: z.literal('vessel'),
|
|
497
|
+
imo: z.string(),
|
|
498
|
+
name: z.string().nullable(),
|
|
499
|
+
position: z.object({ lat: z.number(), lng: z.number() }),
|
|
500
|
+
heading: z.number().nullable(),
|
|
501
|
+
destination: z.string().nullable(),
|
|
502
|
+
updatedAt: z.string().nullable(),
|
|
503
|
+
shipments: z.array(shipsMapShipmentSchema),
|
|
504
|
+
}),
|
|
505
|
+
z.object({
|
|
506
|
+
kind: z.literal('port'),
|
|
507
|
+
portName: z.string().nullable(),
|
|
508
|
+
unlocode: z.string().nullable(),
|
|
509
|
+
position: z.object({ lat: z.number(), lng: z.number() }),
|
|
510
|
+
shipments: z.array(shipsMapShipmentSchema),
|
|
511
|
+
}),
|
|
512
|
+
])
|
|
513
|
+
|
|
514
|
+
export const shipsMapResponseSchema = z.object({
|
|
515
|
+
markers: z.array(shipsMapMarkerSchema),
|
|
516
|
+
/** Active shipments with no plottable position (no IMO/coords, or a vessel-api miss). */
|
|
517
|
+
unresolvedCount: z.number(),
|
|
518
|
+
generatedAt: z.string(),
|
|
519
|
+
})
|
|
520
|
+
|
|
521
|
+
export type ShipsMapShipment = z.infer<typeof shipsMapShipmentSchema>
|
|
522
|
+
export type ShipsMapMarker = z.infer<typeof shipsMapMarkerSchema>
|
|
523
|
+
export type ShipsMapResponse = z.infer<typeof shipsMapResponseSchema>
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { asClass } from 'awilix'
|
|
2
|
+
import type { AppContainer } from '@open-mercato/shared/lib/di/container'
|
|
3
|
+
import { CarrierRegistryService } from './services/carrierRegistry'
|
|
4
|
+
import { TrackingService } from './services/trackingService'
|
|
5
|
+
import { ShipsGoProvider } from './services/shipsGoProvider'
|
|
6
|
+
import { WebhookService } from './services/webhookService'
|
|
7
|
+
import { PoiNatsService } from './services/poiNatsService'
|
|
8
|
+
import { registerAllAdapters } from './lib/adapters'
|
|
9
|
+
|
|
10
|
+
export function register(container: AppContainer) {
|
|
11
|
+
// Register carrier registry (singleton - adapters are registered once)
|
|
12
|
+
container.register({
|
|
13
|
+
shipmentTrackingCarrierRegistry: asClass(CarrierRegistryService).singleton(),
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
// Register webhook service first (no dependencies on other shipment-tracking services)
|
|
17
|
+
container.register({
|
|
18
|
+
shipmentTrackingWebhookService: {
|
|
19
|
+
resolve: () =>
|
|
20
|
+
new WebhookService({
|
|
21
|
+
em: () => container.resolve('em'),
|
|
22
|
+
eventBus: container.resolve('eventBus'),
|
|
23
|
+
}),
|
|
24
|
+
},
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
// Register ShipsGo aggregator provider (fallback tracking; no external deps)
|
|
28
|
+
container.register({
|
|
29
|
+
shipmentTrackingShipsGoProvider: {
|
|
30
|
+
resolve: () =>
|
|
31
|
+
new ShipsGoProvider({
|
|
32
|
+
em: () => container.resolve('em'),
|
|
33
|
+
}),
|
|
34
|
+
},
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
// Register tracking service (depends on webhook service)
|
|
38
|
+
container.register({
|
|
39
|
+
shipmentTrackingService: {
|
|
40
|
+
resolve: () => {
|
|
41
|
+
const cache = container.resolve<any>('cache')
|
|
42
|
+
return new TrackingService({
|
|
43
|
+
em: () => container.resolve('em'),
|
|
44
|
+
eventBus: container.resolve('eventBus'),
|
|
45
|
+
carrierRegistry: container.resolve('shipmentTrackingCarrierRegistry'),
|
|
46
|
+
shipsGoProvider: container.resolve('shipmentTrackingShipsGoProvider'),
|
|
47
|
+
webhookService: container.resolve('shipmentTrackingWebhookService'),
|
|
48
|
+
cacheService: {
|
|
49
|
+
get: (key: string) => cache.get(key),
|
|
50
|
+
set: (key: string, value: string, ttlSeconds?: number) =>
|
|
51
|
+
cache.set(key, value, ttlSeconds ? { ttl: ttlSeconds * 1000 } : undefined),
|
|
52
|
+
},
|
|
53
|
+
})
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
// Register POI NATS subscriber service
|
|
59
|
+
container.register({
|
|
60
|
+
poiNatsService: {
|
|
61
|
+
resolve: () =>
|
|
62
|
+
new PoiNatsService({
|
|
63
|
+
em: () => container.resolve('em'),
|
|
64
|
+
eventBus: container.resolve('eventBus'),
|
|
65
|
+
trackingService: container.resolve('shipmentTrackingService'),
|
|
66
|
+
}),
|
|
67
|
+
},
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
// Register all built-in carrier adapters
|
|
71
|
+
const registry = container.resolve<CarrierRegistryService>('shipmentTrackingCarrierRegistry')
|
|
72
|
+
registerAllAdapters(registry)
|
|
73
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ModuleEncryptionMap } from '@open-mercato/shared/modules/encryption'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Tenant-data-encryption declarations for the shipment_tracking module.
|
|
5
|
+
*
|
|
6
|
+
* `ShipsGoConfig.apiToken` holds the per-tenant ShipsGo API token and must be
|
|
7
|
+
* encrypted at rest. Reads go through `findOneWithDecryption`; writes are
|
|
8
|
+
* encrypted transparently by the ORM subscriber using this map.
|
|
9
|
+
*/
|
|
10
|
+
export const defaultEncryptionMaps: ModuleEncryptionMap[] = [
|
|
11
|
+
{
|
|
12
|
+
entityId: 'shipment_tracking:shipsgo_config',
|
|
13
|
+
fields: [{ field: 'apiToken' }],
|
|
14
|
+
},
|
|
15
|
+
]
|
|
16
|
+
|
|
17
|
+
export default defaultEncryptionMaps
|