@open-mercato/core 0.4.7-develop-0a657b411f → 0.4.7-develop-e249d3e7d0

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.
Files changed (278) hide show
  1. package/dist/generated/entities/carrier_shipment/index.js +37 -0
  2. package/dist/generated/entities/carrier_shipment/index.js.map +7 -0
  3. package/dist/generated/entities/gateway_transaction/index.js +47 -0
  4. package/dist/generated/entities/gateway_transaction/index.js.map +7 -0
  5. package/dist/generated/entities/webhook_processed_event/index.js +17 -0
  6. package/dist/generated/entities/webhook_processed_event/index.js.map +7 -0
  7. package/dist/generated/entities.ids.generated.js +10 -1
  8. package/dist/generated/entities.ids.generated.js.map +2 -2
  9. package/dist/generated/entity-fields-registry.js +6 -0
  10. package/dist/generated/entity-fields-registry.js.map +2 -2
  11. package/dist/modules/data_sync/api/runs/[id]/cancel.js +14 -5
  12. package/dist/modules/data_sync/api/runs/[id]/cancel.js.map +2 -2
  13. package/dist/modules/data_sync/backend/data-sync/page.meta.js +2 -2
  14. package/dist/modules/data_sync/backend/data-sync/page.meta.js.map +1 -1
  15. package/dist/modules/data_sync/backend/data-sync/runs/[id]/page.js +37 -12
  16. package/dist/modules/data_sync/backend/data-sync/runs/[id]/page.js.map +2 -2
  17. package/dist/modules/directory/api/get/tenants/lookup.js +1 -0
  18. package/dist/modules/directory/api/get/tenants/lookup.js.map +2 -2
  19. package/dist/modules/integrations/api/[id]/route.js +38 -11
  20. package/dist/modules/integrations/api/[id]/route.js.map +2 -2
  21. package/dist/modules/integrations/api/logs/route.js +52 -26
  22. package/dist/modules/integrations/api/logs/route.js.map +2 -2
  23. package/dist/modules/integrations/api/route.js +37 -7
  24. package/dist/modules/integrations/api/route.js.map +2 -2
  25. package/dist/modules/integrations/api/umes-read.js +121 -0
  26. package/dist/modules/integrations/api/umes-read.js.map +7 -0
  27. package/dist/modules/integrations/backend/integrations/[id]/page.js +715 -183
  28. package/dist/modules/integrations/backend/integrations/[id]/page.js.map +2 -2
  29. package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js +30 -9
  30. package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js.map +2 -2
  31. package/dist/modules/integrations/backend/integrations/detail-page-widgets.js +46 -0
  32. package/dist/modules/integrations/backend/integrations/detail-page-widgets.js.map +7 -0
  33. package/dist/modules/integrations/backend/integrations/page.js +78 -62
  34. package/dist/modules/integrations/backend/integrations/page.js.map +2 -2
  35. package/dist/modules/integrations/backend/integrations/page.meta.js +2 -2
  36. package/dist/modules/integrations/backend/integrations/page.meta.js.map +1 -1
  37. package/dist/modules/integrations/setup.js +2 -2
  38. package/dist/modules/integrations/setup.js.map +2 -2
  39. package/dist/modules/payment_gateways/acl.js +12 -0
  40. package/dist/modules/payment_gateways/acl.js.map +7 -0
  41. package/dist/modules/payment_gateways/api/cancel/route.js +55 -0
  42. package/dist/modules/payment_gateways/api/cancel/route.js.map +7 -0
  43. package/dist/modules/payment_gateways/api/capture/route.js +55 -0
  44. package/dist/modules/payment_gateways/api/capture/route.js.map +7 -0
  45. package/dist/modules/payment_gateways/api/interceptors.js +24 -0
  46. package/dist/modules/payment_gateways/api/interceptors.js.map +7 -0
  47. package/dist/modules/payment_gateways/api/openapi.js +5 -0
  48. package/dist/modules/payment_gateways/api/openapi.js.map +7 -0
  49. package/dist/modules/payment_gateways/api/refund/route.js +56 -0
  50. package/dist/modules/payment_gateways/api/refund/route.js.map +7 -0
  51. package/dist/modules/payment_gateways/api/sessions/route.js +74 -0
  52. package/dist/modules/payment_gateways/api/sessions/route.js.map +7 -0
  53. package/dist/modules/payment_gateways/api/status/route.js +66 -0
  54. package/dist/modules/payment_gateways/api/status/route.js.map +7 -0
  55. package/dist/modules/payment_gateways/api/transactions/[id]/route.js +118 -0
  56. package/dist/modules/payment_gateways/api/transactions/[id]/route.js.map +7 -0
  57. package/dist/modules/payment_gateways/api/transactions/route.js +113 -0
  58. package/dist/modules/payment_gateways/api/transactions/route.js.map +7 -0
  59. package/dist/modules/payment_gateways/api/webhook/[provider]/route.js +136 -0
  60. package/dist/modules/payment_gateways/api/webhook/[provider]/route.js.map +7 -0
  61. package/dist/modules/payment_gateways/backend/payment-gateways/page.js +496 -0
  62. package/dist/modules/payment_gateways/backend/payment-gateways/page.js.map +7 -0
  63. package/dist/modules/payment_gateways/backend/payment-gateways/page.meta.js +23 -0
  64. package/dist/modules/payment_gateways/backend/payment-gateways/page.meta.js.map +7 -0
  65. package/dist/modules/payment_gateways/data/enrichers.js +5 -0
  66. package/dist/modules/payment_gateways/data/enrichers.js.map +7 -0
  67. package/dist/modules/payment_gateways/data/entities.js +131 -0
  68. package/dist/modules/payment_gateways/data/entities.js.map +7 -0
  69. package/dist/modules/payment_gateways/data/validators.js +57 -0
  70. package/dist/modules/payment_gateways/data/validators.js.map +7 -0
  71. package/dist/modules/payment_gateways/di.js +16 -0
  72. package/dist/modules/payment_gateways/di.js.map +7 -0
  73. package/dist/modules/payment_gateways/events.js +21 -0
  74. package/dist/modules/payment_gateways/events.js.map +7 -0
  75. package/dist/modules/payment_gateways/i18n/en.js +6 -0
  76. package/dist/modules/payment_gateways/i18n/en.js.map +7 -0
  77. package/dist/modules/payment_gateways/i18n/pl.js +6 -0
  78. package/dist/modules/payment_gateways/i18n/pl.js.map +7 -0
  79. package/dist/modules/payment_gateways/index.js +9 -0
  80. package/dist/modules/payment_gateways/index.js.map +7 -0
  81. package/dist/modules/payment_gateways/lib/gateway-service.js +378 -0
  82. package/dist/modules/payment_gateways/lib/gateway-service.js.map +7 -0
  83. package/dist/modules/payment_gateways/lib/queue.js +17 -0
  84. package/dist/modules/payment_gateways/lib/queue.js.map +7 -0
  85. package/dist/modules/payment_gateways/lib/status-machine.js +29 -0
  86. package/dist/modules/payment_gateways/lib/status-machine.js.map +7 -0
  87. package/dist/modules/payment_gateways/lib/webhook-processor.js +88 -0
  88. package/dist/modules/payment_gateways/lib/webhook-processor.js.map +7 -0
  89. package/dist/modules/payment_gateways/lib/webhook-utils.js +42 -0
  90. package/dist/modules/payment_gateways/lib/webhook-utils.js.map +7 -0
  91. package/dist/modules/payment_gateways/migrations/Migration20260305122155.js +19 -0
  92. package/dist/modules/payment_gateways/migrations/Migration20260305122155.js.map +7 -0
  93. package/dist/modules/payment_gateways/setup.js +13 -0
  94. package/dist/modules/payment_gateways/setup.js.map +7 -0
  95. package/dist/modules/payment_gateways/widgets/injection-table.js +7 -0
  96. package/dist/modules/payment_gateways/widgets/injection-table.js.map +7 -0
  97. package/dist/modules/payment_gateways/workers/status-poller.js +44 -0
  98. package/dist/modules/payment_gateways/workers/status-poller.js.map +7 -0
  99. package/dist/modules/payment_gateways/workers/webhook-processor.js +20 -0
  100. package/dist/modules/payment_gateways/workers/webhook-processor.js.map +7 -0
  101. package/dist/modules/sales/data/enrichers.js +72 -0
  102. package/dist/modules/sales/data/enrichers.js.map +7 -0
  103. package/dist/modules/sales/lib/makeSalesLineRoute.js +3 -0
  104. package/dist/modules/sales/lib/makeSalesLineRoute.js.map +2 -2
  105. package/dist/modules/sales/widgets/injection/payment-gateway-config-field/widget.js +29 -0
  106. package/dist/modules/sales/widgets/injection/payment-gateway-config-field/widget.js.map +7 -0
  107. package/dist/modules/sales/widgets/injection/payment-gateway-status-column/widget.js +23 -0
  108. package/dist/modules/sales/widgets/injection/payment-gateway-status-column/widget.js.map +7 -0
  109. package/dist/modules/sales/widgets/injection-table.js +13 -1
  110. package/dist/modules/sales/widgets/injection-table.js.map +2 -2
  111. package/dist/modules/shipping_carriers/acl.js +10 -0
  112. package/dist/modules/shipping_carriers/acl.js.map +7 -0
  113. package/dist/modules/shipping_carriers/api/cancel/route.js +55 -0
  114. package/dist/modules/shipping_carriers/api/cancel/route.js.map +7 -0
  115. package/dist/modules/shipping_carriers/api/interceptors.js +21 -0
  116. package/dist/modules/shipping_carriers/api/interceptors.js.map +7 -0
  117. package/dist/modules/shipping_carriers/api/openapi.js +5 -0
  118. package/dist/modules/shipping_carriers/api/openapi.js.map +7 -0
  119. package/dist/modules/shipping_carriers/api/rates/route.js +55 -0
  120. package/dist/modules/shipping_carriers/api/rates/route.js.map +7 -0
  121. package/dist/modules/shipping_carriers/api/shipments/route.js +61 -0
  122. package/dist/modules/shipping_carriers/api/shipments/route.js.map +7 -0
  123. package/dist/modules/shipping_carriers/api/tracking/route.js +58 -0
  124. package/dist/modules/shipping_carriers/api/tracking/route.js.map +7 -0
  125. package/dist/modules/shipping_carriers/api/webhook/[provider]/route.js +119 -0
  126. package/dist/modules/shipping_carriers/api/webhook/[provider]/route.js.map +7 -0
  127. package/dist/modules/shipping_carriers/data/enrichers.js +82 -0
  128. package/dist/modules/shipping_carriers/data/enrichers.js.map +7 -0
  129. package/dist/modules/shipping_carriers/data/entities.js +80 -0
  130. package/dist/modules/shipping_carriers/data/entities.js.map +7 -0
  131. package/dist/modules/shipping_carriers/data/validators.js +49 -0
  132. package/dist/modules/shipping_carriers/data/validators.js.map +7 -0
  133. package/dist/modules/shipping_carriers/di.js +15 -0
  134. package/dist/modules/shipping_carriers/di.js.map +7 -0
  135. package/dist/modules/shipping_carriers/events.js +19 -0
  136. package/dist/modules/shipping_carriers/events.js.map +7 -0
  137. package/dist/modules/shipping_carriers/i18n/en.js +11 -0
  138. package/dist/modules/shipping_carriers/i18n/en.js.map +7 -0
  139. package/dist/modules/shipping_carriers/i18n/pl.js +11 -0
  140. package/dist/modules/shipping_carriers/i18n/pl.js.map +7 -0
  141. package/dist/modules/shipping_carriers/index.js +9 -0
  142. package/dist/modules/shipping_carriers/index.js.map +7 -0
  143. package/dist/modules/shipping_carriers/lib/adapter-registry.js +29 -0
  144. package/dist/modules/shipping_carriers/lib/adapter-registry.js.map +7 -0
  145. package/dist/modules/shipping_carriers/lib/adapter.js +1 -0
  146. package/dist/modules/shipping_carriers/lib/adapter.js.map +7 -0
  147. package/dist/modules/shipping_carriers/lib/queue.js +17 -0
  148. package/dist/modules/shipping_carriers/lib/queue.js.map +7 -0
  149. package/dist/modules/shipping_carriers/lib/shipping-service.js +155 -0
  150. package/dist/modules/shipping_carriers/lib/shipping-service.js.map +7 -0
  151. package/dist/modules/shipping_carriers/lib/status-sync.js +37 -0
  152. package/dist/modules/shipping_carriers/lib/status-sync.js.map +7 -0
  153. package/dist/modules/shipping_carriers/migrations/Migration20260305170000.js +16 -0
  154. package/dist/modules/shipping_carriers/migrations/Migration20260305170000.js.map +7 -0
  155. package/dist/modules/shipping_carriers/setup.js +13 -0
  156. package/dist/modules/shipping_carriers/setup.js.map +7 -0
  157. package/dist/modules/shipping_carriers/widgets/injection/create-shipment-button/widget.js +25 -0
  158. package/dist/modules/shipping_carriers/widgets/injection/create-shipment-button/widget.js.map +7 -0
  159. package/dist/modules/shipping_carriers/widgets/injection/tracking-column/widget.js +23 -0
  160. package/dist/modules/shipping_carriers/widgets/injection/tracking-column/widget.js.map +7 -0
  161. package/dist/modules/shipping_carriers/widgets/injection/tracking-status-badge/widget.js +40 -0
  162. package/dist/modules/shipping_carriers/widgets/injection/tracking-status-badge/widget.js.map +7 -0
  163. package/dist/modules/shipping_carriers/widgets/injection-table.js +24 -0
  164. package/dist/modules/shipping_carriers/widgets/injection-table.js.map +7 -0
  165. package/dist/modules/shipping_carriers/workers/status-poller.js +21 -0
  166. package/dist/modules/shipping_carriers/workers/status-poller.js.map +7 -0
  167. package/dist/modules/shipping_carriers/workers/webhook-processor.js +54 -0
  168. package/dist/modules/shipping_carriers/workers/webhook-processor.js.map +7 -0
  169. package/dist/modules/translations/api/get/locales.js +1 -0
  170. package/dist/modules/translations/api/get/locales.js.map +2 -2
  171. package/dist/modules/translations/api/put/locales.js +1 -0
  172. package/dist/modules/translations/api/put/locales.js.map +2 -2
  173. package/generated/entities/carrier_shipment/index.ts +17 -0
  174. package/generated/entities/gateway_transaction/index.ts +22 -0
  175. package/generated/entities/webhook_processed_event/index.ts +7 -0
  176. package/generated/entities.ids.generated.ts +10 -1
  177. package/generated/entity-fields-registry.ts +6 -0
  178. package/jest.config.cjs +1 -0
  179. package/package.json +5 -2
  180. package/src/modules/auth/i18n/de.json +1 -0
  181. package/src/modules/auth/i18n/en.json +1 -0
  182. package/src/modules/auth/i18n/es.json +1 -0
  183. package/src/modules/auth/i18n/pl.json +1 -0
  184. package/src/modules/data_sync/api/runs/[id]/cancel.ts +18 -5
  185. package/src/modules/data_sync/backend/data-sync/page.meta.ts +2 -2
  186. package/src/modules/data_sync/backend/data-sync/runs/[id]/page.tsx +50 -12
  187. package/src/modules/directory/api/get/tenants/lookup.ts +1 -0
  188. package/src/modules/integrations/AGENTS.md +31 -0
  189. package/src/modules/integrations/api/[id]/route.ts +38 -11
  190. package/src/modules/integrations/api/logs/route.ts +53 -27
  191. package/src/modules/integrations/api/route.ts +31 -1
  192. package/src/modules/integrations/api/umes-read.ts +177 -0
  193. package/src/modules/integrations/backend/integrations/[id]/page.tsx +902 -202
  194. package/src/modules/integrations/backend/integrations/bundle/[id]/page.tsx +43 -9
  195. package/src/modules/integrations/backend/integrations/detail-page-widgets.ts +74 -0
  196. package/src/modules/integrations/backend/integrations/page.meta.ts +2 -2
  197. package/src/modules/integrations/backend/integrations/page.tsx +65 -54
  198. package/src/modules/integrations/i18n/de.json +15 -0
  199. package/src/modules/integrations/i18n/en.json +15 -0
  200. package/src/modules/integrations/i18n/es.json +15 -0
  201. package/src/modules/integrations/i18n/pl.json +15 -0
  202. package/src/modules/integrations/setup.ts +2 -2
  203. package/src/modules/payment_gateways/acl.ts +8 -0
  204. package/src/modules/payment_gateways/api/cancel/route.ts +56 -0
  205. package/src/modules/payment_gateways/api/capture/route.ts +56 -0
  206. package/src/modules/payment_gateways/api/interceptors.ts +22 -0
  207. package/src/modules/payment_gateways/api/openapi.ts +1 -0
  208. package/src/modules/payment_gateways/api/refund/route.ts +57 -0
  209. package/src/modules/payment_gateways/api/sessions/route.ts +76 -0
  210. package/src/modules/payment_gateways/api/status/route.ts +69 -0
  211. package/src/modules/payment_gateways/api/transactions/[id]/route.ts +123 -0
  212. package/src/modules/payment_gateways/api/transactions/route.ts +120 -0
  213. package/src/modules/payment_gateways/api/webhook/[provider]/route.ts +161 -0
  214. package/src/modules/payment_gateways/backend/payment-gateways/page.meta.ts +19 -0
  215. package/src/modules/payment_gateways/backend/payment-gateways/page.tsx +660 -0
  216. package/src/modules/payment_gateways/data/enrichers.ts +8 -0
  217. package/src/modules/payment_gateways/data/entities.ts +106 -0
  218. package/src/modules/payment_gateways/data/validators.ts +67 -0
  219. package/src/modules/payment_gateways/di.ts +26 -0
  220. package/src/modules/payment_gateways/events.ts +17 -0
  221. package/src/modules/payment_gateways/i18n/de.json +77 -0
  222. package/src/modules/payment_gateways/i18n/en.json +77 -0
  223. package/src/modules/payment_gateways/i18n/en.ts +4 -0
  224. package/src/modules/payment_gateways/i18n/es.json +77 -0
  225. package/src/modules/payment_gateways/i18n/pl.json +77 -0
  226. package/src/modules/payment_gateways/i18n/pl.ts +4 -0
  227. package/src/modules/payment_gateways/index.ts +5 -0
  228. package/src/modules/payment_gateways/lib/gateway-service.ts +486 -0
  229. package/src/modules/payment_gateways/lib/queue.ts +19 -0
  230. package/src/modules/payment_gateways/lib/status-machine.ts +28 -0
  231. package/src/modules/payment_gateways/lib/webhook-processor.ts +133 -0
  232. package/src/modules/payment_gateways/lib/webhook-utils.ts +52 -0
  233. package/src/modules/payment_gateways/migrations/.snapshot-open-mercato.json +373 -0
  234. package/src/modules/payment_gateways/migrations/Migration20260305122155.ts +20 -0
  235. package/src/modules/payment_gateways/setup.ts +11 -0
  236. package/src/modules/payment_gateways/widgets/injection-table.ts +9 -0
  237. package/src/modules/payment_gateways/workers/status-poller.ts +58 -0
  238. package/src/modules/payment_gateways/workers/webhook-processor.ts +30 -0
  239. package/src/modules/sales/data/enrichers.ts +120 -0
  240. package/src/modules/sales/lib/makeSalesLineRoute.ts +3 -0
  241. package/src/modules/sales/widgets/injection/payment-gateway-config-field/widget.ts +28 -0
  242. package/src/modules/sales/widgets/injection/payment-gateway-status-column/widget.ts +22 -0
  243. package/src/modules/sales/widgets/injection-table.ts +12 -0
  244. package/src/modules/shipping_carriers/acl.ts +6 -0
  245. package/src/modules/shipping_carriers/api/cancel/route.ts +53 -0
  246. package/src/modules/shipping_carriers/api/interceptors.ts +19 -0
  247. package/src/modules/shipping_carriers/api/openapi.ts +1 -0
  248. package/src/modules/shipping_carriers/api/rates/route.ts +53 -0
  249. package/src/modules/shipping_carriers/api/shipments/route.ts +59 -0
  250. package/src/modules/shipping_carriers/api/tracking/route.ts +56 -0
  251. package/src/modules/shipping_carriers/api/webhook/[provider]/route.ts +134 -0
  252. package/src/modules/shipping_carriers/data/enrichers.ts +89 -0
  253. package/src/modules/shipping_carriers/data/entities.ts +60 -0
  254. package/src/modules/shipping_carriers/data/validators.ts +48 -0
  255. package/src/modules/shipping_carriers/di.ts +20 -0
  256. package/src/modules/shipping_carriers/events.ts +16 -0
  257. package/src/modules/shipping_carriers/i18n/de.json +7 -0
  258. package/src/modules/shipping_carriers/i18n/en.json +7 -0
  259. package/src/modules/shipping_carriers/i18n/en.ts +7 -0
  260. package/src/modules/shipping_carriers/i18n/es.json +7 -0
  261. package/src/modules/shipping_carriers/i18n/pl.json +7 -0
  262. package/src/modules/shipping_carriers/i18n/pl.ts +7 -0
  263. package/src/modules/shipping_carriers/index.ts +5 -0
  264. package/src/modules/shipping_carriers/lib/adapter-registry.ts +33 -0
  265. package/src/modules/shipping_carriers/lib/adapter.ts +93 -0
  266. package/src/modules/shipping_carriers/lib/queue.ts +19 -0
  267. package/src/modules/shipping_carriers/lib/shipping-service.ts +204 -0
  268. package/src/modules/shipping_carriers/lib/status-sync.ts +38 -0
  269. package/src/modules/shipping_carriers/migrations/Migration20260305170000.ts +14 -0
  270. package/src/modules/shipping_carriers/setup.ts +11 -0
  271. package/src/modules/shipping_carriers/widgets/injection/create-shipment-button/widget.ts +24 -0
  272. package/src/modules/shipping_carriers/widgets/injection/tracking-column/widget.ts +22 -0
  273. package/src/modules/shipping_carriers/widgets/injection/tracking-status-badge/widget.tsx +44 -0
  274. package/src/modules/shipping_carriers/widgets/injection-table.ts +22 -0
  275. package/src/modules/shipping_carriers/workers/status-poller.ts +33 -0
  276. package/src/modules/shipping_carriers/workers/webhook-processor.ts +79 -0
  277. package/src/modules/translations/api/get/locales.ts +1 -0
  278. package/src/modules/translations/api/put/locales.ts +1 -0
