pathao-merchant-sdk 1.0.0 → 1.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/README.md +54 -8
- package/dist/index.d.mts +84 -86
- package/dist/index.d.ts +84 -86
- package/dist/index.js +159 -87
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +160 -87
- package/dist/index.mjs.map +1 -1
- package/package.json +10 -2
package/dist/index.js
CHANGED
|
@@ -12,44 +12,120 @@ var PathaoApiService = class {
|
|
|
12
12
|
this.accessToken = null;
|
|
13
13
|
this.refreshToken = null;
|
|
14
14
|
this.tokenExpiry = null;
|
|
15
|
+
this.isAuthenticating = false;
|
|
16
|
+
this.authPromise = null;
|
|
17
|
+
this.requestQueue = [];
|
|
18
|
+
this.circuitBreaker = {
|
|
19
|
+
failures: 0,
|
|
20
|
+
lastFailureTime: 0,
|
|
21
|
+
threshold: 5,
|
|
22
|
+
timeout: 6e4,
|
|
23
|
+
// 1 minute
|
|
24
|
+
isOpen: false
|
|
25
|
+
};
|
|
15
26
|
this.config = {
|
|
16
|
-
baseURL:
|
|
17
|
-
timeout:
|
|
18
|
-
|
|
27
|
+
baseURL: config.baseURL || process.env.PATHAO_BASE_URL || "",
|
|
28
|
+
timeout: config.timeout || parseInt(process.env.PATHAO_TIMEOUT || "30000", 10),
|
|
29
|
+
clientId: config.clientId || process.env.PATHAO_CLIENT_ID || "",
|
|
30
|
+
clientSecret: config.clientSecret || process.env.PATHAO_CLIENT_SECRET || "",
|
|
31
|
+
username: config.username || process.env.PATHAO_USERNAME || "",
|
|
32
|
+
password: config.password || process.env.PATHAO_PASSWORD || ""
|
|
19
33
|
};
|
|
20
34
|
this.pathaoClient = axios__default.default.create({
|
|
21
|
-
baseURL: this.config.baseURL ||
|
|
22
|
-
timeout: this.config.timeout ||
|
|
35
|
+
baseURL: this.config.baseURL || process.env.PATHAO_BASE_URL || "",
|
|
36
|
+
timeout: this.config.timeout || parseInt(process.env.PATHAO_TIMEOUT || "30000", 10),
|
|
23
37
|
headers: {
|
|
24
38
|
"Content-Type": "application/json",
|
|
25
39
|
"Accept": "application/json"
|
|
26
40
|
}
|
|
27
41
|
});
|
|
42
|
+
if (!this.config.baseURL) {
|
|
43
|
+
throw new Error("Pathao API baseURL is required. You can provide it via constructor config or PATHAO_BASE_URL environment variable");
|
|
44
|
+
}
|
|
28
45
|
if (!this.config.clientId || !this.config.clientSecret || !this.config.username || !this.config.password) {
|
|
29
|
-
throw new Error("Pathao API credentials are required: clientId, clientSecret, username, password");
|
|
46
|
+
throw new Error("Pathao API credentials are required: clientId, clientSecret, username, password. You can provide them via constructor config or environment variables (PATHAO_CLIENT_ID, PATHAO_CLIENT_SECRET, PATHAO_USERNAME, PATHAO_PASSWORD)");
|
|
30
47
|
}
|
|
31
48
|
this.pathaoClient.interceptors.request.use(async (config2) => {
|
|
49
|
+
if (config2.url?.includes("/issue-token")) {
|
|
50
|
+
return config2;
|
|
51
|
+
}
|
|
32
52
|
await this.ensureAuthenticated();
|
|
33
53
|
if (this.accessToken) {
|
|
34
54
|
config2.headers.Authorization = `Bearer ${this.accessToken}`;
|
|
35
55
|
}
|
|
36
56
|
return config2;
|
|
37
57
|
});
|
|
58
|
+
this.pathaoClient.interceptors.response.use(
|
|
59
|
+
(response) => {
|
|
60
|
+
this.circuitBreaker.failures = 0;
|
|
61
|
+
this.circuitBreaker.isOpen = false;
|
|
62
|
+
return response;
|
|
63
|
+
},
|
|
64
|
+
async (error) => {
|
|
65
|
+
if (error.response?.status === 401) {
|
|
66
|
+
this.accessToken = null;
|
|
67
|
+
this.refreshToken = null;
|
|
68
|
+
this.tokenExpiry = null;
|
|
69
|
+
if (error.config && !error.config._retry) {
|
|
70
|
+
error.config._retry = true;
|
|
71
|
+
await this.ensureAuthenticated();
|
|
72
|
+
if (this.accessToken) {
|
|
73
|
+
error.config.headers.Authorization = `Bearer ${this.accessToken}`;
|
|
74
|
+
}
|
|
75
|
+
return this.pathaoClient.request(error.config);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
this.handleCircuitBreaker(error);
|
|
79
|
+
return Promise.reject(error);
|
|
80
|
+
}
|
|
81
|
+
);
|
|
38
82
|
}
|
|
39
83
|
async ensureAuthenticated() {
|
|
84
|
+
if (this.circuitBreaker.isOpen) {
|
|
85
|
+
if (Date.now() - this.circuitBreaker.lastFailureTime > this.circuitBreaker.timeout) {
|
|
86
|
+
this.circuitBreaker.isOpen = false;
|
|
87
|
+
this.circuitBreaker.failures = 0;
|
|
88
|
+
} else {
|
|
89
|
+
throw new Error("Circuit breaker is open. Too many authentication failures.");
|
|
90
|
+
}
|
|
91
|
+
}
|
|
40
92
|
if (this.accessToken && this.tokenExpiry && Date.now() < this.tokenExpiry) {
|
|
41
93
|
return;
|
|
42
94
|
}
|
|
95
|
+
if (this.isAuthenticating && this.authPromise) {
|
|
96
|
+
return this.authPromise;
|
|
97
|
+
}
|
|
98
|
+
this.isAuthenticating = true;
|
|
99
|
+
this.authPromise = this.performAuthentication();
|
|
100
|
+
try {
|
|
101
|
+
await this.authPromise;
|
|
102
|
+
} finally {
|
|
103
|
+
this.isAuthenticating = false;
|
|
104
|
+
this.authPromise = null;
|
|
105
|
+
this.processRequestQueue();
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
async performAuthentication() {
|
|
43
109
|
if (this.refreshToken) {
|
|
44
110
|
try {
|
|
45
111
|
await this.refreshAccessToken();
|
|
46
112
|
return;
|
|
47
113
|
} catch (error) {
|
|
48
|
-
|
|
114
|
+
this.refreshToken = null;
|
|
49
115
|
}
|
|
50
116
|
}
|
|
51
117
|
await this.authenticate();
|
|
52
118
|
}
|
|
119
|
+
processRequestQueue() {
|
|
120
|
+
const queue = [...this.requestQueue];
|
|
121
|
+
this.requestQueue = [];
|
|
122
|
+
queue.forEach(({ resolve }) => {
|
|
123
|
+
try {
|
|
124
|
+
resolve();
|
|
125
|
+
} catch (error) {
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}
|
|
53
129
|
async authenticate() {
|
|
54
130
|
try {
|
|
55
131
|
const response = await this.pathaoClient.post("/aladdin/api/v1/issue-token", {
|
|
@@ -62,9 +138,10 @@ var PathaoApiService = class {
|
|
|
62
138
|
this.accessToken = response.data.access_token;
|
|
63
139
|
this.refreshToken = response.data.refresh_token;
|
|
64
140
|
this.tokenExpiry = Date.now() + response.data.expires_in * 1e3 - 6e4;
|
|
65
|
-
|
|
141
|
+
this.circuitBreaker.failures = 0;
|
|
142
|
+
this.circuitBreaker.isOpen = false;
|
|
66
143
|
} catch (error) {
|
|
67
|
-
|
|
144
|
+
this.handleCircuitBreaker(error);
|
|
68
145
|
throw new Error(`Authentication failed: ${this.getErrorMessage(error)}`);
|
|
69
146
|
}
|
|
70
147
|
}
|
|
@@ -82,9 +159,10 @@ var PathaoApiService = class {
|
|
|
82
159
|
this.accessToken = response.data.access_token;
|
|
83
160
|
this.refreshToken = response.data.refresh_token;
|
|
84
161
|
this.tokenExpiry = Date.now() + response.data.expires_in * 1e3 - 6e4;
|
|
85
|
-
|
|
162
|
+
this.circuitBreaker.failures = 0;
|
|
163
|
+
this.circuitBreaker.isOpen = false;
|
|
86
164
|
} catch (error) {
|
|
87
|
-
|
|
165
|
+
this.handleCircuitBreaker(error);
|
|
88
166
|
throw new Error(`Token refresh failed: ${this.getErrorMessage(error)}`);
|
|
89
167
|
}
|
|
90
168
|
}
|
|
@@ -98,33 +176,19 @@ var PathaoApiService = class {
|
|
|
98
176
|
}
|
|
99
177
|
return error.message || "Unknown error";
|
|
100
178
|
}
|
|
179
|
+
handleCircuitBreaker(_error) {
|
|
180
|
+
this.circuitBreaker.failures++;
|
|
181
|
+
this.circuitBreaker.lastFailureTime = Date.now();
|
|
182
|
+
if (this.circuitBreaker.failures >= this.circuitBreaker.threshold) {
|
|
183
|
+
this.circuitBreaker.isOpen = true;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
101
186
|
// Official Pathao API: Create Order
|
|
102
187
|
async createOrder(orderData) {
|
|
103
188
|
try {
|
|
104
|
-
console.log("Creating Pathao order:", {
|
|
105
|
-
store_id: orderData.store_id,
|
|
106
|
-
merchant_order_id: orderData.merchant_order_id,
|
|
107
|
-
recipient_name: orderData.recipient_name,
|
|
108
|
-
recipient_phone: orderData.recipient_phone,
|
|
109
|
-
delivery_type: orderData.delivery_type,
|
|
110
|
-
item_type: orderData.item_type,
|
|
111
|
-
item_weight: orderData.item_weight,
|
|
112
|
-
amount_to_collect: orderData.amount_to_collect
|
|
113
|
-
});
|
|
114
189
|
const response = await this.pathaoClient.post("/aladdin/api/v1/orders", orderData);
|
|
115
|
-
console.log("Pathao order created successfully:", {
|
|
116
|
-
consignment_id: response.data.data?.consignment_id,
|
|
117
|
-
invoice_id: response.data.data?.invoice_id,
|
|
118
|
-
status: response.data.data?.status
|
|
119
|
-
});
|
|
120
190
|
return response.data;
|
|
121
191
|
} catch (error) {
|
|
122
|
-
console.error("Pathao order creation failed:", {
|
|
123
|
-
error: error.message,
|
|
124
|
-
response: error.response?.data,
|
|
125
|
-
status: error.response?.status,
|
|
126
|
-
orderData
|
|
127
|
-
});
|
|
128
192
|
const errorMessage = this.getErrorMessage(error);
|
|
129
193
|
throw new Error(`Failed to create Pathao order: ${errorMessage}`);
|
|
130
194
|
}
|
|
@@ -132,27 +196,9 @@ var PathaoApiService = class {
|
|
|
132
196
|
// Official Pathao API: Create Store
|
|
133
197
|
async createStore(storeData) {
|
|
134
198
|
try {
|
|
135
|
-
console.log("Creating Pathao store:", {
|
|
136
|
-
name: storeData.name,
|
|
137
|
-
contact_name: storeData.contact_name,
|
|
138
|
-
city_id: storeData.city_id,
|
|
139
|
-
zone_id: storeData.zone_id,
|
|
140
|
-
area_id: storeData.area_id
|
|
141
|
-
});
|
|
142
199
|
const response = await this.pathaoClient.post("/aladdin/api/v1/stores", storeData);
|
|
143
|
-
console.log("Pathao store created successfully:", {
|
|
144
|
-
store_id: response.data.data?.store_id,
|
|
145
|
-
name: response.data.data?.name,
|
|
146
|
-
status: response.data.data?.status
|
|
147
|
-
});
|
|
148
200
|
return response.data;
|
|
149
201
|
} catch (error) {
|
|
150
|
-
console.error("Pathao store creation failed:", {
|
|
151
|
-
error: error.message,
|
|
152
|
-
response: error.response?.data,
|
|
153
|
-
status: error.response?.status,
|
|
154
|
-
storeData
|
|
155
|
-
});
|
|
156
202
|
const errorMessage = this.getErrorMessage(error);
|
|
157
203
|
throw new Error(`Failed to create Pathao store: ${errorMessage}`);
|
|
158
204
|
}
|
|
@@ -161,9 +207,8 @@ var PathaoApiService = class {
|
|
|
161
207
|
async getStores() {
|
|
162
208
|
try {
|
|
163
209
|
const response = await this.pathaoClient.get("/aladdin/api/v1/stores");
|
|
164
|
-
return response.data
|
|
210
|
+
return response.data;
|
|
165
211
|
} catch (error) {
|
|
166
|
-
console.error("Failed to fetch Pathao stores:", error);
|
|
167
212
|
const errorMessage = this.getErrorMessage(error);
|
|
168
213
|
throw new Error(`Failed to fetch Pathao stores: ${errorMessage}`);
|
|
169
214
|
}
|
|
@@ -171,29 +216,9 @@ var PathaoApiService = class {
|
|
|
171
216
|
// Official Pathao API: Calculate Price
|
|
172
217
|
async calculatePrice(priceData) {
|
|
173
218
|
try {
|
|
174
|
-
|
|
175
|
-
store_id: priceData.store_id,
|
|
176
|
-
item_type: priceData.item_type,
|
|
177
|
-
item_weight: priceData.item_weight,
|
|
178
|
-
delivery_type: priceData.delivery_type,
|
|
179
|
-
recipient_city: priceData.recipient_city,
|
|
180
|
-
recipient_zone: priceData.recipient_zone,
|
|
181
|
-
recipient_area: priceData.recipient_area
|
|
182
|
-
});
|
|
183
|
-
const response = await this.pathaoClient.post("/aladdin/api/v1/merchant/price-check", priceData);
|
|
184
|
-
console.log("Pathao price calculated:", {
|
|
185
|
-
delivery_charge: response.data.data?.delivery_charge,
|
|
186
|
-
cod_charge: response.data.data?.cod_charge,
|
|
187
|
-
total_charge: response.data.data?.total_charge
|
|
188
|
-
});
|
|
219
|
+
const response = await this.pathaoClient.post("/aladdin/api/v1/merchant/price-plan", priceData);
|
|
189
220
|
return response.data;
|
|
190
221
|
} catch (error) {
|
|
191
|
-
console.error("Pathao price calculation failed:", {
|
|
192
|
-
error: error.message,
|
|
193
|
-
response: error.response?.data,
|
|
194
|
-
status: error.response?.status,
|
|
195
|
-
priceData
|
|
196
|
-
});
|
|
197
222
|
const errorMessage = this.getErrorMessage(error);
|
|
198
223
|
throw new Error(`Failed to calculate Pathao price: ${errorMessage}`);
|
|
199
224
|
}
|
|
@@ -201,21 +226,29 @@ var PathaoApiService = class {
|
|
|
201
226
|
// Official Pathao API: Get Cities
|
|
202
227
|
async getCities() {
|
|
203
228
|
try {
|
|
204
|
-
const response = await this.pathaoClient.get("/aladdin/api/v1/
|
|
229
|
+
const response = await this.pathaoClient.get("/aladdin/api/v1/city-list");
|
|
205
230
|
return response.data;
|
|
206
231
|
} catch (error) {
|
|
207
|
-
console.error("Failed to fetch Pathao cities:", error);
|
|
208
232
|
const errorMessage = this.getErrorMessage(error);
|
|
209
233
|
throw new Error(`Failed to fetch Pathao cities: ${errorMessage}`);
|
|
210
234
|
}
|
|
211
235
|
}
|
|
212
|
-
// Official Pathao API: Get
|
|
213
|
-
async
|
|
236
|
+
// Official Pathao API: Get Zones for a City
|
|
237
|
+
async getZones(cityId) {
|
|
238
|
+
try {
|
|
239
|
+
const response = await this.pathaoClient.get(`/aladdin/api/v1/cities/${cityId}/zone-list`);
|
|
240
|
+
return response.data;
|
|
241
|
+
} catch (error) {
|
|
242
|
+
const errorMessage = this.getErrorMessage(error);
|
|
243
|
+
throw new Error(`Failed to fetch Pathao zones: ${errorMessage}`);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
// Official Pathao API: Get Areas for a Zone
|
|
247
|
+
async getAreas(zoneId) {
|
|
214
248
|
try {
|
|
215
|
-
const response = await this.pathaoClient.get(
|
|
249
|
+
const response = await this.pathaoClient.get(`/aladdin/api/v1/zones/${zoneId}/area-list`);
|
|
216
250
|
return response.data;
|
|
217
251
|
} catch (error) {
|
|
218
|
-
console.error("Failed to fetch Pathao areas:", error);
|
|
219
252
|
const errorMessage = this.getErrorMessage(error);
|
|
220
253
|
throw new Error(`Failed to fetch Pathao areas: ${errorMessage}`);
|
|
221
254
|
}
|
|
@@ -223,14 +256,23 @@ var PathaoApiService = class {
|
|
|
223
256
|
// Official Pathao API: Get Order Status
|
|
224
257
|
async getOrderStatus(consignmentId) {
|
|
225
258
|
try {
|
|
226
|
-
const response = await this.pathaoClient.get(`/aladdin/api/v1/orders/${consignmentId}`);
|
|
259
|
+
const response = await this.pathaoClient.get(`/aladdin/api/v1/orders/${consignmentId}/info`);
|
|
227
260
|
return response.data;
|
|
228
261
|
} catch (error) {
|
|
229
|
-
console.error("Failed to fetch Pathao order status:", error);
|
|
230
262
|
const errorMessage = this.getErrorMessage(error);
|
|
231
263
|
throw new Error(`Failed to fetch Pathao order status: ${errorMessage}`);
|
|
232
264
|
}
|
|
233
265
|
}
|
|
266
|
+
// Official Pathao API: Create Bulk Order
|
|
267
|
+
async createBulkOrder(orders) {
|
|
268
|
+
try {
|
|
269
|
+
const response = await this.pathaoClient.post("/aladdin/api/v1/orders/bulk", { orders });
|
|
270
|
+
return response.data;
|
|
271
|
+
} catch (error) {
|
|
272
|
+
const errorMessage = this.getErrorMessage(error);
|
|
273
|
+
throw new Error(`Failed to create bulk Pathao orders: ${errorMessage}`);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
234
276
|
// Helper method to validate phone number
|
|
235
277
|
static validatePhoneNumber(phone) {
|
|
236
278
|
const cleanPhone = phone.replace(/\D/g, "");
|
|
@@ -258,6 +300,42 @@ var PathaoApiService = class {
|
|
|
258
300
|
const trimmed = name.trim();
|
|
259
301
|
return trimmed.length >= 3 && trimmed.length <= 100;
|
|
260
302
|
}
|
|
303
|
+
// Helper method to validate store name
|
|
304
|
+
static validateStoreName(name) {
|
|
305
|
+
const trimmed = name.trim();
|
|
306
|
+
return trimmed.length >= 3 && trimmed.length <= 50;
|
|
307
|
+
}
|
|
308
|
+
// Helper method to validate contact name
|
|
309
|
+
static validateContactName(name) {
|
|
310
|
+
const trimmed = name.trim();
|
|
311
|
+
return trimmed.length >= 3 && trimmed.length <= 50;
|
|
312
|
+
}
|
|
313
|
+
// Helper method to validate contact number
|
|
314
|
+
static validateContactNumber(phone) {
|
|
315
|
+
const cleanPhone = phone.replace(/\D/g, "");
|
|
316
|
+
return cleanPhone.length === 11;
|
|
317
|
+
}
|
|
318
|
+
// Helper method to validate store address
|
|
319
|
+
static validateStoreAddress(address) {
|
|
320
|
+
const trimmed = address.trim();
|
|
321
|
+
return trimmed.length >= 15 && trimmed.length <= 120;
|
|
322
|
+
}
|
|
323
|
+
// Method to clear authentication state (useful for testing)
|
|
324
|
+
clearAuth() {
|
|
325
|
+
this.accessToken = null;
|
|
326
|
+
this.refreshToken = null;
|
|
327
|
+
this.tokenExpiry = null;
|
|
328
|
+
this.isAuthenticating = false;
|
|
329
|
+
this.authPromise = null;
|
|
330
|
+
this.requestQueue = [];
|
|
331
|
+
this.circuitBreaker = {
|
|
332
|
+
failures: 0,
|
|
333
|
+
lastFailureTime: 0,
|
|
334
|
+
threshold: 5,
|
|
335
|
+
timeout: 6e4,
|
|
336
|
+
isOpen: false
|
|
337
|
+
};
|
|
338
|
+
}
|
|
261
339
|
};
|
|
262
340
|
|
|
263
341
|
// src/types.ts
|
|
@@ -271,15 +349,9 @@ var ItemType = /* @__PURE__ */ ((ItemType2) => {
|
|
|
271
349
|
ItemType2[ItemType2["PARCEL"] = 2] = "PARCEL";
|
|
272
350
|
return ItemType2;
|
|
273
351
|
})(ItemType || {});
|
|
274
|
-
var StoreType = /* @__PURE__ */ ((StoreType2) => {
|
|
275
|
-
StoreType2[StoreType2["PICKUP_POINT"] = 1] = "PICKUP_POINT";
|
|
276
|
-
StoreType2[StoreType2["SERVICE_POINT"] = 2] = "SERVICE_POINT";
|
|
277
|
-
return StoreType2;
|
|
278
|
-
})(StoreType || {});
|
|
279
352
|
|
|
280
353
|
exports.DeliveryType = DeliveryType;
|
|
281
354
|
exports.ItemType = ItemType;
|
|
282
355
|
exports.PathaoApiService = PathaoApiService;
|
|
283
|
-
exports.StoreType = StoreType;
|
|
284
356
|
//# sourceMappingURL=index.js.map
|
|
285
357
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/pathao-api.ts","../src/types.ts"],"names":["axios","config","AxiosError","DeliveryType","ItemType","StoreType"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Pathao Merchant API Service (Unofficial SDK)\n * \n * This is an unofficial SDK for the Pathao Merchant API.\n * \n * API Details (based on public documentation):\n * - Authentication: OAuth2 with client_id, client_secret, username, password\n * - Live URL: https://api-hermes.pathao.com\n * - All endpoints use /aladdin/api/v1/ prefix\n * \n * Features implemented:\n * - Token-based authentication with refresh token support\n * - Store management (create, list stores)\n * - Order creation (single and bulk)\n * - Order tracking and status\n * - Dynamic price calculation\n * - City, zone, and area management\n */\n\nimport axios, { AxiosInstance, AxiosError } from 'axios';\nimport {\n PathaoConfig,\n PathaoAuthResponse,\n PathaoOrderRequest,\n PathaoOrderResponse,\n PathaoStoreRequest,\n PathaoStoreResponse,\n PathaoPriceRequest,\n PathaoPriceResponse,\n PathaoCityResponse,\n PathaoOrderStatusResponse,\n PathaoAreaResponse,\n PathaoError\n} from './types';\n\nexport class PathaoApiService {\n private pathaoClient: AxiosInstance;\n private accessToken: string | null = null;\n private refreshToken: string | null = null;\n private tokenExpiry: number | null = null;\n private config: PathaoConfig;\n\n constructor(config: PathaoConfig) {\n this.config = {\n baseURL: 'https://api-hermes.pathao.com',\n timeout: 30000,\n ...config\n };\n\n this.pathaoClient = axios.create({\n baseURL: this.config.baseURL || 'https://api-hermes.pathao.com',\n timeout: this.config.timeout || 30000,\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n },\n });\n\n // Validate required credentials\n if (!this.config.clientId || !this.config.clientSecret || !this.config.username || !this.config.password) {\n throw new Error('Pathao API credentials are required: clientId, clientSecret, username, password');\n }\n\n // Add request interceptor for authentication\n this.pathaoClient.interceptors.request.use(async (config) => {\n await this.ensureAuthenticated();\n if (this.accessToken) {\n config.headers.Authorization = `Bearer ${this.accessToken}`;\n }\n return config;\n });\n }\n\n private async ensureAuthenticated(): Promise<void> {\n if (this.accessToken && this.tokenExpiry && Date.now() < this.tokenExpiry) {\n return; // Token is still valid\n }\n\n if (this.refreshToken) {\n try {\n await this.refreshAccessToken();\n return;\n } catch (error) {\n console.warn('Token refresh failed, attempting fresh authentication');\n }\n }\n\n await this.authenticate();\n }\n\n private async authenticate(): Promise<void> {\n try {\n const response = await this.pathaoClient.post<PathaoAuthResponse>('/aladdin/api/v1/issue-token', {\n client_id: this.config.clientId,\n client_secret: this.config.clientSecret,\n username: this.config.username,\n password: this.config.password,\n grant_type: 'password'\n });\n\n this.accessToken = response.data.access_token;\n this.refreshToken = response.data.refresh_token;\n this.tokenExpiry = Date.now() + (response.data.expires_in * 1000) - 60000; // 1 minute buffer\n\n console.log('Pathao authentication successful');\n } catch (error) {\n console.error('Pathao authentication failed:', error);\n throw new Error(`Authentication failed: ${this.getErrorMessage(error)}`);\n }\n }\n\n private async refreshAccessToken(): Promise<void> {\n if (!this.refreshToken) {\n throw new Error('No refresh token available');\n }\n\n try {\n const response = await this.pathaoClient.post<PathaoAuthResponse>('/aladdin/api/v1/issue-token', {\n client_id: this.config.clientId,\n client_secret: this.config.clientSecret,\n refresh_token: this.refreshToken,\n grant_type: 'refresh_token'\n });\n\n this.accessToken = response.data.access_token;\n this.refreshToken = response.data.refresh_token;\n this.tokenExpiry = Date.now() + (response.data.expires_in * 1000) - 60000; // 1 minute buffer\n\n console.log('Pathao token refresh successful');\n } catch (error) {\n console.error('Pathao token refresh failed:', error);\n throw new Error(`Token refresh failed: ${this.getErrorMessage(error)}`);\n }\n }\n\n private getErrorMessage(error: any): string {\n if (error instanceof AxiosError) {\n const pathaoError = error.response?.data as PathaoError;\n if (pathaoError?.message) {\n return pathaoError.message;\n }\n return error.message;\n }\n return error.message || 'Unknown error';\n }\n\n // Official Pathao API: Create Order\n async createOrder(orderData: PathaoOrderRequest): Promise<PathaoOrderResponse> {\n try {\n console.log('Creating Pathao order:', {\n store_id: orderData.store_id,\n merchant_order_id: orderData.merchant_order_id,\n recipient_name: orderData.recipient_name,\n recipient_phone: orderData.recipient_phone,\n delivery_type: orderData.delivery_type,\n item_type: orderData.item_type,\n item_weight: orderData.item_weight,\n amount_to_collect: orderData.amount_to_collect\n });\n \n const response = await this.pathaoClient.post<PathaoOrderResponse>('/aladdin/api/v1/orders', orderData);\n \n console.log('Pathao order created successfully:', {\n consignment_id: response.data.data?.consignment_id,\n invoice_id: response.data.data?.invoice_id,\n status: response.data.data?.status\n });\n \n return response.data;\n } catch (error: any) {\n console.error('Pathao order creation failed:', {\n error: error.message,\n response: error.response?.data,\n status: error.response?.status,\n orderData: orderData\n });\n \n const errorMessage = this.getErrorMessage(error);\n throw new Error(`Failed to create Pathao order: ${errorMessage}`);\n }\n }\n\n // Official Pathao API: Create Store\n async createStore(storeData: PathaoStoreRequest): Promise<PathaoStoreResponse> {\n try {\n console.log('Creating Pathao store:', {\n name: storeData.name,\n contact_name: storeData.contact_name,\n city_id: storeData.city_id,\n zone_id: storeData.zone_id,\n area_id: storeData.area_id\n });\n \n const response = await this.pathaoClient.post<PathaoStoreResponse>('/aladdin/api/v1/stores', storeData);\n \n console.log('Pathao store created successfully:', {\n store_id: response.data.data?.store_id,\n name: response.data.data?.name,\n status: response.data.data?.status\n });\n \n return response.data;\n } catch (error: any) {\n console.error('Pathao store creation failed:', {\n error: error.message,\n response: error.response?.data,\n status: error.response?.status,\n storeData: storeData\n });\n \n const errorMessage = this.getErrorMessage(error);\n throw new Error(`Failed to create Pathao store: ${errorMessage}`);\n }\n }\n\n // Official Pathao API: Get Store List\n async getStores(): Promise<PathaoStoreResponse[]> {\n try {\n const response = await this.pathaoClient.get<{ data: PathaoStoreResponse[] }>('/aladdin/api/v1/stores');\n return response.data.data || [];\n } catch (error: any) {\n console.error('Failed to fetch Pathao stores:', error);\n const errorMessage = this.getErrorMessage(error);\n throw new Error(`Failed to fetch Pathao stores: ${errorMessage}`);\n }\n }\n\n // Official Pathao API: Calculate Price\n async calculatePrice(priceData: PathaoPriceRequest): Promise<PathaoPriceResponse> {\n try {\n console.log('Calculating Pathao price:', {\n store_id: priceData.store_id,\n item_type: priceData.item_type,\n item_weight: priceData.item_weight,\n delivery_type: priceData.delivery_type,\n recipient_city: priceData.recipient_city,\n recipient_zone: priceData.recipient_zone,\n recipient_area: priceData.recipient_area\n });\n \n const response = await this.pathaoClient.post<PathaoPriceResponse>('/aladdin/api/v1/merchant/price-check', priceData);\n \n console.log('Pathao price calculated:', {\n delivery_charge: response.data.data?.delivery_charge,\n cod_charge: response.data.data?.cod_charge,\n total_charge: response.data.data?.total_charge\n });\n \n return response.data;\n } catch (error: any) {\n console.error('Pathao price calculation failed:', {\n error: error.message,\n response: error.response?.data,\n status: error.response?.status,\n priceData: priceData\n });\n \n const errorMessage = this.getErrorMessage(error);\n throw new Error(`Failed to calculate Pathao price: ${errorMessage}`);\n }\n }\n\n // Official Pathao API: Get Cities\n async getCities(): Promise<PathaoCityResponse> {\n try {\n const response = await this.pathaoClient.get<PathaoCityResponse>('/aladdin/api/v1/cities');\n return response.data;\n } catch (error: any) {\n console.error('Failed to fetch Pathao cities:', error);\n const errorMessage = this.getErrorMessage(error);\n throw new Error(`Failed to fetch Pathao cities: ${errorMessage}`);\n }\n }\n\n // Official Pathao API: Get Areas\n async getAreas(): Promise<PathaoAreaResponse> {\n try {\n const response = await this.pathaoClient.get<PathaoAreaResponse>('/aladdin/api/v1/areas');\n return response.data;\n } catch (error: any) {\n console.error('Failed to fetch Pathao areas:', error);\n const errorMessage = this.getErrorMessage(error);\n throw new Error(`Failed to fetch Pathao areas: ${errorMessage}`);\n }\n }\n\n // Official Pathao API: Get Order Status\n async getOrderStatus(consignmentId: string): Promise<PathaoOrderStatusResponse> {\n try {\n const response = await this.pathaoClient.get<PathaoOrderStatusResponse>(`/aladdin/api/v1/orders/${consignmentId}`);\n return response.data;\n } catch (error: any) {\n console.error('Failed to fetch Pathao order status:', error);\n const errorMessage = this.getErrorMessage(error);\n throw new Error(`Failed to fetch Pathao order status: ${errorMessage}`);\n }\n }\n\n // Helper method to validate phone number\n static validatePhoneNumber(phone: string): boolean {\n const cleanPhone = phone.replace(/\\D/g, '');\n return cleanPhone.length === 11 && cleanPhone.startsWith('01');\n }\n\n // Helper method to format phone number\n static formatPhoneNumber(phone: string): string {\n const cleanPhone = phone.replace(/\\D/g, '');\n if (cleanPhone.length === 11 && cleanPhone.startsWith('01')) {\n return cleanPhone;\n }\n throw new Error('Invalid phone number format. Must be 11 digits starting with 01');\n }\n\n // Helper method to validate address\n static validateAddress(address: string): boolean {\n const trimmed = address.trim();\n return trimmed.length >= 10 && trimmed.length <= 220;\n }\n\n // Helper method to validate weight\n static validateWeight(weight: number): boolean {\n return weight >= 0.5 && weight <= 10;\n }\n\n // Helper method to validate recipient name\n static validateRecipientName(name: string): boolean {\n const trimmed = name.trim();\n return trimmed.length >= 3 && trimmed.length <= 100;\n }\n}\n","/**\n * Pathao Courier API Types\n * \n * Official API Details:\n * - Authentication: OAuth2 with client_id, client_secret, username, password\n * - Live URL: https://api-hermes.pathao.com\n * - All endpoints use /aladdin/api/v1/ prefix\n */\n\n// Official Pathao API Authentication Response\nexport interface PathaoAuthResponse {\n token_type: string;\n expires_in: number;\n access_token: string;\n refresh_token: string;\n}\n\n// Official Pathao Order Creation Request\nexport interface PathaoOrderRequest {\n store_id: number;\n merchant_order_id?: string; // Optional - Your order tracking ID\n recipient_name: string; // Required - 3-100 characters\n recipient_phone: string; // Required - 11 characters\n recipient_secondary_phone?: string; // Optional - 11 characters\n recipient_address: string; // Required - 10-220 characters\n recipient_city?: number; // Optional - Auto-detected if not provided\n recipient_zone?: number; // Optional - Auto-detected if not provided\n recipient_area?: number; // Optional - Auto-detected if not provided\n delivery_type: number; // Required - 48 (Normal), 12 (On Demand)\n item_type: number; // Required - 1 (Document), 2 (Parcel)\n special_instruction?: string; // Optional\n item_quantity: number; // Required\n item_weight: number; // Required - 0.5-10 kg\n item_description?: string; // Optional\n amount_to_collect: number; // Required - COD amount (0 for non-COD)\n}\n\n// Official Pathao Store Creation Request\nexport interface PathaoStoreRequest {\n name: string;\n contact_name: string;\n contact_number: string;\n address: string;\n city_id: number;\n zone_id: number;\n area_id: number;\n store_type: number; // 1 (Pickup Point), 2 (Service Point)\n}\n\n// Official Pathao Order Response\nexport interface PathaoOrderResponse {\n type: string;\n code: number;\n message: string;\n data: {\n consignment_id: string;\n invoice_id: string;\n merchant_order_id: string;\n store_id: number;\n recipient_name: string;\n recipient_phone: string;\n recipient_address: string;\n recipient_city: string;\n recipient_zone: string;\n recipient_area: string;\n delivery_type: string;\n item_type: string;\n item_quantity: number;\n item_weight: number;\n item_description: string;\n amount_to_collect: number;\n special_instruction: string;\n status: string;\n created_at: string;\n updated_at: string;\n };\n}\n\n// Official Pathao Store Response\nexport interface PathaoStoreResponse {\n type: string;\n code: number;\n message: string;\n data: {\n store_id: number;\n name: string;\n contact_name: string;\n contact_number: string;\n address: string;\n city_id: number;\n zone_id: number;\n area_id: number;\n store_type: number;\n status: string;\n created_at: string;\n updated_at: string;\n };\n}\n\n// Official Pathao Price Calculation Request\nexport interface PathaoPriceRequest {\n store_id: number;\n item_type: number;\n item_weight: number;\n delivery_type: number;\n recipient_city: number;\n recipient_zone: number;\n recipient_area: number;\n}\n\n// Official Pathao Price Response\nexport interface PathaoPriceResponse {\n type: string;\n code: number;\n message: string;\n data: {\n store_id: number;\n item_type: string;\n item_weight: number;\n delivery_type: string;\n recipient_city: string;\n recipient_zone: string;\n recipient_area: string;\n delivery_charge: number;\n cod_charge: number;\n total_charge: number;\n currency: string;\n };\n}\n\n// Official Pathao City Response\nexport interface PathaoCityResponse {\n type: string;\n code: number;\n message: string;\n data: Array<{\n city_id: number;\n city_name: string;\n zone_list: Array<{\n zone_id: number;\n zone_name: string;\n area_list: Array<{\n area_id: number;\n area_name: string;\n }>;\n }>;\n }>;\n}\n\n// Official Pathao Order Status Response\nexport interface PathaoOrderStatusResponse {\n type: string;\n code: number;\n message: string;\n data: {\n consignment_id: string;\n invoice_id: string;\n merchant_order_id: string;\n store_id: number;\n recipient_name: string;\n recipient_phone: string;\n recipient_address: string;\n recipient_city: string;\n recipient_zone: string;\n recipient_area: string;\n delivery_type: string;\n item_type: string;\n item_quantity: number;\n item_weight: number;\n item_description: string;\n amount_to_collect: number;\n special_instruction: string;\n status: string;\n status_updated_at: string;\n created_at: string;\n updated_at: string;\n };\n}\n\n// Official Pathao Area Response\nexport interface PathaoAreaResponse {\n type: string;\n code: number;\n message: string;\n data: Array<{\n area_id: number;\n area_name: string;\n zone_id: number;\n zone_name: string;\n city_id: number;\n city_name: string;\n }>;\n}\n\n// Configuration options for PathaoApiService\nexport interface PathaoConfig {\n clientId: string;\n clientSecret: string;\n username: string;\n password: string;\n baseURL?: string;\n timeout?: number;\n}\n\n// Error response from Pathao API\nexport interface PathaoError {\n type: string;\n code: number;\n message: string;\n errors?: Record<string, string[]>;\n validation?: Record<string, string[]>;\n}\n\n// Delivery types enum\nexport enum DeliveryType {\n NORMAL = 48,\n ON_DEMAND = 12\n}\n\n// Item types enum\nexport enum ItemType {\n DOCUMENT = 1,\n PARCEL = 2\n}\n\n// Store types enum\nexport enum StoreType {\n PICKUP_POINT = 1,\n SERVICE_POINT = 2\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/pathao-api.ts","../src/types.ts"],"names":["axios","config","AxiosError","DeliveryType","ItemType"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Pathao Merchant API Service (Unofficial SDK)\n * \n * This is an unofficial SDK for the Pathao Merchant API.\n * \n * API Details (based on public documentation):\n * - Authentication: OAuth2 with client_id, client_secret, username, password\n * - All endpoints use /aladdin/api/v1/ prefix\n * - Base URL can be set via PATHAO_BASE_URL environment variable or constructor config\n * - Timeout can be set via PATHAO_TIMEOUT environment variable or constructor config\n * \n * Features implemented:\n * - Token-based authentication with refresh token support\n * - Store management (create, list stores)\n * - Order creation (single and bulk)\n * - Order tracking and status\n * - Dynamic price calculation\n * - City, zone, and area management\n */\n\nimport axios, { AxiosError, AxiosInstance } from 'axios';\nimport {\n PathaoAreaResponse,\n PathaoAuthResponse,\n PathaoCityResponse,\n PathaoConfig,\n PathaoError,\n PathaoOrderRequest,\n PathaoOrderResponse,\n PathaoOrderStatusResponse,\n PathaoPriceRequest,\n PathaoPriceResponse,\n PathaoStoreRequest,\n PathaoStoreResponse,\n PathaoZoneResponse,\n} from './types';\n\nexport class PathaoApiService {\n private pathaoClient: AxiosInstance;\n private accessToken: string | null = null;\n private refreshToken: string | null = null;\n private tokenExpiry: number | null = null;\n private config: PathaoConfig;\n private isAuthenticating: boolean = false;\n private authPromise: Promise<void> | null = null;\n private requestQueue: Array<{ resolve: () => void; reject: (error: Error) => void }> = [];\n private circuitBreaker = {\n failures: 0,\n lastFailureTime: 0,\n threshold: 5,\n timeout: 60000, // 1 minute\n isOpen: false\n };\n\n constructor(config: PathaoConfig) {\n this.config = {\n baseURL: config.baseURL || process.env.PATHAO_BASE_URL || '',\n timeout: config.timeout || parseInt(process.env.PATHAO_TIMEOUT || '30000', 10),\n clientId: config.clientId || process.env.PATHAO_CLIENT_ID || '',\n clientSecret: config.clientSecret || process.env.PATHAO_CLIENT_SECRET || '',\n username: config.username || process.env.PATHAO_USERNAME || '',\n password: config.password || process.env.PATHAO_PASSWORD || '',\n };\n\n this.pathaoClient = axios.create({\n baseURL: this.config.baseURL || process.env.PATHAO_BASE_URL || '',\n timeout: this.config.timeout || parseInt(process.env.PATHAO_TIMEOUT || '30000', 10),\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n },\n });\n\n // Validate required configuration\n if (!this.config.baseURL) {\n throw new Error('Pathao API baseURL is required. You can provide it via constructor config or PATHAO_BASE_URL environment variable');\n }\n \n if (!this.config.clientId || !this.config.clientSecret || !this.config.username || !this.config.password) {\n throw new Error('Pathao API credentials are required: clientId, clientSecret, username, password. You can provide them via constructor config or environment variables (PATHAO_CLIENT_ID, PATHAO_CLIENT_SECRET, PATHAO_USERNAME, PATHAO_PASSWORD)');\n }\n\n // Add request interceptor for authentication\n this.pathaoClient.interceptors.request.use(async (config) => {\n // Skip auth for token requests to prevent infinite loops\n if (config.url?.includes('/issue-token')) {\n return config;\n }\n \n await this.ensureAuthenticated();\n if (this.accessToken) {\n config.headers.Authorization = `Bearer ${this.accessToken}`;\n }\n return config;\n });\n\n // Add response interceptor for error handling\n this.pathaoClient.interceptors.response.use(\n (response) => {\n // Reset circuit breaker on successful request\n this.circuitBreaker.failures = 0;\n this.circuitBreaker.isOpen = false;\n return response;\n },\n async (error) => {\n if (error.response?.status === 401) {\n // Token expired, clear tokens and retry\n this.accessToken = null;\n this.refreshToken = null;\n this.tokenExpiry = null;\n \n // Retry the request once\n if (error.config && !error.config._retry) {\n error.config._retry = true;\n await this.ensureAuthenticated();\n if (this.accessToken) {\n error.config.headers.Authorization = `Bearer ${this.accessToken}`;\n }\n return this.pathaoClient.request(error.config);\n }\n }\n \n // Handle circuit breaker\n this.handleCircuitBreaker(error);\n return Promise.reject(error);\n }\n );\n }\n\n private async ensureAuthenticated(): Promise<void> {\n // Check circuit breaker\n if (this.circuitBreaker.isOpen) {\n if (Date.now() - this.circuitBreaker.lastFailureTime > this.circuitBreaker.timeout) {\n this.circuitBreaker.isOpen = false;\n this.circuitBreaker.failures = 0;\n } else {\n throw new Error('Circuit breaker is open. Too many authentication failures.');\n }\n }\n\n if (this.accessToken && this.tokenExpiry && Date.now() < this.tokenExpiry) {\n return; // Token is still valid\n }\n\n // If already authenticating, wait for it to complete\n if (this.isAuthenticating && this.authPromise) {\n return this.authPromise;\n }\n\n // Start authentication process\n this.isAuthenticating = true;\n this.authPromise = this.performAuthentication();\n\n try {\n await this.authPromise;\n } finally {\n this.isAuthenticating = false;\n this.authPromise = null;\n // Process queued requests\n this.processRequestQueue();\n }\n }\n\n private async performAuthentication(): Promise<void> {\n if (this.refreshToken) {\n try {\n await this.refreshAccessToken();\n return;\n } catch (error) {\n // Refresh failed, try fresh authentication\n this.refreshToken = null;\n }\n }\n\n await this.authenticate();\n }\n\n private processRequestQueue(): void {\n const queue = [...this.requestQueue];\n this.requestQueue = [];\n \n queue.forEach(({ resolve }) => {\n try {\n resolve();\n } catch (error) {\n // Ignore errors in queued requests\n }\n });\n }\n\n private async authenticate(): Promise<void> {\n try {\n const response = await this.pathaoClient.post<PathaoAuthResponse>('/aladdin/api/v1/issue-token', {\n client_id: this.config.clientId,\n client_secret: this.config.clientSecret,\n username: this.config.username,\n password: this.config.password,\n grant_type: 'password',\n });\n\n this.accessToken = response.data.access_token;\n this.refreshToken = response.data.refresh_token;\n this.tokenExpiry = Date.now() + (response.data.expires_in * 1000) - 60000; // 1 minute buffer\n\n // Reset circuit breaker on successful auth\n this.circuitBreaker.failures = 0;\n this.circuitBreaker.isOpen = false;\n } catch (error) {\n this.handleCircuitBreaker(error);\n throw new Error(`Authentication failed: ${this.getErrorMessage(error)}`);\n }\n }\n\n private async refreshAccessToken(): Promise<void> {\n if (!this.refreshToken) {\n throw new Error('No refresh token available');\n }\n\n try {\n const response = await this.pathaoClient.post<PathaoAuthResponse>('/aladdin/api/v1/issue-token', {\n client_id: this.config.clientId,\n client_secret: this.config.clientSecret,\n refresh_token: this.refreshToken,\n grant_type: 'refresh_token',\n });\n\n this.accessToken = response.data.access_token;\n this.refreshToken = response.data.refresh_token;\n this.tokenExpiry = Date.now() + (response.data.expires_in * 1000) - 60000; // 1 minute buffer\n\n // Reset circuit breaker on successful refresh\n this.circuitBreaker.failures = 0;\n this.circuitBreaker.isOpen = false;\n } catch (error) {\n this.handleCircuitBreaker(error);\n throw new Error(`Token refresh failed: ${this.getErrorMessage(error)}`);\n }\n }\n\n private getErrorMessage(error: any): string {\n if (error instanceof AxiosError) {\n const pathaoError = error.response?.data as PathaoError;\n if (pathaoError?.message) {\n return pathaoError.message;\n }\n return error.message;\n }\n return error.message || 'Unknown error';\n }\n\n private handleCircuitBreaker(_error: any): void {\n this.circuitBreaker.failures++;\n this.circuitBreaker.lastFailureTime = Date.now();\n \n if (this.circuitBreaker.failures >= this.circuitBreaker.threshold) {\n this.circuitBreaker.isOpen = true;\n }\n }\n\n // Official Pathao API: Create Order\n async createOrder(orderData: PathaoOrderRequest): Promise<PathaoOrderResponse> {\n try {\n const response = await this.pathaoClient.post<PathaoOrderResponse>('/aladdin/api/v1/orders', orderData);\n return response.data;\n } catch (error: any) {\n const errorMessage = this.getErrorMessage(error);\n throw new Error(`Failed to create Pathao order: ${errorMessage}`);\n }\n }\n\n // Official Pathao API: Create Store\n async createStore(storeData: PathaoStoreRequest): Promise<PathaoStoreResponse> {\n try {\n const response = await this.pathaoClient.post<PathaoStoreResponse>('/aladdin/api/v1/stores', storeData);\n return response.data;\n } catch (error: any) {\n const errorMessage = this.getErrorMessage(error);\n throw new Error(`Failed to create Pathao store: ${errorMessage}`);\n }\n }\n\n // Official Pathao API: Get Store List\n async getStores(): Promise<{ data: PathaoStoreResponse[]; total: number; current_page: number; per_page: number; total_in_page: number; last_page: number; path: string; to: number; from: number; last_page_url: string; first_page_url: string }> {\n try {\n const response = await this.pathaoClient.get<{ data: PathaoStoreResponse[]; total: number; current_page: number; per_page: number; total_in_page: number; last_page: number; path: string; to: number; from: number; last_page_url: string; first_page_url: string }>('/aladdin/api/v1/stores');\n return response.data;\n } catch (error: any) {\n const errorMessage = this.getErrorMessage(error);\n throw new Error(`Failed to fetch Pathao stores: ${errorMessage}`);\n }\n }\n\n // Official Pathao API: Calculate Price\n async calculatePrice(priceData: PathaoPriceRequest): Promise<PathaoPriceResponse> {\n try {\n const response = await this.pathaoClient.post<PathaoPriceResponse>('/aladdin/api/v1/merchant/price-plan', priceData);\n return response.data;\n } catch (error: any) {\n const errorMessage = this.getErrorMessage(error);\n throw new Error(`Failed to calculate Pathao price: ${errorMessage}`);\n }\n }\n\n // Official Pathao API: Get Cities\n async getCities(): Promise<PathaoCityResponse> {\n try {\n const response = await this.pathaoClient.get<PathaoCityResponse>('/aladdin/api/v1/city-list');\n return response.data;\n } catch (error: any) {\n const errorMessage = this.getErrorMessage(error);\n throw new Error(`Failed to fetch Pathao cities: ${errorMessage}`);\n }\n }\n\n // Official Pathao API: Get Zones for a City\n async getZones(cityId: number): Promise<PathaoZoneResponse> {\n try {\n const response = await this.pathaoClient.get<PathaoZoneResponse>(`/aladdin/api/v1/cities/${cityId}/zone-list`);\n return response.data;\n } catch (error: any) {\n const errorMessage = this.getErrorMessage(error);\n throw new Error(`Failed to fetch Pathao zones: ${errorMessage}`);\n }\n }\n\n // Official Pathao API: Get Areas for a Zone\n async getAreas(zoneId: number): Promise<PathaoAreaResponse> {\n try {\n const response = await this.pathaoClient.get<PathaoAreaResponse>(`/aladdin/api/v1/zones/${zoneId}/area-list`);\n return response.data;\n } catch (error: any) {\n const errorMessage = this.getErrorMessage(error);\n throw new Error(`Failed to fetch Pathao areas: ${errorMessage}`);\n }\n }\n\n // Official Pathao API: Get Order Status\n async getOrderStatus(consignmentId: string): Promise<PathaoOrderStatusResponse> {\n try {\n const response = await this.pathaoClient.get<PathaoOrderStatusResponse>(`/aladdin/api/v1/orders/${consignmentId}/info`);\n return response.data;\n } catch (error: any) {\n const errorMessage = this.getErrorMessage(error);\n throw new Error(`Failed to fetch Pathao order status: ${errorMessage}`);\n }\n }\n\n // Official Pathao API: Create Bulk Order\n async createBulkOrder(orders: PathaoOrderRequest[]): Promise<{ message: string; type: string; code: number; data: boolean }> {\n try {\n const response = await this.pathaoClient.post<{ message: string; type: string; code: number; data: boolean }>('/aladdin/api/v1/orders/bulk', { orders });\n return response.data;\n } catch (error: any) {\n const errorMessage = this.getErrorMessage(error);\n throw new Error(`Failed to create bulk Pathao orders: ${errorMessage}`);\n }\n }\n\n // Helper method to validate phone number\n static validatePhoneNumber(phone: string): boolean {\n const cleanPhone = phone.replace(/\\D/g, '');\n return cleanPhone.length === 11 && cleanPhone.startsWith('01');\n }\n\n // Helper method to format phone number\n static formatPhoneNumber(phone: string): string {\n const cleanPhone = phone.replace(/\\D/g, '');\n if (cleanPhone.length === 11 && cleanPhone.startsWith('01')) {\n return cleanPhone;\n }\n throw new Error('Invalid phone number format. Must be 11 digits starting with 01');\n }\n\n // Helper method to validate address\n static validateAddress(address: string): boolean {\n const trimmed = address.trim();\n return trimmed.length >= 10 && trimmed.length <= 220;\n }\n\n // Helper method to validate weight\n static validateWeight(weight: number): boolean {\n return weight >= 0.5 && weight <= 10;\n }\n\n // Helper method to validate recipient name\n static validateRecipientName(name: string): boolean {\n const trimmed = name.trim();\n return trimmed.length >= 3 && trimmed.length <= 100;\n }\n\n // Helper method to validate store name\n static validateStoreName(name: string): boolean {\n const trimmed = name.trim();\n return trimmed.length >= 3 && trimmed.length <= 50;\n }\n\n // Helper method to validate contact name\n static validateContactName(name: string): boolean {\n const trimmed = name.trim();\n return trimmed.length >= 3 && trimmed.length <= 50;\n }\n\n // Helper method to validate contact number\n static validateContactNumber(phone: string): boolean {\n const cleanPhone = phone.replace(/\\D/g, '');\n return cleanPhone.length === 11;\n }\n\n // Helper method to validate store address\n static validateStoreAddress(address: string): boolean {\n const trimmed = address.trim();\n return trimmed.length >= 15 && trimmed.length <= 120;\n }\n\n // Method to clear authentication state (useful for testing)\n clearAuth(): void {\n this.accessToken = null;\n this.refreshToken = null;\n this.tokenExpiry = null;\n this.isAuthenticating = false;\n this.authPromise = null;\n this.requestQueue = [];\n this.circuitBreaker = {\n failures: 0,\n lastFailureTime: 0,\n threshold: 5,\n timeout: 60000,\n isOpen: false\n };\n }\n}\n","/**\n * Pathao Courier API Types\n * \n * Official API Details:\n * - Authentication: OAuth2 with client_id, client_secret, username, password\n * - All endpoints use /aladdin/api/v1/ prefix\n * - Base URL can be set via PATHAO_BASE_URL environment variable or constructor config\n * - Timeout can be set via PATHAO_TIMEOUT environment variable or constructor config\n */\n\n// Official Pathao API Authentication Response\nexport interface PathaoAuthResponse {\n token_type: string;\n expires_in: number;\n access_token: string;\n refresh_token: string;\n}\n\n// Official Pathao Order Creation Request\nexport interface PathaoOrderRequest {\n store_id: number;\n merchant_order_id?: string; // Optional - Your order tracking ID\n recipient_name: string; // Required - 3-100 characters\n recipient_phone: string; // Required - 11 characters\n recipient_secondary_phone?: string; // Optional - 11 characters\n recipient_address: string; // Required - 10-220 characters\n recipient_city?: number; // Optional - Auto-detected if not provided\n recipient_zone?: number; // Optional - Auto-detected if not provided\n recipient_area?: number; // Optional - Auto-detected if not provided\n delivery_type: number; // Required - 48 (Normal), 12 (On Demand)\n item_type: number; // Required - 1 (Document), 2 (Parcel)\n special_instruction?: string; // Optional\n item_quantity: number; // Required\n item_weight: number; // Required - 0.5-10 kg\n item_description?: string; // Optional\n amount_to_collect: number; // Required - COD amount (0 for non-COD)\n}\n\n// Official Pathao Store Creation Request\nexport interface PathaoStoreRequest {\n name: string; // 3-50 characters\n contact_name: string; // 3-50 characters\n contact_number: string; // 11 characters\n secondary_contact?: string; // Optional - 11 characters\n otp_number?: string; // Optional - OTP for orders\n address: string; // 15-120 characters\n city_id: number;\n zone_id: number;\n area_id: number;\n}\n\n// Official Pathao Order Response\nexport interface PathaoOrderResponse {\n type: string;\n code: number;\n message: string;\n data: {\n consignment_id: string;\n merchant_order_id: string;\n order_status: string;\n delivery_fee: number;\n };\n}\n\n// Official Pathao Store Response\nexport interface PathaoStoreResponse {\n type: string;\n code: number;\n message: string;\n data: {\n store_id: number;\n store_name: string;\n store_address: string;\n is_active: number; // 1 for active, 0 for deactivated\n city_id: number;\n zone_id: number;\n hub_id: number;\n is_default_store: boolean;\n is_default_return_store: boolean;\n };\n}\n\n// Official Pathao Price Calculation Request\nexport interface PathaoPriceRequest {\n store_id: number;\n item_type: number;\n item_weight: number;\n delivery_type: number;\n recipient_city: number;\n recipient_zone: number;\n recipient_area: number;\n}\n\n// Official Pathao Price Response\nexport interface PathaoPriceResponse {\n type: string;\n code: number;\n message: string;\n data: {\n price: number; // Calculated price for given item\n discount: number; // Discount for the given item\n promo_discount: number; // Promo discount for the given item\n plan_id: number; // Price plan id for the given item\n cod_enabled: number; // 1 if COD enabled, 0 if not\n cod_percentage: number; // Cash on delivery percentage\n additional_charge: number; // If there is any additional charge\n final_price: number; // Your final price for the given item\n };\n}\n\n// Official Pathao City Response\nexport interface PathaoCityResponse {\n type: string;\n code: number;\n message: string;\n data: {\n data: Array<{\n city_id: number;\n city_name: string;\n }>;\n };\n}\n\n// Official Pathao Order Status Response\nexport interface PathaoOrderStatusResponse {\n type: string;\n code: number;\n message: string;\n data: {\n consignment_id: string;\n merchant_order_id: string;\n order_status: string;\n order_status_slug: string;\n updated_at: string;\n invoice_id: string | null;\n };\n}\n\n// Official Pathao Zone Response\nexport interface PathaoZoneResponse {\n type: string;\n code: number;\n message: string;\n data: {\n data: Array<{\n zone_id: number;\n zone_name: string;\n }>;\n };\n}\n\n// Official Pathao Area Response\nexport interface PathaoAreaResponse {\n type: string;\n code: number;\n message: string;\n data: {\n data: Array<{\n area_id: number;\n area_name: string;\n home_delivery_available: boolean;\n pickup_available: boolean;\n }>;\n };\n}\n\n// Configuration options for PathaoApiService\nexport interface PathaoConfig {\n clientId: string;\n clientSecret: string;\n username: string;\n password: string;\n baseURL: string;\n timeout?: number;\n}\n\n// Error response from Pathao API\nexport interface PathaoError {\n type: string;\n code: number;\n message: string;\n errors?: Record<string, string[]>;\n validation?: Record<string, string[]>;\n}\n\n// Delivery types enum\nexport enum DeliveryType {\n NORMAL = 48,\n ON_DEMAND = 12\n}\n\n// Item types enum\nexport enum ItemType {\n DOCUMENT = 1,\n PARCEL = 2\n}\n\n// Store types enum (removed as not used in official API)\n// export enum StoreType {\n// PICKUP_POINT = 1,\n// SERVICE_POINT = 2\n// }\n"]}
|