medusa-shiprocket-fulfillment-plugin 0.3.0 → 0.3.2
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/src/api/middlewares.js +15 -0
- package/.medusa/server/src/api/store/shiprocket/delivery-estimate/cache.js +54 -0
- package/.medusa/server/src/api/store/shiprocket/delivery-estimate/rate-limiter.js +92 -0
- package/.medusa/server/src/api/store/shiprocket/delivery-estimate/route.js +150 -0
- package/.medusa/server/src/providers/shiprocket/client/handle-error.js +54 -22
- package/.medusa/server/src/providers/shiprocket/client/index.js +200 -74
- package/.medusa/server/src/providers/shiprocket/client/methods/authenticate.js +15 -16
- package/.medusa/server/src/providers/shiprocket/service.js +75 -87
- package/README.md +51 -0
- package/package.json +6 -8
- package/.medusa/server/src/admin/vite-env.d.js +0 -1
- package/.medusa/server/src/admin/widgets/printables.js +0 -82
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const http_1 = require("@medusajs/framework/http");
|
|
4
|
+
exports.default = (0, http_1.defineMiddlewares)({
|
|
5
|
+
routes: [
|
|
6
|
+
{
|
|
7
|
+
// Make delivery estimate endpoint public (no API key required)
|
|
8
|
+
matcher: "/store/shiprocket/delivery-estimate",
|
|
9
|
+
middlewares: [],
|
|
10
|
+
// Disable authentication for this route
|
|
11
|
+
bodyParser: { sizeLimit: "1kb" },
|
|
12
|
+
},
|
|
13
|
+
],
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlkZGxld2FyZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXBpL21pZGRsZXdhcmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsbURBQTREO0FBRTVELGtCQUFlLElBQUEsd0JBQWlCLEVBQUM7SUFDN0IsTUFBTSxFQUFFO1FBQ0o7WUFDSSwrREFBK0Q7WUFDL0QsT0FBTyxFQUFFLHFDQUFxQztZQUM5QyxXQUFXLEVBQUUsRUFBRTtZQUNmLHdDQUF3QztZQUN4QyxVQUFVLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFO1NBQ25DO0tBQ0o7Q0FDSixDQUFDLENBQUEifQ==
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Simple in-memory cache with TTL for delivery estimates
|
|
4
|
+
* Cache key: `${pickup_pincode}-${delivery_pincode}-${weight}-${cod}`
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.deliveryEstimateCache = void 0;
|
|
8
|
+
exports.getCacheKey = getCacheKey;
|
|
9
|
+
class SimpleCache {
|
|
10
|
+
constructor(ttlMs = 10 * 60 * 1000, maxSize = 1000) {
|
|
11
|
+
this.cache = new Map();
|
|
12
|
+
// Default: 10 minutes TTL, max 1000 entries
|
|
13
|
+
this.ttlMs = ttlMs;
|
|
14
|
+
this.maxSize = maxSize;
|
|
15
|
+
}
|
|
16
|
+
get(key) {
|
|
17
|
+
const entry = this.cache.get(key);
|
|
18
|
+
if (!entry)
|
|
19
|
+
return null;
|
|
20
|
+
// Check if expired
|
|
21
|
+
if (Date.now() > entry.expiresAt) {
|
|
22
|
+
this.cache.delete(key);
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
return entry.data;
|
|
26
|
+
}
|
|
27
|
+
set(key, data) {
|
|
28
|
+
// Evict oldest entries if cache is full
|
|
29
|
+
if (this.cache.size >= this.maxSize) {
|
|
30
|
+
const oldestKey = this.cache.keys().next().value;
|
|
31
|
+
if (oldestKey)
|
|
32
|
+
this.cache.delete(oldestKey);
|
|
33
|
+
}
|
|
34
|
+
this.cache.set(key, {
|
|
35
|
+
data,
|
|
36
|
+
expiresAt: Date.now() + this.ttlMs,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
clear() {
|
|
40
|
+
this.cache.clear();
|
|
41
|
+
}
|
|
42
|
+
get size() {
|
|
43
|
+
return this.cache.size;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
// Singleton cache instance for delivery estimates (10 min TTL)
|
|
47
|
+
exports.deliveryEstimateCache = new SimpleCache(10 * 60 * 1000);
|
|
48
|
+
/**
|
|
49
|
+
* Generate cache key for delivery estimate
|
|
50
|
+
*/
|
|
51
|
+
function getCacheKey(pickupPincode, deliveryPincode, weight, cod) {
|
|
52
|
+
return `${pickupPincode}-${deliveryPincode}-${weight || 0.5}-${cod || 0}`;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL3NoaXByb2NrZXQvZGVsaXZlcnktZXN0aW1hdGUvY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRzs7O0FBMkRILGtDQU9DO0FBM0RELE1BQU0sV0FBVztJQUtiLFlBQVksUUFBZ0IsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLEVBQUUsVUFBa0IsSUFBSTtRQUoxRCxVQUFLLEdBQUcsSUFBSSxHQUFHLEVBQXlCLENBQUE7UUFLNUMsNENBQTRDO1FBQzVDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFBO1FBQ2xCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFBO0lBQzFCLENBQUM7SUFFRCxHQUFHLENBQUMsR0FBVztRQUNYLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ2pDLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxJQUFJLENBQUE7UUFFdkIsbUJBQW1CO1FBQ25CLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUN0QixPQUFPLElBQUksQ0FBQTtRQUNmLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUE7SUFDckIsQ0FBQztJQUVELEdBQUcsQ0FBQyxHQUFXLEVBQUUsSUFBTztRQUNwQix3Q0FBd0M7UUFDeEMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUE7WUFDaEQsSUFBSSxTQUFTO2dCQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBQy9DLENBQUM7UUFFRCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDaEIsSUFBSTtZQUNKLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUs7U0FDckMsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUVELEtBQUs7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQ3RCLENBQUM7SUFFRCxJQUFJLElBQUk7UUFDSixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFBO0lBQzFCLENBQUM7Q0FDSjtBQUVELCtEQUErRDtBQUNsRCxRQUFBLHFCQUFxQixHQUFHLElBQUksV0FBVyxDQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUE7QUFFekU7O0dBRUc7QUFDSCxTQUFnQixXQUFXLENBQ3ZCLGFBQXFCLEVBQ3JCLGVBQXVCLEVBQ3ZCLE1BQWUsRUFDZixHQUFZO0lBRVosT0FBTyxHQUFHLGFBQWEsSUFBSSxlQUFlLElBQUksTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUE7QUFDN0UsQ0FBQyJ9
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Simple in-memory rate limiter using sliding window
|
|
4
|
+
* Limits requests per IP address
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.rateLimiter = void 0;
|
|
8
|
+
exports.getClientIdentifier = getClientIdentifier;
|
|
9
|
+
class RateLimiter {
|
|
10
|
+
constructor(maxRequests = 30, windowMs = 60 * 1000) {
|
|
11
|
+
this.requests = new Map();
|
|
12
|
+
// Default: 30 requests per minute per IP
|
|
13
|
+
this.maxRequests = maxRequests;
|
|
14
|
+
this.windowMs = windowMs;
|
|
15
|
+
// Cleanup old entries every 5 minutes
|
|
16
|
+
setInterval(() => this.cleanup(), 5 * 60 * 1000);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Check if request should be allowed
|
|
20
|
+
* @returns true if allowed, false if rate limited
|
|
21
|
+
*/
|
|
22
|
+
isAllowed(identifier) {
|
|
23
|
+
const now = Date.now();
|
|
24
|
+
const entry = this.requests.get(identifier);
|
|
25
|
+
if (!entry) {
|
|
26
|
+
// First request from this identifier
|
|
27
|
+
this.requests.set(identifier, { count: 1, windowStart: now });
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
// Check if window has expired
|
|
31
|
+
if (now - entry.windowStart > this.windowMs) {
|
|
32
|
+
// Reset window
|
|
33
|
+
this.requests.set(identifier, { count: 1, windowStart: now });
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
// Window still active
|
|
37
|
+
if (entry.count >= this.maxRequests) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
// Increment count
|
|
41
|
+
entry.count++;
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Get remaining requests for an identifier
|
|
46
|
+
*/
|
|
47
|
+
getRemaining(identifier) {
|
|
48
|
+
const entry = this.requests.get(identifier);
|
|
49
|
+
if (!entry)
|
|
50
|
+
return this.maxRequests;
|
|
51
|
+
const now = Date.now();
|
|
52
|
+
if (now - entry.windowStart > this.windowMs) {
|
|
53
|
+
return this.maxRequests;
|
|
54
|
+
}
|
|
55
|
+
return Math.max(0, this.maxRequests - entry.count);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Get time until rate limit resets (in seconds)
|
|
59
|
+
*/
|
|
60
|
+
getResetTime(identifier) {
|
|
61
|
+
const entry = this.requests.get(identifier);
|
|
62
|
+
if (!entry)
|
|
63
|
+
return 0;
|
|
64
|
+
const now = Date.now();
|
|
65
|
+
const resetAt = entry.windowStart + this.windowMs;
|
|
66
|
+
return Math.max(0, Math.ceil((resetAt - now) / 1000));
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Clean up expired entries
|
|
70
|
+
*/
|
|
71
|
+
cleanup() {
|
|
72
|
+
const now = Date.now();
|
|
73
|
+
for (const [key, entry] of this.requests.entries()) {
|
|
74
|
+
if (now - entry.windowStart > this.windowMs) {
|
|
75
|
+
this.requests.delete(key);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Singleton rate limiter: 30 requests per minute
|
|
81
|
+
exports.rateLimiter = new RateLimiter(30, 60 * 1000);
|
|
82
|
+
/**
|
|
83
|
+
* Get client identifier from request (IP address)
|
|
84
|
+
*/
|
|
85
|
+
function getClientIdentifier(req) {
|
|
86
|
+
return (req.headers["x-forwarded-for"]?.split(",")[0]?.trim() ||
|
|
87
|
+
req.headers["x-real-ip"] ||
|
|
88
|
+
req.socket?.remoteAddress ||
|
|
89
|
+
req.ip ||
|
|
90
|
+
"unknown");
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF0ZS1saW1pdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwaS9zdG9yZS9zaGlwcm9ja2V0L2RlbGl2ZXJ5LWVzdGltYXRlL3JhdGUtbGltaXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOzs7QUFrR0gsa0RBUUM7QUFuR0QsTUFBTSxXQUFXO0lBS2IsWUFBWSxjQUFzQixFQUFFLEVBQUUsV0FBbUIsRUFBRSxHQUFHLElBQUk7UUFKMUQsYUFBUSxHQUFHLElBQUksR0FBRyxFQUEwQixDQUFBO1FBS2hELHlDQUF5QztRQUN6QyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQTtRQUM5QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUV4QixzQ0FBc0M7UUFDdEMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxDQUFBO0lBQ3BELENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTLENBQUMsVUFBa0I7UUFDeEIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFBO1FBQ3RCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1FBRTNDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNULHFDQUFxQztZQUNyQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFBO1lBQzdELE9BQU8sSUFBSSxDQUFBO1FBQ2YsQ0FBQztRQUVELDhCQUE4QjtRQUM5QixJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUMx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
|
|
@@ -0,0 +1,150 @@
|
|
|
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.AUTHENTICATE = void 0;
|
|
7
|
+
exports.GET = GET;
|
|
8
|
+
const client_1 = __importDefault(require("../../../../providers/shiprocket/client"));
|
|
9
|
+
const cache_1 = require("./cache");
|
|
10
|
+
const rate_limiter_1 = require("./rate-limiter");
|
|
11
|
+
// Make this route public (no publishable API key required)
|
|
12
|
+
exports.AUTHENTICATE = false;
|
|
13
|
+
// Cache for pickup location pincode (long TTL - 1 hour)
|
|
14
|
+
let cachedPickupPincode = null;
|
|
15
|
+
/**
|
|
16
|
+
* GET /store/shiprocket/delivery-estimate
|
|
17
|
+
*
|
|
18
|
+
* Check delivery serviceability and get estimated delivery dates for a pincode.
|
|
19
|
+
*
|
|
20
|
+
* Features:
|
|
21
|
+
* - Rate limited: 30 requests per minute per IP
|
|
22
|
+
* - Cached: Results cached for 10 minutes
|
|
23
|
+
* - Auto-fetches pickup pincode from Shiprocket using SHIPROCKET_PICKUP_LOCATION
|
|
24
|
+
*
|
|
25
|
+
* Query parameters:
|
|
26
|
+
* - delivery_pincode: The delivery destination pincode (required)
|
|
27
|
+
* - pickup_pincode: The pickup location pincode (optional, auto-fetched from SHIPROCKET_PICKUP_LOCATION)
|
|
28
|
+
* - weight: Package weight in kg (optional, defaults to 0.5)
|
|
29
|
+
* - cod: Cash on delivery flag, 0 or 1 (optional, defaults to 0)
|
|
30
|
+
*
|
|
31
|
+
* Returns:
|
|
32
|
+
* - serviceable: boolean indicating if delivery is possible
|
|
33
|
+
* - fastest_delivery: the fastest courier option with estimated date
|
|
34
|
+
* - all_options: all available courier options sorted by delivery time
|
|
35
|
+
*/
|
|
36
|
+
async function GET(req, res) {
|
|
37
|
+
// Rate limiting check
|
|
38
|
+
const clientId = (0, rate_limiter_1.getClientIdentifier)(req);
|
|
39
|
+
if (!rate_limiter_1.rateLimiter.isAllowed(clientId)) {
|
|
40
|
+
const resetTime = rate_limiter_1.rateLimiter.getResetTime(clientId);
|
|
41
|
+
res.setHeader("X-RateLimit-Limit", "30");
|
|
42
|
+
res.setHeader("X-RateLimit-Remaining", "0");
|
|
43
|
+
res.setHeader("X-RateLimit-Reset", resetTime.toString());
|
|
44
|
+
res.setHeader("Retry-After", resetTime.toString());
|
|
45
|
+
return res.status(429).json({
|
|
46
|
+
error: "Too many requests",
|
|
47
|
+
message: `Rate limit exceeded. Try again in ${resetTime} seconds.`,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
// Set rate limit headers
|
|
51
|
+
res.setHeader("X-RateLimit-Limit", "30");
|
|
52
|
+
res.setHeader("X-RateLimit-Remaining", rate_limiter_1.rateLimiter.getRemaining(clientId).toString());
|
|
53
|
+
const { pickup_pincode, delivery_pincode, weight, cod } = req.query;
|
|
54
|
+
// Get credentials from environment
|
|
55
|
+
const email = process.env.SHIPROCKET_EMAIL;
|
|
56
|
+
const password = process.env.SHIPROCKET_PASSWORD;
|
|
57
|
+
const pickupLocation = process.env.SHIPROCKET_PICKUP_LOCATION;
|
|
58
|
+
// Validate credentials are configured
|
|
59
|
+
if (!email || !password) {
|
|
60
|
+
return res.status(500).json({
|
|
61
|
+
error: "Configuration error",
|
|
62
|
+
message: "Shiprocket credentials not configured. Set SHIPROCKET_EMAIL and SHIPROCKET_PASSWORD environment variables.",
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
// Validate delivery pincode is provided
|
|
66
|
+
if (!delivery_pincode) {
|
|
67
|
+
return res.status(400).json({
|
|
68
|
+
error: "Missing delivery_pincode",
|
|
69
|
+
message: "'delivery_pincode' query parameter is required",
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
// Validate delivery pincode format (Indian pincodes are 6 digits)
|
|
73
|
+
const pincodeRegex = /^\d{6}$/;
|
|
74
|
+
if (!pincodeRegex.test(delivery_pincode)) {
|
|
75
|
+
return res.status(400).json({
|
|
76
|
+
error: "Invalid delivery_pincode",
|
|
77
|
+
message: "Delivery pincode must be a 6-digit number",
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
let client = null;
|
|
81
|
+
try {
|
|
82
|
+
// Create client instance
|
|
83
|
+
client = new client_1.default({ email, password });
|
|
84
|
+
// Determine pickup pincode
|
|
85
|
+
let pickupPincode = pickup_pincode;
|
|
86
|
+
if (!pickupPincode) {
|
|
87
|
+
// Check if we have a cached pickup pincode
|
|
88
|
+
if (cachedPickupPincode && Date.now() < cachedPickupPincode.expiresAt) {
|
|
89
|
+
pickupPincode = cachedPickupPincode.value;
|
|
90
|
+
}
|
|
91
|
+
else if (pickupLocation) {
|
|
92
|
+
// Fetch from Shiprocket using the location name
|
|
93
|
+
const fetchedPincode = await client.getPickupPincode(pickupLocation);
|
|
94
|
+
if (fetchedPincode) {
|
|
95
|
+
pickupPincode = fetchedPincode;
|
|
96
|
+
// Cache for 1 hour
|
|
97
|
+
cachedPickupPincode = {
|
|
98
|
+
value: fetchedPincode,
|
|
99
|
+
expiresAt: Date.now() + 60 * 60 * 1000,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (!pickupPincode) {
|
|
105
|
+
return res.status(400).json({
|
|
106
|
+
error: "Missing pickup pincode",
|
|
107
|
+
message: "Either provide 'pickup_pincode' query parameter or set SHIPROCKET_PICKUP_LOCATION environment variable to auto-fetch the pincode",
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
// Validate pickup pincode format
|
|
111
|
+
if (!pincodeRegex.test(pickupPincode)) {
|
|
112
|
+
return res.status(400).json({
|
|
113
|
+
error: "Invalid pickup_pincode",
|
|
114
|
+
message: "Pickup pincode must be a 6-digit number",
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
// Check cache for delivery estimate
|
|
118
|
+
const cacheKey = (0, cache_1.getCacheKey)(pickupPincode, delivery_pincode, weight ? parseFloat(weight) : undefined, cod ? parseInt(cod) : undefined);
|
|
119
|
+
const cachedResult = cache_1.deliveryEstimateCache.get(cacheKey);
|
|
120
|
+
if (cachedResult) {
|
|
121
|
+
res.setHeader("X-Cache", "HIT");
|
|
122
|
+
return res.json(cachedResult);
|
|
123
|
+
}
|
|
124
|
+
res.setHeader("X-Cache", "MISS");
|
|
125
|
+
// Get delivery estimate
|
|
126
|
+
const estimate = await client.getDeliveryEstimate({
|
|
127
|
+
pickup_postcode: pickupPincode,
|
|
128
|
+
delivery_postcode: delivery_pincode,
|
|
129
|
+
weight: weight ? parseFloat(weight) : undefined,
|
|
130
|
+
cod: cod ? parseInt(cod) : undefined,
|
|
131
|
+
});
|
|
132
|
+
// Cache the result
|
|
133
|
+
cache_1.deliveryEstimateCache.set(cacheKey, estimate);
|
|
134
|
+
return res.json(estimate);
|
|
135
|
+
}
|
|
136
|
+
catch (error) {
|
|
137
|
+
console.error("Delivery estimate error:", error);
|
|
138
|
+
return res.status(500).json({
|
|
139
|
+
error: "Failed to get delivery estimate",
|
|
140
|
+
message: error.message || "An unexpected error occurred",
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
finally {
|
|
144
|
+
// Dispose client after use
|
|
145
|
+
if (client) {
|
|
146
|
+
client.dispose();
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBpL3N0b3JlL3NoaXByb2NrZXQvZGVsaXZlcnktZXN0aW1hdGUvcm91dGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBZ0NBLGtCQTJJQztBQTFLRCxxRkFBc0U7QUFDdEUsbUNBQTREO0FBQzVELGlEQUFpRTtBQUVqRSwyREFBMkQ7QUFDOUMsUUFBQSxZQUFZLEdBQUcsS0FBSyxDQUFBO0FBRWpDLHdEQUF3RDtBQUN4RCxJQUFJLG1CQUFtQixHQUFnRCxJQUFJLENBQUE7QUFFM0U7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0ksS0FBSyxVQUFVLEdBQUcsQ0FDckIsR0FBa0IsRUFDbEIsR0FBbUI7SUFFbkIsc0JBQXNCO0lBQ3RCLE1BQU0sUUFBUSxHQUFHLElBQUEsa0NBQW1CLEVBQUMsR0FBRyxDQUFDLENBQUE7SUFDekMsSUFBSSxDQUFDLDBCQUFXLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDbkMsTUFBTSxTQUFTLEdBQUcsMEJBQVcsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDcEQsR0FBRyxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsQ0FBQTtRQUN4QyxHQUFHLENBQUMsU0FBUyxDQUFDLHVCQUF1QixFQUFFLEdBQUcsQ0FBQyxDQUFBO1FBQzNDLEdBQUcsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLEVBQUUsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUE7UUFDeEQsR0FBRyxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUE7UUFDbEQsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUN4QixLQUFLLEVBQUUsbUJBQW1CO1lBQzFCLE9BQU8sRUFBRSxxQ0FB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
|
|
@@ -1,27 +1,59 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.handleError =
|
|
3
|
+
exports.handleError = handleError;
|
|
4
4
|
const utils_1 = require("@medusajs/utils");
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
5
|
+
/**
|
|
6
|
+
* Handles Shiprocket API errors and converts them to MedusaError with appropriate types
|
|
7
|
+
* @param error - The Axios error from the API call
|
|
8
|
+
* @param context - Optional context about the operation for better error messages
|
|
9
|
+
*/
|
|
10
|
+
function handleError(error, context) {
|
|
11
|
+
const axiosError = error;
|
|
12
|
+
const statusCode = axiosError?.response?.status || 0;
|
|
13
|
+
const responseData = axiosError?.response?.data;
|
|
14
|
+
// Extract error message from Shiprocket response
|
|
15
|
+
let message = responseData?.message || axiosError?.message || "Unknown Shiprocket error";
|
|
16
|
+
// Add context to message if available
|
|
17
|
+
const contextStr = context?.operation
|
|
18
|
+
? `[${context.operation}]`
|
|
19
|
+
: "";
|
|
20
|
+
// Handle validation errors (field-level errors from Shiprocket)
|
|
21
|
+
if (responseData?.errors && typeof responseData.errors === "object") {
|
|
22
|
+
const validationErrors = Object.entries(responseData.errors)
|
|
23
|
+
.map(([field, msgs]) => {
|
|
24
|
+
const msgStr = Array.isArray(msgs) ? msgs.join(", ") : String(msgs);
|
|
25
|
+
return `${field}: ${msgStr}`;
|
|
26
|
+
})
|
|
17
27
|
.join("; ");
|
|
18
|
-
|
|
28
|
+
message = `Validation failed: ${validationErrors}`;
|
|
19
29
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
:
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
|
|
30
|
+
// Map HTTP status codes to appropriate MedusaError types
|
|
31
|
+
switch (statusCode) {
|
|
32
|
+
case 401:
|
|
33
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNAUTHORIZED, `${contextStr} Shiprocket authentication failed. Please verify your API credentials.`);
|
|
34
|
+
case 404:
|
|
35
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_FOUND, `${contextStr} ${message}`);
|
|
36
|
+
case 429:
|
|
37
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, `${contextStr} Shiprocket rate limit exceeded. Please retry after a few seconds.`);
|
|
38
|
+
case 400:
|
|
39
|
+
case 422:
|
|
40
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `${contextStr} ${message}`);
|
|
41
|
+
case 405:
|
|
42
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `${contextStr} Invalid API method. This may indicate a plugin bug.`);
|
|
43
|
+
case 500:
|
|
44
|
+
case 502:
|
|
45
|
+
case 503:
|
|
46
|
+
case 504:
|
|
47
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `${contextStr} Shiprocket server error (${statusCode}). Please try again later.`);
|
|
48
|
+
default:
|
|
49
|
+
// Network errors or unknown status codes
|
|
50
|
+
if (axiosError?.code === "ECONNABORTED") {
|
|
51
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `${contextStr} Shiprocket request timed out. Please try again.`);
|
|
52
|
+
}
|
|
53
|
+
if (axiosError?.code === "ENOTFOUND" || axiosError?.code === "ECONNREFUSED") {
|
|
54
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `${contextStr} Unable to connect to Shiprocket. Please check your network connection.`);
|
|
55
|
+
}
|
|
56
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.UNEXPECTED_STATE, `${contextStr} ${message}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlLWVycm9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3Byb3ZpZGVycy9zaGlwcm9ja2V0L2NsaWVudC9oYW5kbGUtZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUEwQkEsa0NBdUZDO0FBakhELDJDQUE2QztBQXFCN0M7Ozs7R0FJRztBQUNILFNBQWdCLFdBQVcsQ0FBQyxLQUFjLEVBQUUsT0FBc0I7SUFDOUQsTUFBTSxVQUFVLEdBQUcsS0FBb0MsQ0FBQTtJQUN2RCxNQUFNLFVBQVUsR0FBRyxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUE7SUFDcEQsTUFBTSxZQUFZLEdBQUcsVUFBVSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUE7SUFFL0MsaURBQWlEO0lBQ2pELElBQUksT0FBTyxHQUFHLFlBQVksRUFBRSxPQUFPLElBQUksVUFBVSxFQUFFLE9BQU8sSUFBSSwwQkFBMEIsQ0FBQTtJQUV4RixzQ0FBc0M7SUFDdEMsTUFBTSxVQUFVLEdBQUcsT0FBTyxFQUFFLFNBQVM7UUFDakMsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLFNBQVMsR0FBRztRQUMxQixDQUFDLENBQUMsRUFBRSxDQUFBO0lBRVIsZ0VBQWdFO0lBQ2hFLElBQUksWUFBWSxFQUFFLE1BQU0sSUFBSSxPQUFPLFlBQVksQ0FBQyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDbEUsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7YUFDdkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtZQUNuQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDbkUsT0FBTyxHQUFHLEtBQUssS0FBSyxNQUFNLEVBQUUsQ0FBQTtRQUNoQyxDQUFDLENBQUM7YUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDZixPQUFPLEdBQUcsc0JBQXNCLGdCQUFnQixFQUFFLENBQUE7SUFDdEQsQ0FBQztJQUVELHlEQUF5RDtJQUN6RCxRQUFRLFVBQVUsRUFBRSxDQUFDO1FBQ2pCLEtBQUssR0FBRztZQUNKLE1BQU0sSUFBSSxtQkFBVyxDQUNqQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLEdBQUcsVUFBVSx3RUFBd0UsQ0FDeEYsQ0FBQTtRQUVMLEtBQUssR0FBRztZQUNKLE1BQU0sSUFBSSxtQkFBVyxDQUNqQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQzNCLEdBQUcsVUFBVSxJQUFJLE9BQU8sRUFBRSxDQUM3QixDQUFBO1FBRUwsS0FBSyxHQUFHO1lBQ0osTUFBTSxJQUFJLG1CQUFXLENBQ2pCLG1CQUFXLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFDN0IsR0FBRyxVQUFVLG9FQUFvRSxDQUNwRixDQUFBO1FBRUwsS0FBSyxHQUFHLENBQUM7UUFDVCxLQUFLLEdBQUc7WUFDSixNQUFNLElBQUksbUJBQVcsQ0FDakIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5QixHQUFHLFVBQVUsSUFBSSxPQUFPLEVBQUUsQ0FDN0IsQ0FBQTtRQUVMLEtBQUssR0FBRztZQUNKLE1BQU0sSUFBSSxtQkFBVyxDQUNqQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQzlCLEdBQUcsVUFBVSxzREFBc0QsQ0FDdEUsQ0FBQTtRQUVMLEtBQUssR0FBRyxDQUFDO1FBQ1QsS0FBSyxHQUFHLENBQUM7UUFDVCxLQUFLLEdBQUcsQ0FBQztRQUNULEtBQUssR0FBRztZQUNKLE1BQU0sSUFBSSxtQkFBVyxDQUNqQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFDbEMsR0FBRyxVQUFVLDZCQUE2QixVQUFVLDRCQUE0QixDQUNuRixDQUFBO1FBRUw7WUFDSSx5Q0FBeUM7WUFDekMsSUFBSSxVQUFVLEVBQUUsSUFBSSxLQUFLLGNBQWMsRUFBRSxDQUFDO2dCQUN0QyxNQUFNLElBQUksbUJBQVcsQ0FDakIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQ2xDLEdBQUcsVUFBVSxrREFBa0QsQ0FDbEUsQ0FBQTtZQUNMLENBQUM7WUFFRCxJQUFJLFVBQVUsRUFBRSxJQUFJLEtBQUssV0FBVyxJQUFJLFVBQVUsRUFBRSxJQUFJLEtBQUssY0FBYyxFQUFFLENBQUM7Z0JBQzFFLE1BQU0sSUFBSSxtQkFBVyxDQUNqQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFDbEMsR0FBRyxVQUFVLHlFQUF5RSxDQUN6RixDQUFBO1lBQ0wsQ0FBQztZQUVELE1BQU0sSUFBSSxtQkFBVyxDQUNqQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFDbEMsR0FBRyxVQUFVLElBQUksT0FBTyxFQUFFLENBQzdCLENBQUE7SUFDVCxDQUFDO0FBQ0wsQ0FBQyJ9
|