@lodashventure/medusa-parcel-shipping 0.0.7 → 0.2.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/.medusa/server/api/admin/documents/document-packing-slip-settings/route.js +62 -0
- package/.medusa/server/api/admin/documents/packing-slip/preview/route.js +47 -0
- package/.medusa/server/api/admin/documents/packing-slip/route.js +112 -0
- package/.medusa/server/api/admin/parcel-boxes/[id]/route.js +45 -0
- package/.medusa/server/api/admin/parcel-boxes/route.js +49 -0
- package/.medusa/server/api/admin/shipping-config/areas/[id]/route.js +42 -0
- package/.medusa/server/api/admin/shipping-config/areas/route.js +49 -0
- package/.medusa/server/api/admin/shipping-config/rates/[id]/route.js +82 -0
- package/.medusa/server/api/admin/shipping-config/rates/route.js +95 -0
- package/.medusa/server/api/shipping/distance/route.js +85 -0
- package/.medusa/server/api/shipping/distance/utils/zodTransform.js +20 -0
- package/.medusa/server/api/store/parcel-box-selector/route.js +55 -0
- package/.medusa/server/api/webhooks/tracking/route.js +48 -0
- package/.medusa/server/common/types.js +4 -0
- package/.medusa/server/common/utils/osrm-client.js +81 -0
- package/.medusa/server/common/utils/packing.js +379 -0
- package/.medusa/server/{src/modules/parcel-shipping/index.js → index.js} +9 -9
- package/.medusa/server/links/index.js +9 -0
- package/.medusa/server/links/packing-slip-order.js +13 -0
- package/.medusa/server/modules/documents/index.js +24 -0
- package/.medusa/server/modules/documents/models/document-invoice.js +20 -0
- package/.medusa/server/modules/documents/models/document-packing-slip-settings.js +29 -0
- package/.medusa/server/modules/documents/models/document-packing-slip.js +32 -0
- package/.medusa/server/modules/documents/models/document-settings.js +32 -0
- package/.medusa/server/modules/documents/models/index.js +15 -0
- package/.medusa/server/modules/documents/service.js +219 -0
- package/.medusa/server/modules/documents/services/generators/invoice-generator.js +73 -0
- package/.medusa/server/modules/documents/services/generators/packing-slip-generator.js +73 -0
- package/.medusa/server/modules/documents/services/templates/invoices/basic/basic-logo.js +55 -0
- package/.medusa/server/modules/documents/services/templates/invoices/basic/basic.js +52 -0
- package/.medusa/server/modules/documents/services/templates/invoices/basic/parts/customer-info.js +69 -0
- package/.medusa/server/modules/documents/services/templates/invoices/basic/parts/header-for-logo.js +32 -0
- package/.medusa/server/modules/documents/services/templates/invoices/basic/parts/header-logo.js +29 -0
- package/.medusa/server/modules/documents/services/templates/invoices/basic/parts/header.js +35 -0
- package/.medusa/server/modules/documents/services/templates/invoices/basic/parts/hr.js +23 -0
- package/.medusa/server/modules/documents/services/templates/invoices/basic/parts/invoice-info.js +35 -0
- package/.medusa/server/modules/documents/services/templates/invoices/basic/parts/table.js +97 -0
- package/.medusa/server/modules/documents/services/templates/packing-slips/basic/basic.js +52 -0
- package/.medusa/server/modules/documents/services/templates/packing-slips/basic/parts/customer-info-small.js +69 -0
- package/.medusa/server/modules/documents/services/templates/packing-slips/basic/parts/customer-info.js +65 -0
- package/.medusa/server/modules/documents/services/templates/packing-slips/basic/parts/header-small.js +37 -0
- package/.medusa/server/modules/documents/services/templates/packing-slips/basic/parts/header.js +37 -0
- package/.medusa/server/modules/documents/services/templates/packing-slips/basic/parts/hr.js +32 -0
- package/.medusa/server/modules/documents/services/templates/packing-slips/basic/parts/table-items-small.js +44 -0
- package/.medusa/server/modules/documents/services/templates/packing-slips/basic/parts/table-items.js +44 -0
- package/.medusa/server/modules/documents/services/templates/packing-slips/basic/parts/table-order-info-small.js +35 -0
- package/.medusa/server/modules/documents/services/templates/packing-slips/basic/parts/table-order-info.js +36 -0
- package/.medusa/server/modules/documents/services/templates/packing-slips/basic/small.js +53 -0
- package/.medusa/server/modules/documents/types/api.js +14 -0
- package/.medusa/server/modules/documents/types/constants.js +17 -0
- package/.medusa/server/modules/documents/types/dto.js +14 -0
- package/.medusa/server/modules/documents/types/template-kind.js +25 -0
- package/.medusa/server/modules/documents/utils/currency.js +25 -0
- package/.medusa/server/providers/company-truck/index.js +10 -0
- package/.medusa/server/providers/company-truck/models/company-truck-rate.js +23 -0
- package/.medusa/server/{src → providers/company-truck/models}/index.js +4 -8
- package/.medusa/server/providers/company-truck/models/parcel-box.js +21 -0
- package/.medusa/server/providers/company-truck/models/service-area.js +20 -0
- package/.medusa/server/providers/company-truck/service.js +456 -0
- package/.medusa/server/{src/modules/parcel-shipping → providers/company-truck}/types.js +1 -1
- package/.medusa/server/providers/private-carrier/index.js +10 -0
- package/.medusa/server/providers/private-carrier/models/index.js +20 -0
- package/.medusa/server/providers/private-carrier/models/parcel-box.js +21 -0
- package/.medusa/server/providers/private-carrier/models/private-carrier-rate.js +23 -0
- package/.medusa/server/providers/private-carrier/models/service-area.js +20 -0
- package/.medusa/server/providers/private-carrier/service.js +392 -0
- package/.medusa/server/providers/private-carrier/types.js +3 -0
- package/.medusa/server/src/admin/index.js +3 -2
- package/.medusa/server/src/admin/index.mjs +3 -2
- package/.medusa/server/workflows/assign-packing-slip.js +31 -0
- package/.medusa/server/workflows/index.js +9 -0
- package/package.json +25 -34
- package/.medusa/server/src/api/admin/parcel-boxes/[id]/route.js +0 -47
- package/.medusa/server/src/api/admin/parcel-boxes/route.js +0 -48
- package/.medusa/server/src/api/admin/shipping-config/areas/[id]/route.js +0 -44
- package/.medusa/server/src/api/admin/shipping-config/areas/route.js +0 -48
- package/.medusa/server/src/api/admin/shipping-config/rates/[id]/route.js +0 -53
- package/.medusa/server/src/api/admin/shipping-config/rates/route.js +0 -55
- package/.medusa/server/src/api/store/parcel-box-selector/route.js +0 -53
- package/.medusa/server/src/modules/parcel-shipping/migrations/Migration20251015120000.js +0 -70
- package/.medusa/server/src/modules/parcel-shipping/models/parcel-box.js +0 -21
- package/.medusa/server/src/modules/parcel-shipping/models/service-area.js +0 -20
- package/.medusa/server/src/modules/parcel-shipping/models/shipping-rate.js +0 -20
- package/.medusa/server/src/modules/parcel-shipping/service.js +0 -172
- package/.medusa/server/src/modules/parcel-shipping/utils/packing.js +0 -319
- package/.medusa/server/src/providers/company-truck/index.js +0 -19
- package/.medusa/server/src/providers/parcel-fulfillment-base.js +0 -180
- package/.medusa/server/src/providers/private-carrier/index.js +0 -19
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.GET = void 0;
|
|
7
|
+
const zod_1 = __importDefault(require("zod"));
|
|
8
|
+
const zodTransform_1 = require("./utils/zodTransform");
|
|
9
|
+
const querySchema = zod_1.default.object({
|
|
10
|
+
origin: zod_1.default.string().transform(zodTransform_1.zodTransformStringToLatLng),
|
|
11
|
+
destination: zod_1.default.string().transform(zodTransform_1.zodTransformStringToLatLng),
|
|
12
|
+
weight: zod_1.default.coerce.number().positive(),
|
|
13
|
+
province: zod_1.default.string().optional(),
|
|
14
|
+
postcode: zod_1.default.string().optional(),
|
|
15
|
+
});
|
|
16
|
+
const GET = async (req, res) => {
|
|
17
|
+
const queryValidationResult = querySchema.safeParse(req.query);
|
|
18
|
+
if (!queryValidationResult.success) {
|
|
19
|
+
return res.status(400).json({
|
|
20
|
+
error: "validation_error",
|
|
21
|
+
message: "Invalid query parameters",
|
|
22
|
+
details: JSON.parse(queryValidationResult.error.message),
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
const { origin, destination, weight, province, postcode } = queryValidationResult.data;
|
|
27
|
+
// Convert lat/lng strings to tuples
|
|
28
|
+
const originLatLng = [
|
|
29
|
+
parseFloat(origin[0]),
|
|
30
|
+
parseFloat(origin[1]),
|
|
31
|
+
];
|
|
32
|
+
const destinationLatLng = [
|
|
33
|
+
parseFloat(destination[0]),
|
|
34
|
+
parseFloat(destination[1]),
|
|
35
|
+
];
|
|
36
|
+
// Prepare address for carrier selection
|
|
37
|
+
const address = {
|
|
38
|
+
province: province || "",
|
|
39
|
+
postcode: postcode || "",
|
|
40
|
+
country: "TH",
|
|
41
|
+
};
|
|
42
|
+
const fulfillmentService = req.scope.resolve("fulfillmentService");
|
|
43
|
+
// Try company truck first (in service area)
|
|
44
|
+
try {
|
|
45
|
+
const companyTruckProvider = (await fulfillmentService.retrieveProvider("company-truck"));
|
|
46
|
+
const result = await companyTruckProvider.quoteShippingWithDistance(originLatLng, destinationLatLng, address, weight);
|
|
47
|
+
res.json({
|
|
48
|
+
distance_km: result.distance_km,
|
|
49
|
+
carrier: result.method,
|
|
50
|
+
service_area: result.area,
|
|
51
|
+
weight_kg: result.weightKg,
|
|
52
|
+
shipping_cost: result.price,
|
|
53
|
+
currency: result.currency,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
catch (companyTruckError) {
|
|
57
|
+
// If company truck fails (out of service area), try private carrier
|
|
58
|
+
if (companyTruckError.message ===
|
|
59
|
+
"Address is not in company truck service area") {
|
|
60
|
+
const privateCarrierProvider = (await fulfillmentService.retrieveProvider("private-carrier"));
|
|
61
|
+
const result = await privateCarrierProvider.quoteShippingWithDistance(originLatLng, destinationLatLng, address, weight);
|
|
62
|
+
res.json({
|
|
63
|
+
distance_km: result.distance_km,
|
|
64
|
+
carrier: result.method,
|
|
65
|
+
service_area: result.area,
|
|
66
|
+
weight_kg: result.weightKg,
|
|
67
|
+
shipping_cost: result.price,
|
|
68
|
+
currency: result.currency,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
throw companyTruckError;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
console.error("[shipping/distance] Error:", error);
|
|
78
|
+
res.status(error.type === "not_allowed" ? 400 : 500).json({
|
|
79
|
+
error: error.code || "shipping_calculation_error",
|
|
80
|
+
message: error.message || "Unable to calculate shipping cost",
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
exports.GET = GET;
|
|
85
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3NoaXBwaW5nL2Rpc3RhbmNlL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLDhDQUFvQjtBQUNwQix1REFBa0U7QUFJbEUsTUFBTSxXQUFXLEdBQUcsYUFBQyxDQUFDLE1BQU0sQ0FBQztJQUMzQixNQUFNLEVBQUUsYUFBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyx5Q0FBMEIsQ0FBQztJQUN4RCxXQUFXLEVBQUUsYUFBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFNBQVMsQ0FBQyx5Q0FBMEIsQ0FBQztJQUM3RCxNQUFNLEVBQUUsYUFBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDcEMsUUFBUSxFQUFFLGFBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDL0IsUUFBUSxFQUFFLGFBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDaEMsQ0FBQyxDQUFDO0FBRUksTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUFFLEdBQWtCLEVBQUUsR0FBbUIsRUFBRSxFQUFFO0lBQ25FLE1BQU0scUJBQXFCLEdBQUcsV0FBVyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFL0QsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25DLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDMUIsS0FBSyxFQUFFLGtCQUFrQjtZQUN6QixPQUFPLEVBQUUsMEJBQTBCO1lBQ25DLE9BQU8sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7U0FDekQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELElBQUksQ0FBQztRQUNILE1BQU0s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
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.zodTransformStringToLatLng = void 0;
|
|
7
|
+
const zod_1 = __importDefault(require("zod"));
|
|
8
|
+
const zodTransformStringToLatLng = (latlng, ctx) => {
|
|
9
|
+
const values = latlng.split(",");
|
|
10
|
+
if (values.length !== 2) {
|
|
11
|
+
ctx.addIssue({
|
|
12
|
+
code: zod_1.default.ZodIssueCode.custom,
|
|
13
|
+
message: `latlng should be formatted as "lat,lng"`,
|
|
14
|
+
});
|
|
15
|
+
return zod_1.default.NEVER;
|
|
16
|
+
}
|
|
17
|
+
return values;
|
|
18
|
+
};
|
|
19
|
+
exports.zodTransformStringToLatLng = zodTransformStringToLatLng;
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9kVHJhbnNmb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwaS9zaGlwcGluZy9kaXN0YW5jZS91dGlscy96b2RUcmFuc2Zvcm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsOENBQW9CO0FBRWIsTUFBTSwwQkFBMEIsR0FBRyxDQUN4QyxNQUFjLEVBQ2QsR0FBb0IsRUFDcEIsRUFBRTtJQUNGLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakMsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3hCLEdBQUcsQ0FBQyxRQUFRLENBQUM7WUFDWCxJQUFJLEVBQUUsYUFBQyxDQUFDLFlBQVksQ0FBQyxNQUFNO1lBQzNCLE9BQU8sRUFBRSx5Q0FBeUM7U0FDbkQsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxhQUFDLENBQUMsS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUM7QUFkVyxRQUFBLDBCQUEwQiw4QkFjckMifQ==
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.POST = POST;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
6
|
+
const itemSchema = zod_1.z.object({
|
|
7
|
+
sku: zod_1.z.string().min(1),
|
|
8
|
+
width: zod_1.z.number().positive(),
|
|
9
|
+
length: zod_1.z.number().positive(),
|
|
10
|
+
height: zod_1.z.number().positive(),
|
|
11
|
+
weight: zod_1.z.number().nonnegative(),
|
|
12
|
+
quantity: zod_1.z.number().int().positive(),
|
|
13
|
+
attributes: zod_1.z
|
|
14
|
+
.object({
|
|
15
|
+
noStack: zod_1.z.boolean().optional(),
|
|
16
|
+
})
|
|
17
|
+
.optional(),
|
|
18
|
+
});
|
|
19
|
+
const bodySchema = zod_1.z.object({
|
|
20
|
+
items: zod_1.z.array(itemSchema).min(1),
|
|
21
|
+
shipping_address: zod_1.z.object({
|
|
22
|
+
province: zod_1.z.string().min(1),
|
|
23
|
+
postcode: zod_1.z.string().min(1),
|
|
24
|
+
country: zod_1.z.string().min(1),
|
|
25
|
+
}),
|
|
26
|
+
});
|
|
27
|
+
async function POST(req, res) {
|
|
28
|
+
const fulfillmentService = req.scope.resolve("fulfillmentService");
|
|
29
|
+
const provider = (await fulfillmentService.retrieveProvider("company-truck"));
|
|
30
|
+
try {
|
|
31
|
+
const payload = bodySchema.parse(req.body);
|
|
32
|
+
const result = await provider.quote(payload);
|
|
33
|
+
if (result.success) {
|
|
34
|
+
return res.status(200).json(result);
|
|
35
|
+
}
|
|
36
|
+
return res.status(200).json(result);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
if (error instanceof zod_1.ZodError) {
|
|
40
|
+
return res.status(400).json({
|
|
41
|
+
code: "invalid_payload",
|
|
42
|
+
issues: error.issues,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
if (error instanceof utils_1.MedusaError) {
|
|
46
|
+
return res
|
|
47
|
+
.status(error.type === utils_1.MedusaError.Types.NOT_ALLOWED ? 403 : 400)
|
|
48
|
+
.json({
|
|
49
|
+
code: error.message,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
throw error;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL3BhcmNlbC1ib3gtc2VsZWN0b3Ivcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUE0QkEsb0JBK0JDO0FBMURELDZCQUFrQztBQUNsQyxxREFBd0Q7QUFHeEQsTUFBTSxVQUFVLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztJQUMxQixHQUFHLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdEIsS0FBSyxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDNUIsTUFBTSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDN0IsTUFBTSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDN0IsTUFBTSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxXQUFXLEVBQUU7SUFDaEMsUUFBUSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLEVBQUU7SUFDckMsVUFBVSxFQUFFLE9BQUM7U0FDVixNQUFNLENBQUM7UUFDTixPQUFPLEVBQUUsT0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRTtLQUNoQyxDQUFDO1NBQ0QsUUFBUSxFQUFFO0NBQ2QsQ0FBQyxDQUFDO0FBRUgsTUFBTSxVQUFVLEdBQUcsT0FBQyxDQUFDLE1BQU0sQ0FBQztJQUMxQixLQUFLLEVBQUUsT0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2pDLGdCQUFnQixFQUFFLE9BQUMsQ0FBQyxNQUFNLENBQUM7UUFDekIsUUFBUSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzNCLFFBQVEsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzQixPQUFPLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDM0IsQ0FBQztDQUNILENBQUMsQ0FBQztBQUVJLEtBQUssVUFBVSxJQUFJLENBQUMsR0FBa0IsRUFBRSxHQUFtQjtJQUNoRSxNQUFNLGtCQUFrQixHQUFRLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDeEUsTUFBTSxRQUFRLEdBQUcsQ0FBQyxNQUFNLGtCQUFrQixDQUFDLGdCQUFnQixDQUN6RCxlQUFlLENBQ2hCLENBQW9DLENBQUM7SUFFdEMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRTdDLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ25CLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUVELE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFJLEtBQUssWUFBWSxjQUFRLEVBQUUsQ0FBQztZQUM5QixPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUMxQixJQUFJLEVBQUUsaUJBQWlCO2dCQUN2QixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07YUFDckIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksS0FBSyxZQUFZLG1CQUFXLEVBQUUsQ0FBQztZQUNqQyxPQUFPLEdBQUc7aUJBQ1AsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssbUJBQVcsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztpQkFDaEUsSUFBSSxDQUFDO2dCQUNKLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTzthQUNwQixDQUFDLENBQUM7UUFDUCxDQUFDO1FBQ0QsTUFBTSxLQUFLLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQyJ9
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.POST = void 0;
|
|
4
|
+
const POST = async (req, res) => {
|
|
5
|
+
try {
|
|
6
|
+
const payload = req.body;
|
|
7
|
+
// TODO: Verify webhook signature if your carrier supports it
|
|
8
|
+
// const isValid = verifyWebhookSignature(payload.signature, req.headers);
|
|
9
|
+
// if (!isValid) {
|
|
10
|
+
// return res.status(401).json({ error: "Invalid signature" });
|
|
11
|
+
// }
|
|
12
|
+
// TODO: Update fulfillment status in database
|
|
13
|
+
// You can use Medusa's fulfillment service to update the fulfillment
|
|
14
|
+
// const fulfillmentService: any = req.scope.resolve("fulfillmentService");
|
|
15
|
+
// await fulfillmentService.updateFulfillmentStatus(
|
|
16
|
+
// payload.tracking_number,
|
|
17
|
+
// payload.status
|
|
18
|
+
// );
|
|
19
|
+
// Log the tracking update
|
|
20
|
+
console.log("[Tracking Webhook] Received update:", {
|
|
21
|
+
tracking_number: payload.tracking_number,
|
|
22
|
+
status: payload.status,
|
|
23
|
+
location: payload.location,
|
|
24
|
+
carrier: payload.carrier,
|
|
25
|
+
timestamp: payload.timestamp,
|
|
26
|
+
});
|
|
27
|
+
// TODO: Send customer notification about tracking update
|
|
28
|
+
// const notificationService = req.scope.resolve("notificationService");
|
|
29
|
+
// await notificationService.send({
|
|
30
|
+
// to: customer.email,
|
|
31
|
+
// template: "tracking-update",
|
|
32
|
+
// data: payload,
|
|
33
|
+
// });
|
|
34
|
+
res.status(200).json({
|
|
35
|
+
success: true,
|
|
36
|
+
message: "Tracking update received",
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
console.error("[Tracking Webhook] Error processing webhook:", error);
|
|
41
|
+
res.status(500).json({
|
|
42
|
+
error: "internal_error",
|
|
43
|
+
message: error.message,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
exports.POST = POST;
|
|
48
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3dlYmhvb2tzL3RyYWNraW5nL3JvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWdDTyxNQUFNLElBQUksR0FBRyxLQUFLLEVBQUUsR0FBa0IsRUFBRSxHQUFtQixFQUFFLEVBQUU7SUFDcEUsSUFBSSxDQUFDO1FBQ0gsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLElBQThCLENBQUM7UUFFbkQsNkRBQTZEO1FBQzdELDBFQUEwRTtRQUMxRSxrQkFBa0I7UUFDbEIsaUVBQWlFO1FBQ2pFLElBQUk7UUFFSiw4Q0FBOEM7UUFDOUMscUVBQXFFO1FBQ3JFLDJFQUEyRTtRQUMzRSxvREFBb0Q7UUFDcEQsNkJBQTZCO1FBQzdCLG1CQUFtQjtRQUNuQixLQUFLO1FBRUwsMEJBQTBCO1FBQzFCLE9BQU8sQ0FBQyxHQUFHLENBQUMscUNBQXFDLEVBQUU7WUFDakQsZUFBZSxFQUFFLE9BQU8sQ0FBQyxlQUFlO1lBQ3hDLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtZQUN0QixRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVE7WUFDMUIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO1lBQ3hCLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUztTQUM3QixDQUFDLENBQUM7UUFFSCx5REFBeUQ7UUFDekQsd0VBQXdFO1FBQ3hFLG1DQUFtQztRQUNuQyx3QkFBd0I7UUFDeEIsaUNBQWlDO1FBQ2pDLG1CQUFtQjtRQUNuQixNQUFNO1FBRU4sR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDbkIsT0FBTyxFQUFFLElBQUk7WUFDYixPQUFPLEVBQUUsMEJBQTBCO1NBQ3BDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFBQyxPQUFPLEtBQVUsRUFBRSxDQUFDO1FBQ3BCLE9BQU8sQ0FBQyxLQUFLLENBQUMsOENBQThDLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDbkIsS0FBSyxFQUFFLGdCQUFnQjtZQUN2QixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU87U0FDdkIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUMsQ0FBQztBQTlDVyxRQUFBLElBQUksUUE4Q2YifQ==
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Common types shared between providers
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tbW9uL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx3Q0FBd0MifQ==
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.OSRMClient = void 0;
|
|
4
|
+
const utils_1 = require("@medusajs/framework/utils");
|
|
5
|
+
/**
|
|
6
|
+
* Client for interacting with OpenStreetMap Routing Machine (OSRM) API
|
|
7
|
+
* Used to calculate route distances for distance-based shipping pricing
|
|
8
|
+
*/
|
|
9
|
+
class OSRMClient {
|
|
10
|
+
constructor(baseUrl = "https://router.project-osrm.org") {
|
|
11
|
+
this.baseUrl = baseUrl;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Calculate the driving distance between two coordinates
|
|
15
|
+
* @param origin - [latitude, longitude] of the origin
|
|
16
|
+
* @param destination - [latitude, longitude] of the destination
|
|
17
|
+
* @returns Distance in kilometers
|
|
18
|
+
*/
|
|
19
|
+
async calculateRouteDistance(origin, destination) {
|
|
20
|
+
const [lat1, lng1] = origin;
|
|
21
|
+
const [lat2, lng2] = destination;
|
|
22
|
+
// OSRM expects coordinates in lng,lat format
|
|
23
|
+
const osrmUrl = `${this.baseUrl}/route/v1/driving/${lng1},${lat1};${lng2},${lat2}?overview=false`;
|
|
24
|
+
try {
|
|
25
|
+
const response = await fetch(osrmUrl);
|
|
26
|
+
if (!response.ok) {
|
|
27
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `OSRM API returned status ${response.status}: ${response.statusText}`);
|
|
28
|
+
}
|
|
29
|
+
const data = await response.json();
|
|
30
|
+
if (data.code !== "Ok") {
|
|
31
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `OSRM API returned error code: ${data.code}`);
|
|
32
|
+
}
|
|
33
|
+
if (!data.routes || data.routes.length === 0) {
|
|
34
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "No route found between origin and destination coordinates.");
|
|
35
|
+
}
|
|
36
|
+
// Convert meters to kilometers
|
|
37
|
+
const distanceKm = data.routes[0].distance / 1000;
|
|
38
|
+
return Number(distanceKm.toFixed(2));
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
if (error instanceof utils_1.MedusaError) {
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Failed to calculate route distance: ${error.message}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Calculate route with additional details (duration, geometry, etc.)
|
|
49
|
+
* @param origin - [latitude, longitude] of the origin
|
|
50
|
+
* @param destination - [latitude, longitude] of the destination
|
|
51
|
+
* @returns Route details including distance and duration
|
|
52
|
+
*/
|
|
53
|
+
async calculateRoute(origin, destination) {
|
|
54
|
+
const [lat1, lng1] = origin;
|
|
55
|
+
const [lat2, lng2] = destination;
|
|
56
|
+
const osrmUrl = `${this.baseUrl}/route/v1/driving/${lng1},${lat1};${lng2},${lat2}?overview=false&steps=false`;
|
|
57
|
+
try {
|
|
58
|
+
const response = await fetch(osrmUrl);
|
|
59
|
+
if (!response.ok) {
|
|
60
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `OSRM API returned status ${response.status}`);
|
|
61
|
+
}
|
|
62
|
+
const data = await response.json();
|
|
63
|
+
if (data.code !== "Ok" || !data.routes?.length) {
|
|
64
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, "No route found between coordinates");
|
|
65
|
+
}
|
|
66
|
+
const route = data.routes[0];
|
|
67
|
+
return {
|
|
68
|
+
distance_km: Number((route.distance / 1000).toFixed(2)),
|
|
69
|
+
duration_minutes: Number((route.duration / 60).toFixed(0)),
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
if (error instanceof utils_1.MedusaError) {
|
|
74
|
+
throw error;
|
|
75
|
+
}
|
|
76
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `Failed to calculate route: ${error.message}`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
exports.OSRMClient = OSRMClient;
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3NybS1jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tbW9uL3V0aWxzL29zcm0tY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHFEQUF3RDtBQWF4RDs7O0dBR0c7QUFDSCxNQUFhLFVBQVU7SUFHckIsWUFBWSxVQUFrQixpQ0FBaUM7UUFDN0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsS0FBSyxDQUFDLHNCQUFzQixDQUMxQixNQUF3QixFQUN4QixXQUE2QjtRQUU3QixNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUM1QixNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLFdBQVcsQ0FBQztRQUVqQyw2Q0FBNkM7UUFDN0MsTUFBTSxPQUFPLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxxQkFBcUIsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxpQkFBaUIsQ0FBQztRQUVsRyxJQUFJLENBQUM7WUFDSCxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUV0QyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUNqQixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQ2xDLDRCQUE0QixRQUFRLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FDdEUsQ0FBQztZQUNKLENBQUM7WUFFRCxNQUFNLElBQUksR0FBaUIsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7WUFFakQsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUN2QixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENB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
|