@@ -0,0 +1,5 @@
1
+ const shippingCarriersTag = "ShippingCarriers";
2
+ export {
3
+ shippingCarriersTag
4
+ };
5
+ //# sourceMappingURL=openapi.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/shipping_carriers/api/openapi.ts"],
4
+ "sourcesContent": ["export const shippingCarriersTag = 'ShippingCarriers'\n"],
5
+ "mappings": "AAAO,MAAM,sBAAsB;",
6
+ "names": []
7
+ }
@@ -0,0 +1,55 @@
1
+ import { NextResponse } from "next/server";
2
+ import { getAuthFromRequest } from "@open-mercato/shared/lib/auth/server";
3
+ import { createRequestContainer } from "@open-mercato/shared/lib/di/container";
4
+ import { readJsonSafe } from "@open-mercato/shared/lib/http/readJsonSafe";
5
+ import { calculateRatesSchema } from "../../data/validators.js";
6
+ import { shippingCarriersTag } from "../openapi.js";
7
+ const metadata = {
8
+ path: "/shipping-carriers/rates",
9
+ POST: { requireAuth: true, requireFeatures: ["shipping_carriers.manage"] }
10
+ };
11
+ async function POST(req) {
12
+ const auth = await getAuthFromRequest(req);
13
+ if (!auth?.tenantId || !auth.orgId) {
14
+ return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
15
+ }
16
+ const payload = await readJsonSafe(req);
17
+ const parsed = calculateRatesSchema.safeParse(payload);
18
+ if (!parsed.success) {
19
+ return NextResponse.json({ error: "Invalid payload", details: parsed.error.flatten() }, { status: 422 });
20
+ }
21
+ const container = await createRequestContainer();
22
+ const service = container.resolve("shippingCarrierService");
23
+ try {
24
+ const rates = await service.calculateRates({
25
+ ...parsed.data,
26
+ organizationId: auth.orgId,
27
+ tenantId: auth.tenantId
28
+ });
29
+ return NextResponse.json({ rates });
30
+ } catch (error) {
31
+ const message = error instanceof Error ? error.message : "Failed to calculate rates";
32
+ return NextResponse.json({ error: message }, { status: 502 });
33
+ }
34
+ }
35
+ const openApi = {
36
+ tags: [shippingCarriersTag],
37
+ summary: "Calculate shipping rates",
38
+ methods: {
39
+ POST: {
40
+ summary: "Calculate shipping rates",
41
+ tags: [shippingCarriersTag],
42
+ responses: [
43
+ { status: 200, description: "Rates calculated" },
44
+ { status: 422, description: "Validation failed" },
45
+ { status: 502, description: "Provider upstream error" }
46
+ ]
47
+ }
48
+ }
49
+ };
50
+ export {
51
+ POST,
52
+ metadata,
53
+ openApi
54
+ };
55
+ //# sourceMappingURL=route.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/shipping_carriers/api/rates/route.ts"],
4
+ "sourcesContent": ["import { NextResponse } from 'next/server'\nimport { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server'\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport { readJsonSafe } from '@open-mercato/shared/lib/http/readJsonSafe'\nimport type { ShippingCarrierService } from '../../lib/shipping-service'\nimport { calculateRatesSchema } from '../../data/validators'\nimport { shippingCarriersTag } from '../openapi'\n\nexport const metadata = {\n path: '/shipping-carriers/rates',\n POST: { requireAuth: true, requireFeatures: ['shipping_carriers.manage'] },\n}\n\nexport async function POST(req: Request) {\n const auth = await getAuthFromRequest(req)\n if (!auth?.tenantId || !auth.orgId) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n const payload = await readJsonSafe<unknown>(req)\n const parsed = calculateRatesSchema.safeParse(payload)\n if (!parsed.success) {\n return NextResponse.json({ error: 'Invalid payload', details: parsed.error.flatten() }, { status: 422 })\n }\n const container = await createRequestContainer()\n const service = container.resolve('shippingCarrierService') as ShippingCarrierService\n try {\n const rates = await service.calculateRates({\n ...parsed.data,\n organizationId: auth.orgId as string,\n tenantId: auth.tenantId,\n })\n return NextResponse.json({ rates })\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to calculate rates'\n return NextResponse.json({ error: message }, { status: 502 })\n }\n}\n\nexport const openApi = {\n tags: [shippingCarriersTag],\n summary: 'Calculate shipping rates',\n methods: {\n POST: {\n summary: 'Calculate shipping rates',\n tags: [shippingCarriersTag],\n responses: [\n { status: 200, description: 'Rates calculated' },\n { status: 422, description: 'Validation failed' },\n { status: 502, description: 'Provider upstream error' },\n ],\n },\n },\n}\n"],
5
+ "mappings": "AAAA,SAAS,oBAAoB;AAC7B,SAAS,0BAA0B;AACnC,SAAS,8BAA8B;AACvC,SAAS,oBAAoB;AAE7B,SAAS,4BAA4B;AACrC,SAAS,2BAA2B;AAE7B,MAAM,WAAW;AAAA,EACtB,MAAM;AAAA,EACN,MAAM,EAAE,aAAa,MAAM,iBAAiB,CAAC,0BAA0B,EAAE;AAC3E;AAEA,eAAsB,KAAK,KAAc;AACvC,QAAM,OAAO,MAAM,mBAAmB,GAAG;AACzC,MAAI,CAAC,MAAM,YAAY,CAAC,KAAK,OAAO;AAClC,WAAO,aAAa,KAAK,EAAE,OAAO,eAAe,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACrE;AACA,QAAM,UAAU,MAAM,aAAsB,GAAG;AAC/C,QAAM,SAAS,qBAAqB,UAAU,OAAO;AACrD,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,aAAa,KAAK,EAAE,OAAO,mBAAmB,SAAS,OAAO,MAAM,QAAQ,EAAE,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACzG;AACA,QAAM,YAAY,MAAM,uBAAuB;AAC/C,QAAM,UAAU,UAAU,QAAQ,wBAAwB;AAC1D,MAAI;AACF,UAAM,QAAQ,MAAM,QAAQ,eAAe;AAAA,MACzC,GAAG,OAAO;AAAA,MACV,gBAAgB,KAAK;AAAA,MACrB,UAAU,KAAK;AAAA,IACjB,CAAC;AACD,WAAO,aAAa,KAAK,EAAE,MAAM,CAAC;AAAA,EACpC,SAAS,OAAgB;AACvB,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,WAAO,aAAa,KAAK,EAAE,OAAO,QAAQ,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC9D;AACF;AAEO,MAAM,UAAU;AAAA,EACrB,MAAM,CAAC,mBAAmB;AAAA,EAC1B,SAAS;AAAA,EACT,SAAS;AAAA,IACP,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,MAAM,CAAC,mBAAmB;AAAA,MAC1B,WAAW;AAAA,QACT,EAAE,QAAQ,KAAK,aAAa,mBAAmB;AAAA,QAC/C,EAAE,QAAQ,KAAK,aAAa,oBAAoB;AAAA,QAChD,EAAE,QAAQ,KAAK,aAAa,0BAA0B;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,61 @@
1
+ import { NextResponse } from "next/server";
2
+ import { getAuthFromRequest } from "@open-mercato/shared/lib/auth/server";
3
+ import { createRequestContainer } from "@open-mercato/shared/lib/di/container";
4
+ import { readJsonSafe } from "@open-mercato/shared/lib/http/readJsonSafe";
5
+ import { createShipmentSchema } from "../../data/validators.js";
6
+ import { shippingCarriersTag } from "../openapi.js";
7
+ const metadata = {
8
+ path: "/shipping-carriers/shipments",
9
+ POST: { requireAuth: true, requireFeatures: ["shipping_carriers.manage"] }
10
+ };
11
+ async function POST(req) {
12
+ const auth = await getAuthFromRequest(req);
13
+ if (!auth?.tenantId || !auth.orgId) {
14
+ return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
15
+ }
16
+ const payload = await readJsonSafe(req);
17
+ const parsed = createShipmentSchema.safeParse(payload);
18
+ if (!parsed.success) {
19
+ return NextResponse.json({ error: "Invalid payload", details: parsed.error.flatten() }, { status: 422 });
20
+ }
21
+ const container = await createRequestContainer();
22
+ const service = container.resolve("shippingCarrierService");
23
+ try {
24
+ const shipment = await service.createShipment({
25
+ ...parsed.data,
26
+ organizationId: auth.orgId,
27
+ tenantId: auth.tenantId
28
+ });
29
+ return NextResponse.json({
30
+ shipmentId: shipment.id,
31
+ carrierShipmentId: shipment.carrierShipmentId,
32
+ trackingNumber: shipment.trackingNumber,
33
+ status: shipment.unifiedStatus,
34
+ labelUrl: shipment.labelUrl
35
+ }, { status: 201 });
36
+ } catch (error) {
37
+ const message = error instanceof Error ? error.message : "Failed to create shipment";
38
+ return NextResponse.json({ error: message }, { status: 502 });
39
+ }
40
+ }
41
+ const openApi = {
42
+ tags: [shippingCarriersTag],
43
+ summary: "Create shipment",
44
+ methods: {
45
+ POST: {
46
+ summary: "Create shipment",
47
+ tags: [shippingCarriersTag],
48
+ responses: [
49
+ { status: 201, description: "Shipment created" },
50
+ { status: 422, description: "Validation failed" },
51
+ { status: 502, description: "Provider upstream error" }
52
+ ]
53
+ }
54
+ }
55
+ };
56
+ export {
57
+ POST,
58
+ metadata,
59
+ openApi
60
+ };
61
+ //# sourceMappingURL=route.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/shipping_carriers/api/shipments/route.ts"],
4
+ "sourcesContent": ["import { NextResponse } from 'next/server'\nimport { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server'\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport { readJsonSafe } from '@open-mercato/shared/lib/http/readJsonSafe'\nimport type { ShippingCarrierService } from '../../lib/shipping-service'\nimport { createShipmentSchema } from '../../data/validators'\nimport { shippingCarriersTag } from '../openapi'\n\nexport const metadata = {\n path: '/shipping-carriers/shipments',\n POST: { requireAuth: true, requireFeatures: ['shipping_carriers.manage'] },\n}\n\nexport async function POST(req: Request) {\n const auth = await getAuthFromRequest(req)\n if (!auth?.tenantId || !auth.orgId) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n const payload = await readJsonSafe<unknown>(req)\n const parsed = createShipmentSchema.safeParse(payload)\n if (!parsed.success) {\n return NextResponse.json({ error: 'Invalid payload', details: parsed.error.flatten() }, { status: 422 })\n }\n const container = await createRequestContainer()\n const service = container.resolve('shippingCarrierService') as ShippingCarrierService\n try {\n const shipment = await service.createShipment({\n ...parsed.data,\n organizationId: auth.orgId as string,\n tenantId: auth.tenantId,\n })\n return NextResponse.json({\n shipmentId: shipment.id,\n carrierShipmentId: shipment.carrierShipmentId,\n trackingNumber: shipment.trackingNumber,\n status: shipment.unifiedStatus,\n labelUrl: shipment.labelUrl,\n }, { status: 201 })\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to create shipment'\n return NextResponse.json({ error: message }, { status: 502 })\n }\n}\n\nexport const openApi = {\n tags: [shippingCarriersTag],\n summary: 'Create shipment',\n methods: {\n POST: {\n summary: 'Create shipment',\n tags: [shippingCarriersTag],\n responses: [\n { status: 201, description: 'Shipment created' },\n { status: 422, description: 'Validation failed' },\n { status: 502, description: 'Provider upstream error' },\n ],\n },\n },\n}\n"],
5
+ "mappings": "AAAA,SAAS,oBAAoB;AAC7B,SAAS,0BAA0B;AACnC,SAAS,8BAA8B;AACvC,SAAS,oBAAoB;AAE7B,SAAS,4BAA4B;AACrC,SAAS,2BAA2B;AAE7B,MAAM,WAAW;AAAA,EACtB,MAAM;AAAA,EACN,MAAM,EAAE,aAAa,MAAM,iBAAiB,CAAC,0BAA0B,EAAE;AAC3E;AAEA,eAAsB,KAAK,KAAc;AACvC,QAAM,OAAO,MAAM,mBAAmB,GAAG;AACzC,MAAI,CAAC,MAAM,YAAY,CAAC,KAAK,OAAO;AAClC,WAAO,aAAa,KAAK,EAAE,OAAO,eAAe,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACrE;AACA,QAAM,UAAU,MAAM,aAAsB,GAAG;AAC/C,QAAM,SAAS,qBAAqB,UAAU,OAAO;AACrD,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,aAAa,KAAK,EAAE,OAAO,mBAAmB,SAAS,OAAO,MAAM,QAAQ,EAAE,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACzG;AACA,QAAM,YAAY,MAAM,uBAAuB;AAC/C,QAAM,UAAU,UAAU,QAAQ,wBAAwB;AAC1D,MAAI;AACF,UAAM,WAAW,MAAM,QAAQ,eAAe;AAAA,MAC5C,GAAG,OAAO;AAAA,MACV,gBAAgB,KAAK;AAAA,MACrB,UAAU,KAAK;AAAA,IACjB,CAAC;AACD,WAAO,aAAa,KAAK;AAAA,MACvB,YAAY,SAAS;AAAA,MACrB,mBAAmB,SAAS;AAAA,MAC5B,gBAAgB,SAAS;AAAA,MACzB,QAAQ,SAAS;AAAA,MACjB,UAAU,SAAS;AAAA,IACrB,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACpB,SAAS,OAAgB;AACvB,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,WAAO,aAAa,KAAK,EAAE,OAAO,QAAQ,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC9D;AACF;AAEO,MAAM,UAAU;AAAA,EACrB,MAAM,CAAC,mBAAmB;AAAA,EAC1B,SAAS;AAAA,EACT,SAAS;AAAA,IACP,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,MAAM,CAAC,mBAAmB;AAAA,MAC1B,WAAW;AAAA,QACT,EAAE,QAAQ,KAAK,aAAa,mBAAmB;AAAA,QAC/C,EAAE,QAAQ,KAAK,aAAa,oBAAoB;AAAA,QAChD,EAAE,QAAQ,KAAK,aAAa,0BAA0B;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,58 @@
1
+ import { NextResponse } from "next/server";
2
+ import { getAuthFromRequest } from "@open-mercato/shared/lib/auth/server";
3
+ import { createRequestContainer } from "@open-mercato/shared/lib/di/container";
4
+ import { trackingQuerySchema } from "../../data/validators.js";
5
+ import { shippingCarriersTag } from "../openapi.js";
6
+ const metadata = {
7
+ path: "/shipping-carriers/tracking",
8
+ GET: { requireAuth: true, requireFeatures: ["shipping_carriers.view"] }
9
+ };
10
+ async function GET(req) {
11
+ const auth = await getAuthFromRequest(req);
12
+ if (!auth?.tenantId || !auth.orgId) {
13
+ return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
14
+ }
15
+ const url = new URL(req.url);
16
+ const parsed = trackingQuerySchema.safeParse({
17
+ providerKey: url.searchParams.get("providerKey"),
18
+ shipmentId: url.searchParams.get("shipmentId") ?? void 0,
19
+ trackingNumber: url.searchParams.get("trackingNumber") ?? void 0
20
+ });
21
+ if (!parsed.success) {
22
+ return NextResponse.json({ error: "Invalid query", details: parsed.error.flatten() }, { status: 422 });
23
+ }
24
+ const container = await createRequestContainer();
25
+ const service = container.resolve("shippingCarrierService");
26
+ try {
27
+ const tracking = await service.getTracking({
28
+ ...parsed.data,
29
+ organizationId: auth.orgId,
30
+ tenantId: auth.tenantId
31
+ });
32
+ return NextResponse.json(tracking);
33
+ } catch (error) {
34
+ const message = error instanceof Error ? error.message : "Failed to fetch tracking";
35
+ return NextResponse.json({ error: message }, { status: 502 });
36
+ }
37
+ }
38
+ const openApi = {
39
+ tags: [shippingCarriersTag],
40
+ summary: "Get tracking",
41
+ methods: {
42
+ GET: {
43
+ summary: "Get tracking",
44
+ tags: [shippingCarriersTag],
45
+ responses: [
46
+ { status: 200, description: "Tracking returned" },
47
+ { status: 422, description: "Validation failed" },
48
+ { status: 502, description: "Provider upstream error" }
49
+ ]
50
+ }
51
+ }
52
+ };
53
+ export {
54
+ GET,
55
+ metadata,
56
+ openApi
57
+ };
58
+ //# sourceMappingURL=route.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/shipping_carriers/api/tracking/route.ts"],
4
+ "sourcesContent": ["import { NextResponse } from 'next/server'\nimport { getAuthFromRequest } from '@open-mercato/shared/lib/auth/server'\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport type { ShippingCarrierService } from '../../lib/shipping-service'\nimport { trackingQuerySchema } from '../../data/validators'\nimport { shippingCarriersTag } from '../openapi'\n\nexport const metadata = {\n path: '/shipping-carriers/tracking',\n GET: { requireAuth: true, requireFeatures: ['shipping_carriers.view'] },\n}\n\nexport async function GET(req: Request) {\n const auth = await getAuthFromRequest(req)\n if (!auth?.tenantId || !auth.orgId) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })\n }\n const url = new URL(req.url)\n const parsed = trackingQuerySchema.safeParse({\n providerKey: url.searchParams.get('providerKey'),\n shipmentId: url.searchParams.get('shipmentId') ?? undefined,\n trackingNumber: url.searchParams.get('trackingNumber') ?? undefined,\n })\n if (!parsed.success) {\n return NextResponse.json({ error: 'Invalid query', details: parsed.error.flatten() }, { status: 422 })\n }\n const container = await createRequestContainer()\n const service = container.resolve('shippingCarrierService') as ShippingCarrierService\n try {\n const tracking = await service.getTracking({\n ...parsed.data,\n organizationId: auth.orgId as string,\n tenantId: auth.tenantId,\n })\n return NextResponse.json(tracking)\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to fetch tracking'\n return NextResponse.json({ error: message }, { status: 502 })\n }\n}\n\nexport const openApi = {\n tags: [shippingCarriersTag],\n summary: 'Get tracking',\n methods: {\n GET: {\n summary: 'Get tracking',\n tags: [shippingCarriersTag],\n responses: [\n { status: 200, description: 'Tracking returned' },\n { status: 422, description: 'Validation failed' },\n { status: 502, description: 'Provider upstream error' },\n ],\n },\n },\n}\n"],
5
+ "mappings": "AAAA,SAAS,oBAAoB;AAC7B,SAAS,0BAA0B;AACnC,SAAS,8BAA8B;AAEvC,SAAS,2BAA2B;AACpC,SAAS,2BAA2B;AAE7B,MAAM,WAAW;AAAA,EACtB,MAAM;AAAA,EACN,KAAK,EAAE,aAAa,MAAM,iBAAiB,CAAC,wBAAwB,EAAE;AACxE;AAEA,eAAsB,IAAI,KAAc;AACtC,QAAM,OAAO,MAAM,mBAAmB,GAAG;AACzC,MAAI,CAAC,MAAM,YAAY,CAAC,KAAK,OAAO;AAClC,WAAO,aAAa,KAAK,EAAE,OAAO,eAAe,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACrE;AACA,QAAM,MAAM,IAAI,IAAI,IAAI,GAAG;AAC3B,QAAM,SAAS,oBAAoB,UAAU;AAAA,IAC3C,aAAa,IAAI,aAAa,IAAI,aAAa;AAAA,IAC/C,YAAY,IAAI,aAAa,IAAI,YAAY,KAAK;AAAA,IAClD,gBAAgB,IAAI,aAAa,IAAI,gBAAgB,KAAK;AAAA,EAC5D,CAAC;AACD,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,aAAa,KAAK,EAAE,OAAO,iBAAiB,SAAS,OAAO,MAAM,QAAQ,EAAE,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACvG;AACA,QAAM,YAAY,MAAM,uBAAuB;AAC/C,QAAM,UAAU,UAAU,QAAQ,wBAAwB;AAC1D,MAAI;AACF,UAAM,WAAW,MAAM,QAAQ,YAAY;AAAA,MACzC,GAAG,OAAO;AAAA,MACV,gBAAgB,KAAK;AAAA,MACrB,UAAU,KAAK;AAAA,IACjB,CAAC;AACD,WAAO,aAAa,KAAK,QAAQ;AAAA,EACnC,SAAS,OAAgB;AACvB,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,WAAO,aAAa,KAAK,EAAE,OAAO,QAAQ,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC9D;AACF;AAEO,MAAM,UAAU;AAAA,EACrB,MAAM,CAAC,mBAAmB;AAAA,EAC1B,SAAS;AAAA,EACT,SAAS;AAAA,IACP,KAAK;AAAA,MACH,SAAS;AAAA,MACT,MAAM,CAAC,mBAAmB;AAAA,MAC1B,WAAW;AAAA,QACT,EAAE,QAAQ,KAAK,aAAa,oBAAoB;AAAA,QAChD,EAAE,QAAQ,KAAK,aAAa,oBAAoB;AAAA,QAChD,EAAE,QAAQ,KAAK,aAAa,0BAA0B;AAAA,MACxD;AAAA,IACF;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,119 @@
1
+ import { NextResponse } from "next/server";
2
+ import { createRequestContainer } from "@open-mercato/shared/lib/di/container";
3
+ import { findWithDecryption } from "@open-mercato/shared/lib/encryption/find";
4
+ import { readJsonSafe } from "@open-mercato/shared/lib/http/readJsonSafe";
5
+ import { CarrierShipment } from "../../../data/entities.js";
6
+ import { getShippingAdapter } from "../../../lib/adapter-registry.js";
7
+ import { getShippingCarrierQueue } from "../../../lib/queue.js";
8
+ import { shippingCarriersTag } from "../../openapi.js";
9
+ const metadata = {
10
+ path: "/shipping-carriers/webhook/[provider]",
11
+ POST: { requireAuth: false }
12
+ };
13
+ function readCarrierShipmentId(payload) {
14
+ if (!payload) return null;
15
+ const shipmentId = payload.shipmentId;
16
+ if (typeof shipmentId === "string" && shipmentId.trim().length > 0) return shipmentId.trim();
17
+ const data = payload.data;
18
+ if (data && typeof data === "object") {
19
+ const nested = data.shipmentId;
20
+ if (typeof nested === "string" && nested.trim().length > 0) return nested.trim();
21
+ }
22
+ return null;
23
+ }
24
+ async function POST(req, { params }) {
25
+ const resolvedParams = await params;
26
+ const providerKey = resolvedParams.provider;
27
+ const adapter = getShippingAdapter(providerKey);
28
+ if (!adapter) {
29
+ return NextResponse.json({ error: `No shipping adapter for provider: ${providerKey}` }, { status: 404 });
30
+ }
31
+ const rawBody = await req.text();
32
+ const headers = {};
33
+ req.headers.forEach((value, key) => {
34
+ headers[key] = value;
35
+ });
36
+ const container = await createRequestContainer();
37
+ const service = container.resolve("shippingCarrierService");
38
+ const em = container.resolve("em");
39
+ const integrationCredentialsService = container.resolve("integrationCredentialsService");
40
+ const queue = getShippingCarrierQueue("shipping-carriers-webhook");
41
+ const payload = await readJsonSafe(rawBody);
42
+ const carrierShipmentId = readCarrierShipmentId(payload);
43
+ try {
44
+ const candidates = carrierShipmentId ? await findWithDecryption(
45
+ em,
46
+ CarrierShipment,
47
+ {
48
+ providerKey,
49
+ carrierShipmentId,
50
+ deletedAt: null
51
+ },
52
+ { limit: 10, orderBy: { createdAt: "desc" } }
53
+ ) : [];
54
+ let shipment = null;
55
+ let matchedScope = null;
56
+ let event = null;
57
+ let lastVerificationError = null;
58
+ for (const candidate of candidates) {
59
+ const candidateScope = { organizationId: candidate.organizationId, tenantId: candidate.tenantId };
60
+ const credentials = await integrationCredentialsService.resolve(`carrier_${providerKey}`, candidateScope) ?? {};
61
+ try {
62
+ event = await adapter.verifyWebhook({ rawBody, headers, credentials });
63
+ shipment = candidate;
64
+ matchedScope = candidateScope;
65
+ break;
66
+ } catch (error) {
67
+ lastVerificationError = error;
68
+ }
69
+ }
70
+ if (!event) {
71
+ try {
72
+ event = await adapter.verifyWebhook({ rawBody, headers, credentials: {} });
73
+ } catch (error) {
74
+ throw lastVerificationError ?? error;
75
+ }
76
+ }
77
+ if (!event) {
78
+ throw new Error("Webhook verification failed");
79
+ }
80
+ if (!shipment && carrierShipmentId && matchedScope) {
81
+ shipment = await service.findShipmentByCarrierId(providerKey, carrierShipmentId, matchedScope);
82
+ }
83
+ const scope = shipment ? { organizationId: shipment.organizationId, tenantId: shipment.tenantId } : matchedScope;
84
+ await queue.enqueue({
85
+ name: "shipping-carrier-webhook",
86
+ payload: {
87
+ providerKey,
88
+ event,
89
+ shipmentId: shipment?.id ?? null,
90
+ scope
91
+ }
92
+ });
93
+ return NextResponse.json({ received: true, queued: true }, { status: 202 });
94
+ } catch (error) {
95
+ const message = error instanceof Error ? error.message : "Webhook verification failed";
96
+ return NextResponse.json({ error: message }, { status: 401 });
97
+ }
98
+ }
99
+ const openApi = {
100
+ tags: [shippingCarriersTag],
101
+ summary: "Receive shipping carrier webhook",
102
+ methods: {
103
+ POST: {
104
+ summary: "Process inbound carrier webhook",
105
+ tags: [shippingCarriersTag],
106
+ responses: [
107
+ { status: 202, description: "Webhook accepted for async processing" },
108
+ { status: 401, description: "Signature verification failed" },
109
+ { status: 404, description: "Unknown provider" }
110
+ ]
111
+ }
112
+ }
113
+ };
114
+ export {
115
+ POST,
116
+ metadata,
117
+ openApi
118
+ };
119
+ //# sourceMappingURL=route.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/modules/shipping_carriers/api/webhook/%5Bprovider%5D/route.ts"],
4
+ "sourcesContent": ["import { NextResponse } from 'next/server'\nimport { createRequestContainer } from '@open-mercato/shared/lib/di/container'\nimport { findWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { readJsonSafe } from '@open-mercato/shared/lib/http/readJsonSafe'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport type { CredentialsService } from '../../../../integrations/lib/credentials-service'\nimport { CarrierShipment } from '../../../data/entities'\nimport { getShippingAdapter } from '../../../lib/adapter-registry'\nimport type { ShippingCarrierService } from '../../../lib/shipping-service'\nimport { getShippingCarrierQueue } from '../../../lib/queue'\nimport { shippingCarriersTag } from '../../openapi'\n\nexport const metadata = {\n path: '/shipping-carriers/webhook/[provider]',\n POST: { requireAuth: false },\n}\n\nfunction readCarrierShipmentId(payload: Record<string, unknown> | null): string | null {\n if (!payload) return null\n const shipmentId = payload.shipmentId\n if (typeof shipmentId === 'string' && shipmentId.trim().length > 0) return shipmentId.trim()\n const data = payload.data\n if (data && typeof data === 'object') {\n const nested = (data as Record<string, unknown>).shipmentId\n if (typeof nested === 'string' && nested.trim().length > 0) return nested.trim()\n }\n return null\n}\n\nexport async function POST(req: Request, { params }: { params: Promise<{ provider: string }> | { provider: string } }) {\n const resolvedParams = await params\n const providerKey = resolvedParams.provider\n const adapter = getShippingAdapter(providerKey)\n if (!adapter) {\n return NextResponse.json({ error: `No shipping adapter for provider: ${providerKey}` }, { status: 404 })\n }\n\n const rawBody = await req.text()\n const headers: Record<string, string> = {}\n req.headers.forEach((value, key) => {\n headers[key] = value\n })\n\n const container = await createRequestContainer()\n const service = container.resolve('shippingCarrierService') as ShippingCarrierService\n const em = container.resolve('em') as EntityManager\n const integrationCredentialsService = container.resolve('integrationCredentialsService') as CredentialsService\n const queue = getShippingCarrierQueue('shipping-carriers-webhook')\n const payload = await readJsonSafe<Record<string, unknown>>(rawBody)\n const carrierShipmentId = readCarrierShipmentId(payload)\n\n try {\n const candidates = carrierShipmentId\n ? await findWithDecryption(\n em,\n CarrierShipment,\n {\n providerKey,\n carrierShipmentId,\n deletedAt: null,\n },\n { limit: 10, orderBy: { createdAt: 'desc' } },\n )\n : []\n\n let shipment = null as CarrierShipment | null\n let matchedScope = null as { organizationId: string; tenantId: string } | null\n let event = null as Awaited<ReturnType<typeof adapter.verifyWebhook>> | null\n let lastVerificationError: unknown = null\n\n for (const candidate of candidates) {\n const candidateScope = { organizationId: candidate.organizationId, tenantId: candidate.tenantId }\n const credentials = await integrationCredentialsService.resolve(`carrier_${providerKey}`, candidateScope) ?? {}\n try {\n event = await adapter.verifyWebhook({ rawBody, headers, credentials })\n shipment = candidate\n matchedScope = candidateScope\n break\n } catch (error: unknown) {\n lastVerificationError = error\n }\n }\n\n if (!event) {\n try {\n event = await adapter.verifyWebhook({ rawBody, headers, credentials: {} })\n } catch (error: unknown) {\n throw lastVerificationError ?? error\n }\n }\n if (!event) {\n throw new Error('Webhook verification failed')\n }\n\n if (!shipment && carrierShipmentId && matchedScope) {\n shipment = await service.findShipmentByCarrierId(providerKey, carrierShipmentId, matchedScope)\n }\n\n const scope = shipment\n ? { organizationId: shipment.organizationId, tenantId: shipment.tenantId }\n : matchedScope\n\n await queue.enqueue({\n name: 'shipping-carrier-webhook',\n payload: {\n providerKey,\n event,\n shipmentId: shipment?.id ?? null,\n scope,\n },\n })\n\n return NextResponse.json({ received: true, queued: true }, { status: 202 })\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Webhook verification failed'\n return NextResponse.json({ error: message }, { status: 401 })\n }\n}\n\nexport const openApi = {\n tags: [shippingCarriersTag],\n summary: 'Receive shipping carrier webhook',\n methods: {\n POST: {\n summary: 'Process inbound carrier webhook',\n tags: [shippingCarriersTag],\n responses: [\n { status: 202, description: 'Webhook accepted for async processing' },\n { status: 401, description: 'Signature verification failed' },\n { status: 404, description: 'Unknown provider' },\n ],\n },\n },\n}\n"],
5
+ "mappings": "AAAA,SAAS,oBAAoB;AAC7B,SAAS,8BAA8B;AACvC,SAAS,0BAA0B;AACnC,SAAS,oBAAoB;AAG7B,SAAS,uBAAuB;AAChC,SAAS,0BAA0B;AAEnC,SAAS,+BAA+B;AACxC,SAAS,2BAA2B;AAE7B,MAAM,WAAW;AAAA,EACtB,MAAM;AAAA,EACN,MAAM,EAAE,aAAa,MAAM;AAC7B;AAEA,SAAS,sBAAsB,SAAwD;AACrF,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,aAAa,QAAQ;AAC3B,MAAI,OAAO,eAAe,YAAY,WAAW,KAAK,EAAE,SAAS,EAAG,QAAO,WAAW,KAAK;AAC3F,QAAM,OAAO,QAAQ;AACrB,MAAI,QAAQ,OAAO,SAAS,UAAU;AACpC,UAAM,SAAU,KAAiC;AACjD,QAAI,OAAO,WAAW,YAAY,OAAO,KAAK,EAAE,SAAS,EAAG,QAAO,OAAO,KAAK;AAAA,EACjF;AACA,SAAO;AACT;AAEA,eAAsB,KAAK,KAAc,EAAE,OAAO,GAAqE;AACrH,QAAM,iBAAiB,MAAM;AAC7B,QAAM,cAAc,eAAe;AACnC,QAAM,UAAU,mBAAmB,WAAW;AAC9C,MAAI,CAAC,SAAS;AACZ,WAAO,aAAa,KAAK,EAAE,OAAO,qCAAqC,WAAW,GAAG,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EACzG;AAEA,QAAM,UAAU,MAAM,IAAI,KAAK;AAC/B,QAAM,UAAkC,CAAC;AACzC,MAAI,QAAQ,QAAQ,CAAC,OAAO,QAAQ;AAClC,YAAQ,GAAG,IAAI;AAAA,EACjB,CAAC;AAED,QAAM,YAAY,MAAM,uBAAuB;AAC/C,QAAM,UAAU,UAAU,QAAQ,wBAAwB;AAC1D,QAAM,KAAK,UAAU,QAAQ,IAAI;AACjC,QAAM,gCAAgC,UAAU,QAAQ,+BAA+B;AACvF,QAAM,QAAQ,wBAAwB,2BAA2B;AACjE,QAAM,UAAU,MAAM,aAAsC,OAAO;AACnE,QAAM,oBAAoB,sBAAsB,OAAO;AAEvD,MAAI;AACF,UAAM,aAAa,oBACf,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA,WAAW;AAAA,MACb;AAAA,MACA,EAAE,OAAO,IAAI,SAAS,EAAE,WAAW,OAAO,EAAE;AAAA,IAC9C,IACE,CAAC;AAEL,QAAI,WAAW;AACf,QAAI,eAAe;AACnB,QAAI,QAAQ;AACZ,QAAI,wBAAiC;AAErC,eAAW,aAAa,YAAY;AAClC,YAAM,iBAAiB,EAAE,gBAAgB,UAAU,gBAAgB,UAAU,UAAU,SAAS;AAChG,YAAM,cAAc,MAAM,8BAA8B,QAAQ,WAAW,WAAW,IAAI,cAAc,KAAK,CAAC;AAC9G,UAAI;AACF,gBAAQ,MAAM,QAAQ,cAAc,EAAE,SAAS,SAAS,YAAY,CAAC;AACrE,mBAAW;AACX,uBAAe;AACf;AAAA,MACF,SAAS,OAAgB;AACvB,gCAAwB;AAAA,MAC1B;AAAA,IACF;AAEA,QAAI,CAAC,OAAO;AACV,UAAI;AACF,gBAAQ,MAAM,QAAQ,cAAc,EAAE,SAAS,SAAS,aAAa,CAAC,EAAE,CAAC;AAAA,MAC3E,SAAS,OAAgB;AACvB,cAAM,yBAAyB;AAAA,MACjC;AAAA,IACF;AACA,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,6BAA6B;AAAA,IAC/C;AAEA,QAAI,CAAC,YAAY,qBAAqB,cAAc;AAClD,iBAAW,MAAM,QAAQ,wBAAwB,aAAa,mBAAmB,YAAY;AAAA,IAC/F;AAEA,UAAM,QAAQ,WACV,EAAE,gBAAgB,SAAS,gBAAgB,UAAU,SAAS,SAAS,IACvE;AAEJ,UAAM,MAAM,QAAQ;AAAA,MAClB,MAAM;AAAA,MACN,SAAS;AAAA,QACP;AAAA,QACA;AAAA,QACA,YAAY,UAAU,MAAM;AAAA,QAC5B;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,aAAa,KAAK,EAAE,UAAU,MAAM,QAAQ,KAAK,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC5E,SAAS,OAAgB;AACvB,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,WAAO,aAAa,KAAK,EAAE,OAAO,QAAQ,GAAG,EAAE,QAAQ,IAAI,CAAC;AAAA,EAC9D;AACF;AAEO,MAAM,UAAU;AAAA,EACrB,MAAM,CAAC,mBAAmB;AAAA,EAC1B,SAAS;AAAA,EACT,SAAS;AAAA,IACP,MAAM;AAAA,MACJ,SAAS;AAAA,MACT,MAAM,CAAC,mBAAmB;AAAA,MAC1B,WAAW;AAAA,QACT,EAAE,QAAQ,KAAK,aAAa,wCAAwC;AAAA,QACpE,EAAE,QAAQ,KAAK,aAAa,gCAAgC;AAAA,QAC5D,EAAE,QAAQ,KAAK,aAAa,mBAAmB;AAAA,MACjD;AAAA,IACF;AAAA,EACF;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,82 @@
1
+ import { findOneWithDecryption, findWithDecryption } from "@open-mercato/shared/lib/encryption/find";
2
+ import { CarrierShipment } from "./entities.js";
3
+ const salesShipmentCarrierEnricher = {
4
+ id: "shipping_carriers.sales-shipment-carrier",
5
+ targetEntity: "sales.shipment",
6
+ priority: 40,
7
+ timeout: 2e3,
8
+ async enrichOne(record, context) {
9
+ const orderId = typeof record.orderId === "string" ? record.orderId : null;
10
+ if (!orderId) return record;
11
+ const em = context.em;
12
+ const scope = { organizationId: context.organizationId, tenantId: context.tenantId };
13
+ const shipment = await findOneWithDecryption(
14
+ em,
15
+ CarrierShipment,
16
+ {
17
+ orderId,
18
+ organizationId: context.organizationId,
19
+ tenantId: context.tenantId,
20
+ deletedAt: null
21
+ },
22
+ { orderBy: { createdAt: "desc" } },
23
+ scope
24
+ );
25
+ if (!shipment) return record;
26
+ return {
27
+ ...record,
28
+ _carrier: {
29
+ shipmentId: shipment.id,
30
+ providerKey: shipment.providerKey,
31
+ trackingNumber: shipment.trackingNumber,
32
+ status: shipment.unifiedStatus
33
+ }
34
+ };
35
+ },
36
+ async enrichMany(records, context) {
37
+ const orderIds = Array.from(new Set(
38
+ records.map((record) => typeof record.orderId === "string" ? record.orderId : null).filter((value) => Boolean(value))
39
+ ));
40
+ if (!orderIds.length) return records;
41
+ const em = context.em;
42
+ const scope = { organizationId: context.organizationId, tenantId: context.tenantId };
43
+ const shipments = await findWithDecryption(
44
+ em,
45
+ CarrierShipment,
46
+ {
47
+ orderId: { $in: orderIds },
48
+ organizationId: context.organizationId,
49
+ tenantId: context.tenantId,
50
+ deletedAt: null
51
+ },
52
+ { orderBy: { createdAt: "desc" } },
53
+ scope
54
+ );
55
+ const latestByOrderId = /* @__PURE__ */ new Map();
56
+ for (const shipment of shipments) {
57
+ if (!latestByOrderId.has(shipment.orderId)) {
58
+ latestByOrderId.set(shipment.orderId, shipment);
59
+ }
60
+ }
61
+ return records.map((record) => {
62
+ const orderId = typeof record.orderId === "string" ? record.orderId : null;
63
+ if (!orderId) return record;
64
+ const shipment = latestByOrderId.get(orderId);
65
+ if (!shipment) return record;
66
+ return {
67
+ ...record,
68
+ _carrier: {
69
+ shipmentId: shipment.id,
70
+ providerKey: shipment.providerKey,
71
+ trackingNumber: shipment.trackingNumber,
72
+ status: shipment.unifiedStatus
73
+ }
74
+ };
75
+ });
76
+ }
77
+ };
78
+ const enrichers = [salesShipmentCarrierEnricher];
79
+ export {
80
+ enrichers
81
+ };
82
+ //# sourceMappingURL=enrichers.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/shipping_carriers/data/enrichers.ts"],
4
+ "sourcesContent": ["import type { ResponseEnricher } from '@open-mercato/shared/lib/crud/response-enricher'\nimport type { EntityManager } from '@mikro-orm/postgresql'\nimport { findOneWithDecryption, findWithDecryption } from '@open-mercato/shared/lib/encryption/find'\nimport { CarrierShipment } from './entities'\n\ntype SalesShipmentRecord = Record<string, unknown> & { id?: string; shipmentId?: string; orderId?: string }\n\nconst salesShipmentCarrierEnricher: ResponseEnricher<SalesShipmentRecord, Record<string, unknown>> = {\n id: 'shipping_carriers.sales-shipment-carrier',\n targetEntity: 'sales.shipment',\n priority: 40,\n timeout: 2000,\n async enrichOne(record, context) {\n const orderId = typeof record.orderId === 'string' ? record.orderId : null\n if (!orderId) return record\n const em = context.em as EntityManager\n const scope = { organizationId: context.organizationId, tenantId: context.tenantId }\n const shipment = await findOneWithDecryption(\n em,\n CarrierShipment,\n {\n orderId,\n organizationId: context.organizationId,\n tenantId: context.tenantId,\n deletedAt: null,\n },\n { orderBy: { createdAt: 'desc' } },\n scope,\n )\n if (!shipment) return record\n return {\n ...record,\n _carrier: {\n shipmentId: shipment.id,\n providerKey: shipment.providerKey,\n trackingNumber: shipment.trackingNumber,\n status: shipment.unifiedStatus,\n },\n }\n },\n async enrichMany(records, context) {\n const orderIds = Array.from(new Set(\n records\n .map((record) => (typeof record.orderId === 'string' ? record.orderId : null))\n .filter((value): value is string => Boolean(value)),\n ))\n if (!orderIds.length) return records\n\n const em = context.em as EntityManager\n const scope = { organizationId: context.organizationId, tenantId: context.tenantId }\n const shipments = await findWithDecryption(\n em,\n CarrierShipment,\n {\n orderId: { $in: orderIds },\n organizationId: context.organizationId,\n tenantId: context.tenantId,\n deletedAt: null,\n },\n { orderBy: { createdAt: 'desc' } },\n scope,\n )\n\n const latestByOrderId = new Map<string, CarrierShipment>()\n for (const shipment of shipments) {\n if (!latestByOrderId.has(shipment.orderId)) {\n latestByOrderId.set(shipment.orderId, shipment)\n }\n }\n\n return records.map((record) => {\n const orderId = typeof record.orderId === 'string' ? record.orderId : null\n if (!orderId) return record\n const shipment = latestByOrderId.get(orderId)\n if (!shipment) return record\n return {\n ...record,\n _carrier: {\n shipmentId: shipment.id,\n providerKey: shipment.providerKey,\n trackingNumber: shipment.trackingNumber,\n status: shipment.unifiedStatus,\n },\n }\n })\n },\n}\n\nexport const enrichers: ResponseEnricher[] = [salesShipmentCarrierEnricher]\n"],
5
+ "mappings": "AAEA,SAAS,uBAAuB,0BAA0B;AAC1D,SAAS,uBAAuB;AAIhC,MAAM,+BAA+F;AAAA,EACnG,IAAI;AAAA,EACJ,cAAc;AAAA,EACd,UAAU;AAAA,EACV,SAAS;AAAA,EACT,MAAM,UAAU,QAAQ,SAAS;AAC/B,UAAM,UAAU,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU;AACtE,QAAI,CAAC,QAAS,QAAO;AACrB,UAAM,KAAK,QAAQ;AACnB,UAAM,QAAQ,EAAE,gBAAgB,QAAQ,gBAAgB,UAAU,QAAQ,SAAS;AACnF,UAAM,WAAW,MAAM;AAAA,MACrB;AAAA,MACA;AAAA,MACA;AAAA,QACE;AAAA,QACA,gBAAgB,QAAQ;AAAA,QACxB,UAAU,QAAQ;AAAA,QAClB,WAAW;AAAA,MACb;AAAA,MACA,EAAE,SAAS,EAAE,WAAW,OAAO,EAAE;AAAA,MACjC;AAAA,IACF;AACA,QAAI,CAAC,SAAU,QAAO;AACtB,WAAO;AAAA,MACL,GAAG;AAAA,MACH,UAAU;AAAA,QACR,YAAY,SAAS;AAAA,QACrB,aAAa,SAAS;AAAA,QACtB,gBAAgB,SAAS;AAAA,QACzB,QAAQ,SAAS;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM,WAAW,SAAS,SAAS;AACjC,UAAM,WAAW,MAAM,KAAK,IAAI;AAAA,MAC9B,QACG,IAAI,CAAC,WAAY,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU,IAAK,EAC5E,OAAO,CAAC,UAA2B,QAAQ,KAAK,CAAC;AAAA,IACtD,CAAC;AACD,QAAI,CAAC,SAAS,OAAQ,QAAO;AAE7B,UAAM,KAAK,QAAQ;AACnB,UAAM,QAAQ,EAAE,gBAAgB,QAAQ,gBAAgB,UAAU,QAAQ,SAAS;AACnF,UAAM,YAAY,MAAM;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,QACE,SAAS,EAAE,KAAK,SAAS;AAAA,QACzB,gBAAgB,QAAQ;AAAA,QACxB,UAAU,QAAQ;AAAA,QAClB,WAAW;AAAA,MACb;AAAA,MACA,EAAE,SAAS,EAAE,WAAW,OAAO,EAAE;AAAA,MACjC;AAAA,IACF;AAEA,UAAM,kBAAkB,oBAAI,IAA6B;AACzD,eAAW,YAAY,WAAW;AAChC,UAAI,CAAC,gBAAgB,IAAI,SAAS,OAAO,GAAG;AAC1C,wBAAgB,IAAI,SAAS,SAAS,QAAQ;AAAA,MAChD;AAAA,IACF;AAEA,WAAO,QAAQ,IAAI,CAAC,WAAW;AAC7B,YAAM,UAAU,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU;AACtE,UAAI,CAAC,QAAS,QAAO;AACrB,YAAM,WAAW,gBAAgB,IAAI,OAAO;AAC5C,UAAI,CAAC,SAAU,QAAO;AACtB,aAAO;AAAA,QACL,GAAG;AAAA,QACH,UAAU;AAAA,UACR,YAAY,SAAS;AAAA,UACrB,aAAa,SAAS;AAAA,UACtB,gBAAgB,SAAS;AAAA,UACzB,QAAQ,SAAS;AAAA,QACnB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAEO,MAAM,YAAgC,CAAC,4BAA4B;",
6
+ "names": []
7
+ }
@@ -0,0 +1,80 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __decorateClass = (decorators, target, key, kind) => {
4
+ var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target;
5
+ for (var i = decorators.length - 1, decorator; i >= 0; i--)
6
+ if (decorator = decorators[i])
7
+ result = (kind ? decorator(target, key, result) : decorator(result)) || result;
8
+ if (kind && result) __defProp(target, key, result);
9
+ return result;
10
+ };
11
+ import { Entity, Index, OptionalProps, PrimaryKey, Property } from "@mikro-orm/core";
12
+ OptionalProps;
13
+ let CarrierShipment = class {
14
+ constructor() {
15
+ this.unifiedStatus = "label_created";
16
+ this.createdAt = /* @__PURE__ */ new Date();
17
+ this.updatedAt = /* @__PURE__ */ new Date();
18
+ }
19
+ };
20
+ __decorateClass([
21
+ PrimaryKey({ type: "uuid", defaultRaw: "gen_random_uuid()" })
22
+ ], CarrierShipment.prototype, "id", 2);
23
+ __decorateClass([
24
+ Property({ name: "order_id", type: "uuid" })
25
+ ], CarrierShipment.prototype, "orderId", 2);
26
+ __decorateClass([
27
+ Property({ name: "provider_key", type: "text" })
28
+ ], CarrierShipment.prototype, "providerKey", 2);
29
+ __decorateClass([
30
+ Property({ name: "carrier_shipment_id", type: "text" })
31
+ ], CarrierShipment.prototype, "carrierShipmentId", 2);
32
+ __decorateClass([
33
+ Property({ name: "tracking_number", type: "text" })
34
+ ], CarrierShipment.prototype, "trackingNumber", 2);
35
+ __decorateClass([
36
+ Property({ name: "unified_status", type: "text" })
37
+ ], CarrierShipment.prototype, "unifiedStatus", 2);
38
+ __decorateClass([
39
+ Property({ name: "carrier_status", type: "text", nullable: true })
40
+ ], CarrierShipment.prototype, "carrierStatus", 2);
41
+ __decorateClass([
42
+ Property({ name: "label_url", type: "text", nullable: true })
43
+ ], CarrierShipment.prototype, "labelUrl", 2);
44
+ __decorateClass([
45
+ Property({ name: "label_data", type: "text", nullable: true })
46
+ ], CarrierShipment.prototype, "labelData", 2);
47
+ __decorateClass([
48
+ Property({ name: "tracking_events", type: "jsonb", nullable: true })
49
+ ], CarrierShipment.prototype, "trackingEvents", 2);
50
+ __decorateClass([
51
+ Property({ name: "organization_id", type: "uuid" })
52
+ ], CarrierShipment.prototype, "organizationId", 2);
53
+ __decorateClass([
54
+ Property({ name: "tenant_id", type: "uuid" })
55
+ ], CarrierShipment.prototype, "tenantId", 2);
56
+ __decorateClass([
57
+ Property({ name: "last_webhook_at", type: Date, nullable: true })
58
+ ], CarrierShipment.prototype, "lastWebhookAt", 2);
59
+ __decorateClass([
60
+ Property({ name: "last_polled_at", type: Date, nullable: true })
61
+ ], CarrierShipment.prototype, "lastPolledAt", 2);
62
+ __decorateClass([
63
+ Property({ name: "created_at", type: Date, onCreate: () => /* @__PURE__ */ new Date() })
64
+ ], CarrierShipment.prototype, "createdAt", 2);
65
+ __decorateClass([
66
+ Property({ name: "updated_at", type: Date, onUpdate: () => /* @__PURE__ */ new Date() })
67
+ ], CarrierShipment.prototype, "updatedAt", 2);
68
+ __decorateClass([
69
+ Property({ name: "deleted_at", type: Date, nullable: true })
70
+ ], CarrierShipment.prototype, "deletedAt", 2);
71
+ CarrierShipment = __decorateClass([
72
+ Entity({ tableName: "carrier_shipments" }),
73
+ Index({ properties: ["orderId", "organizationId", "tenantId"] }),
74
+ Index({ properties: ["providerKey", "carrierShipmentId", "organizationId"] }),
75
+ Index({ properties: ["organizationId", "tenantId", "unifiedStatus"] })
76
+ ], CarrierShipment);
77
+ export {
78
+ CarrierShipment
79
+ };
80
+ //# sourceMappingURL=entities.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/shipping_carriers/data/entities.ts"],
4
+ "sourcesContent": ["import { Entity, Index, OptionalProps, PrimaryKey, Property } from '@mikro-orm/core'\n\n@Entity({ tableName: 'carrier_shipments' })\n@Index({ properties: ['orderId', 'organizationId', 'tenantId'] })\n@Index({ properties: ['providerKey', 'carrierShipmentId', 'organizationId'] })\n@Index({ properties: ['organizationId', 'tenantId', 'unifiedStatus'] })\nexport class CarrierShipment {\n [OptionalProps]?: 'labelUrl' | 'labelData' | 'trackingEvents' | 'carrierStatus' | 'lastWebhookAt' | 'lastPolledAt' | 'createdAt' | 'updatedAt' | 'deletedAt'\n\n @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' })\n id!: string\n\n @Property({ name: 'order_id', type: 'uuid' })\n orderId!: string\n\n @Property({ name: 'provider_key', type: 'text' })\n providerKey!: string\n\n @Property({ name: 'carrier_shipment_id', type: 'text' })\n carrierShipmentId!: string\n\n @Property({ name: 'tracking_number', type: 'text' })\n trackingNumber!: string\n\n @Property({ name: 'unified_status', type: 'text' })\n unifiedStatus: string = 'label_created'\n\n @Property({ name: 'carrier_status', type: 'text', nullable: true })\n carrierStatus?: string | null\n\n @Property({ name: 'label_url', type: 'text', nullable: true })\n labelUrl?: string | null\n\n @Property({ name: 'label_data', type: 'text', nullable: true })\n labelData?: string | null\n\n @Property({ name: 'tracking_events', type: 'jsonb', nullable: true })\n trackingEvents?: Array<{ status: string; occurredAt: string; location?: string }> | null\n\n @Property({ name: 'organization_id', type: 'uuid' })\n organizationId!: string\n\n @Property({ name: 'tenant_id', type: 'uuid' })\n tenantId!: string\n\n @Property({ name: 'last_webhook_at', type: Date, nullable: true })\n lastWebhookAt?: Date | null\n\n @Property({ name: 'last_polled_at', type: Date, nullable: true })\n lastPolledAt?: Date | null\n\n @Property({ name: 'created_at', type: Date, onCreate: () => new Date() })\n createdAt: Date = new Date()\n\n @Property({ name: 'updated_at', type: Date, onUpdate: () => new Date() })\n updatedAt: Date = new Date()\n\n @Property({ name: 'deleted_at', type: Date, nullable: true })\n deletedAt?: Date | null\n}\n"],
5
+ "mappings": ";;;;;;;;;;AAAA,SAAS,QAAQ,OAAO,eAAe,YAAY,gBAAgB;AAOhE;AADI,IAAM,kBAAN,MAAsB;AAAA,EAAtB;AAmBL,yBAAwB;AA2BxB,qBAAkB,oBAAI,KAAK;AAG3B,qBAAkB,oBAAI,KAAK;AAAA;AAI7B;AAjDE;AAAA,EADC,WAAW,EAAE,MAAM,QAAQ,YAAY,oBAAoB,CAAC;AAAA,GAHlD,gBAIX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,YAAY,MAAM,OAAO,CAAC;AAAA,GANjC,gBAOX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,gBAAgB,MAAM,OAAO,CAAC;AAAA,GATrC,gBAUX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,uBAAuB,MAAM,OAAO,CAAC;AAAA,GAZ5C,gBAaX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,mBAAmB,MAAM,OAAO,CAAC;AAAA,GAfxC,gBAgBX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,kBAAkB,MAAM,OAAO,CAAC;AAAA,GAlBvC,gBAmBX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,kBAAkB,MAAM,QAAQ,UAAU,KAAK,CAAC;AAAA,GArBvD,gBAsBX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,aAAa,MAAM,QAAQ,UAAU,KAAK,CAAC;AAAA,GAxBlD,gBAyBX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,cAAc,MAAM,QAAQ,UAAU,KAAK,CAAC;AAAA,GA3BnD,gBA4BX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,mBAAmB,MAAM,SAAS,UAAU,KAAK,CAAC;AAAA,GA9BzD,gBA+BX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,mBAAmB,MAAM,OAAO,CAAC;AAAA,GAjCxC,gBAkCX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,aAAa,MAAM,OAAO,CAAC;AAAA,GApClC,gBAqCX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,mBAAmB,MAAM,MAAM,UAAU,KAAK,CAAC;AAAA,GAvCtD,gBAwCX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,kBAAkB,MAAM,MAAM,UAAU,KAAK,CAAC;AAAA,GA1CrD,gBA2CX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,cAAc,MAAM,MAAM,UAAU,MAAM,oBAAI,KAAK,EAAE,CAAC;AAAA,GA7C7D,gBA8CX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,cAAc,MAAM,MAAM,UAAU,MAAM,oBAAI,KAAK,EAAE,CAAC;AAAA,GAhD7D,gBAiDX;AAGA;AAAA,EADC,SAAS,EAAE,MAAM,cAAc,MAAM,MAAM,UAAU,KAAK,CAAC;AAAA,GAnDjD,gBAoDX;AApDW,kBAAN;AAAA,EAJN,OAAO,EAAE,WAAW,oBAAoB,CAAC;AAAA,EACzC,MAAM,EAAE,YAAY,CAAC,WAAW,kBAAkB,UAAU,EAAE,CAAC;AAAA,EAC/D,MAAM,EAAE,YAAY,CAAC,eAAe,qBAAqB,gBAAgB,EAAE,CAAC;AAAA,EAC5E,MAAM,EAAE,YAAY,CAAC,kBAAkB,YAAY,eAAe,EAAE,CAAC;AAAA,GACzD;",
6
+ "names": []
7
+ }
@@ -0,0 +1,49 @@
1
+ import { z } from "zod";
2
+ const addressSchema = z.object({
3
+ countryCode: z.string().min(2).max(3),
4
+ postalCode: z.string().min(1),
5
+ city: z.string().min(1),
6
+ line1: z.string().min(1),
7
+ line2: z.string().optional()
8
+ });
9
+ const packageSchema = z.object({
10
+ weightKg: z.number().positive(),
11
+ lengthCm: z.number().positive(),
12
+ widthCm: z.number().positive(),
13
+ heightCm: z.number().positive()
14
+ });
15
+ const calculateRatesSchema = z.object({
16
+ providerKey: z.string().min(1),
17
+ origin: addressSchema,
18
+ destination: addressSchema,
19
+ packages: z.array(packageSchema).min(1)
20
+ });
21
+ const createShipmentSchema = z.object({
22
+ providerKey: z.string().min(1),
23
+ orderId: z.string().uuid(),
24
+ origin: addressSchema,
25
+ destination: addressSchema,
26
+ packages: z.array(packageSchema).min(1),
27
+ serviceCode: z.string().min(1),
28
+ labelFormat: z.enum(["pdf", "zpl", "png"]).optional()
29
+ });
30
+ const trackingQuerySchema = z.object({
31
+ providerKey: z.string().min(1),
32
+ shipmentId: z.string().uuid().optional(),
33
+ trackingNumber: z.string().min(1).optional()
34
+ }).refine((value) => Boolean(value.shipmentId || value.trackingNumber), {
35
+ message: "shipmentId or trackingNumber is required",
36
+ path: ["shipmentId"]
37
+ });
38
+ const cancelShipmentSchema = z.object({
39
+ providerKey: z.string().min(1),
40
+ shipmentId: z.string().uuid(),
41
+ reason: z.string().max(200).optional()
42
+ });
43
+ export {
44
+ calculateRatesSchema,
45
+ cancelShipmentSchema,
46
+ createShipmentSchema,
47
+ trackingQuerySchema
48
+ };
49
+ //# sourceMappingURL=validators.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/shipping_carriers/data/validators.ts"],
4
+ "sourcesContent": ["import { z } from 'zod'\n\nconst addressSchema = z.object({\n countryCode: z.string().min(2).max(3),\n postalCode: z.string().min(1),\n city: z.string().min(1),\n line1: z.string().min(1),\n line2: z.string().optional(),\n})\n\nconst packageSchema = z.object({\n weightKg: z.number().positive(),\n lengthCm: z.number().positive(),\n widthCm: z.number().positive(),\n heightCm: z.number().positive(),\n})\n\nexport const calculateRatesSchema = z.object({\n providerKey: z.string().min(1),\n origin: addressSchema,\n destination: addressSchema,\n packages: z.array(packageSchema).min(1),\n})\n\nexport const createShipmentSchema = z.object({\n providerKey: z.string().min(1),\n orderId: z.string().uuid(),\n origin: addressSchema,\n destination: addressSchema,\n packages: z.array(packageSchema).min(1),\n serviceCode: z.string().min(1),\n labelFormat: z.enum(['pdf', 'zpl', 'png']).optional(),\n})\n\nexport const trackingQuerySchema = z.object({\n providerKey: z.string().min(1),\n shipmentId: z.string().uuid().optional(),\n trackingNumber: z.string().min(1).optional(),\n}).refine((value) => Boolean(value.shipmentId || value.trackingNumber), {\n message: 'shipmentId or trackingNumber is required',\n path: ['shipmentId'],\n})\n\nexport const cancelShipmentSchema = z.object({\n providerKey: z.string().min(1),\n shipmentId: z.string().uuid(),\n reason: z.string().max(200).optional(),\n})\n"],
5
+ "mappings": "AAAA,SAAS,SAAS;AAElB,MAAM,gBAAgB,EAAE,OAAO;AAAA,EAC7B,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC;AAAA,EACpC,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC5B,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACtB,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EACvB,OAAO,EAAE,OAAO,EAAE,SAAS;AAC7B,CAAC;AAED,MAAM,gBAAgB,EAAE,OAAO;AAAA,EAC7B,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,EAC9B,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,UAAU,EAAE,OAAO,EAAE,SAAS;AAChC,CAAC;AAEM,MAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC7B,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,UAAU,EAAE,MAAM,aAAa,EAAE,IAAI,CAAC;AACxC,CAAC;AAEM,MAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC7B,SAAS,EAAE,OAAO,EAAE,KAAK;AAAA,EACzB,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,UAAU,EAAE,MAAM,aAAa,EAAE,IAAI,CAAC;AAAA,EACtC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC7B,aAAa,EAAE,KAAK,CAAC,OAAO,OAAO,KAAK,CAAC,EAAE,SAAS;AACtD,CAAC;AAEM,MAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC7B,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS;AAAA,EACvC,gBAAgB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAC7C,CAAC,EAAE,OAAO,CAAC,UAAU,QAAQ,MAAM,cAAc,MAAM,cAAc,GAAG;AAAA,EACtE,SAAS;AAAA,EACT,MAAM,CAAC,YAAY;AACrB,CAAC;AAEM,MAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC7B,YAAY,EAAE,OAAO,EAAE,KAAK;AAAA,EAC5B,QAAQ,EAAE,OAAO,EAAE,IAAI,GAAG,EAAE,SAAS;AACvC,CAAC;",
6
+ "names": []
7
+ }