pathao-merchant-sdk 2.0.0 → 2.0.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/CHANGELOG.md +32 -0
- package/README.md +100 -6
- package/dist/index.d.mts +37 -2
- package/dist/index.d.ts +37 -2
- package/dist/index.js +167 -69
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +167 -70
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -1,58 +1,80 @@
|
|
|
1
1
|
import axios, { AxiosError } from 'axios';
|
|
2
2
|
|
|
3
3
|
// src/pathao-api.ts
|
|
4
|
-
var
|
|
5
|
-
constructor(
|
|
4
|
+
var PathaoApiError = class extends Error {
|
|
5
|
+
constructor(message, options = {}) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = "PathaoApiError";
|
|
8
|
+
this.status = options.status;
|
|
9
|
+
this.code = options.code;
|
|
10
|
+
this.type = options.type;
|
|
11
|
+
this.errors = options.errors;
|
|
12
|
+
this.validation = options.validation;
|
|
13
|
+
this.responseData = options.responseData;
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
var PathaoApiService = class _PathaoApiService {
|
|
17
|
+
constructor(config, options) {
|
|
6
18
|
this.accessToken = null;
|
|
7
19
|
this.refreshToken = null;
|
|
8
20
|
this.tokenExpiry = null;
|
|
9
21
|
this.isAuthenticating = false;
|
|
10
22
|
this.authPromise = null;
|
|
11
23
|
this.requestQueue = [];
|
|
12
|
-
this.
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
threshold: 5,
|
|
16
|
-
timeout: 6e4,
|
|
17
|
-
// 1 minute
|
|
18
|
-
isOpen: false
|
|
19
|
-
};
|
|
24
|
+
this.hasValidated = false;
|
|
25
|
+
this.debug = false;
|
|
26
|
+
const timeout = config.timeout || parseInt(process.env.PATHAO_TIMEOUT || "30000", 10);
|
|
20
27
|
this.config = {
|
|
21
28
|
baseURL: config.baseURL || process.env.PATHAO_BASE_URL || "",
|
|
22
|
-
timeout
|
|
29
|
+
timeout,
|
|
23
30
|
clientId: config.clientId || process.env.PATHAO_CLIENT_ID || "",
|
|
24
31
|
clientSecret: config.clientSecret || process.env.PATHAO_CLIENT_SECRET || "",
|
|
25
32
|
username: config.username || process.env.PATHAO_USERNAME || "",
|
|
26
33
|
password: config.password || process.env.PATHAO_PASSWORD || ""
|
|
27
34
|
};
|
|
35
|
+
this.debug = options?.debug || false;
|
|
36
|
+
this.circuitBreaker = {
|
|
37
|
+
failures: 0,
|
|
38
|
+
lastFailureTime: 0,
|
|
39
|
+
threshold: options?.circuitBreaker?.threshold ?? 5,
|
|
40
|
+
timeout: options?.circuitBreaker?.timeout ?? 6e4,
|
|
41
|
+
isOpen: false
|
|
42
|
+
};
|
|
28
43
|
this.pathaoClient = axios.create({
|
|
29
|
-
baseURL: this.config.baseURL
|
|
30
|
-
timeout: this.config.timeout
|
|
44
|
+
baseURL: this.config.baseURL,
|
|
45
|
+
timeout: this.config.timeout,
|
|
31
46
|
headers: {
|
|
32
47
|
"Content-Type": "application/json",
|
|
33
|
-
|
|
48
|
+
Accept: "application/json"
|
|
34
49
|
}
|
|
35
50
|
});
|
|
36
|
-
if (!this.config.baseURL) {
|
|
37
|
-
throw new Error("Pathao API baseURL is required. You can provide it via constructor config or PATHAO_BASE_URL environment variable");
|
|
38
|
-
}
|
|
39
|
-
if (!this.config.clientId || !this.config.clientSecret || !this.config.username || !this.config.password) {
|
|
40
|
-
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)");
|
|
41
|
-
}
|
|
42
51
|
this.pathaoClient.interceptors.request.use(async (config2) => {
|
|
43
52
|
if (config2.url?.includes("/issue-token")) {
|
|
44
53
|
return config2;
|
|
45
54
|
}
|
|
55
|
+
this.validateConfiguration();
|
|
46
56
|
await this.ensureAuthenticated();
|
|
47
57
|
if (this.accessToken) {
|
|
48
58
|
config2.headers.Authorization = `Bearer ${this.accessToken}`;
|
|
49
59
|
}
|
|
60
|
+
if (this.debug) {
|
|
61
|
+
console.log(`[Pathao SDK] ${config2.method?.toUpperCase()} ${config2.url}`, {
|
|
62
|
+
headers: config2.headers,
|
|
63
|
+
data: config2.data
|
|
64
|
+
});
|
|
65
|
+
}
|
|
50
66
|
return config2;
|
|
51
67
|
});
|
|
52
68
|
this.pathaoClient.interceptors.response.use(
|
|
53
69
|
(response) => {
|
|
54
70
|
this.circuitBreaker.failures = 0;
|
|
55
71
|
this.circuitBreaker.isOpen = false;
|
|
72
|
+
if (this.debug) {
|
|
73
|
+
console.log(`[Pathao SDK] Response ${response.status}`, {
|
|
74
|
+
url: response.config.url,
|
|
75
|
+
data: response.data
|
|
76
|
+
});
|
|
77
|
+
}
|
|
56
78
|
return response;
|
|
57
79
|
},
|
|
58
80
|
async (error) => {
|
|
@@ -74,13 +96,37 @@ var PathaoApiService = class {
|
|
|
74
96
|
}
|
|
75
97
|
);
|
|
76
98
|
}
|
|
99
|
+
validateConfiguration() {
|
|
100
|
+
if (this.hasValidated) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (!this.config.baseURL) {
|
|
104
|
+
throw this.toPathaoApiError(
|
|
105
|
+
new Error(
|
|
106
|
+
"Pathao API baseURL is required. You can provide it via constructor config or PATHAO_BASE_URL environment variable"
|
|
107
|
+
),
|
|
108
|
+
"Configuration validation failed"
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
if (!this.config.clientId || !this.config.clientSecret || !this.config.username || !this.config.password) {
|
|
112
|
+
throw this.toPathaoApiError(
|
|
113
|
+
new Error(
|
|
114
|
+
"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)"
|
|
115
|
+
),
|
|
116
|
+
"Configuration validation failed"
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
this.hasValidated = true;
|
|
120
|
+
}
|
|
77
121
|
async ensureAuthenticated() {
|
|
78
122
|
if (this.circuitBreaker.isOpen) {
|
|
79
123
|
if (Date.now() - this.circuitBreaker.lastFailureTime > this.circuitBreaker.timeout) {
|
|
80
124
|
this.circuitBreaker.isOpen = false;
|
|
81
125
|
this.circuitBreaker.failures = 0;
|
|
82
126
|
} else {
|
|
83
|
-
throw new Error(
|
|
127
|
+
throw new Error(
|
|
128
|
+
"Circuit breaker is open. Too many authentication failures."
|
|
129
|
+
);
|
|
84
130
|
}
|
|
85
131
|
}
|
|
86
132
|
if (this.accessToken && this.tokenExpiry && Date.now() < this.tokenExpiry) {
|
|
@@ -122,13 +168,16 @@ var PathaoApiService = class {
|
|
|
122
168
|
}
|
|
123
169
|
async authenticate() {
|
|
124
170
|
try {
|
|
125
|
-
const response = await this.pathaoClient.post(
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
171
|
+
const response = await this.pathaoClient.post(
|
|
172
|
+
"/aladdin/api/v1/issue-token",
|
|
173
|
+
{
|
|
174
|
+
client_id: this.config.clientId,
|
|
175
|
+
client_secret: this.config.clientSecret,
|
|
176
|
+
username: this.config.username,
|
|
177
|
+
password: this.config.password,
|
|
178
|
+
grant_type: "password"
|
|
179
|
+
}
|
|
180
|
+
);
|
|
132
181
|
this.accessToken = response.data.access_token;
|
|
133
182
|
this.refreshToken = response.data.refresh_token;
|
|
134
183
|
this.tokenExpiry = Date.now() + response.data.expires_in * 1e3 - 6e4;
|
|
@@ -136,7 +185,7 @@ var PathaoApiService = class {
|
|
|
136
185
|
this.circuitBreaker.isOpen = false;
|
|
137
186
|
} catch (error) {
|
|
138
187
|
this.handleCircuitBreaker();
|
|
139
|
-
throw
|
|
188
|
+
throw this.toPathaoApiError(error, "Authentication failed");
|
|
140
189
|
}
|
|
141
190
|
}
|
|
142
191
|
async refreshAccessToken() {
|
|
@@ -144,12 +193,15 @@ var PathaoApiService = class {
|
|
|
144
193
|
throw new Error("No refresh token available");
|
|
145
194
|
}
|
|
146
195
|
try {
|
|
147
|
-
const response = await this.pathaoClient.post(
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
196
|
+
const response = await this.pathaoClient.post(
|
|
197
|
+
"/aladdin/api/v1/issue-token",
|
|
198
|
+
{
|
|
199
|
+
client_id: this.config.clientId,
|
|
200
|
+
client_secret: this.config.clientSecret,
|
|
201
|
+
refresh_token: this.refreshToken,
|
|
202
|
+
grant_type: "refresh_token"
|
|
203
|
+
}
|
|
204
|
+
);
|
|
153
205
|
this.accessToken = response.data.access_token;
|
|
154
206
|
this.refreshToken = response.data.refresh_token;
|
|
155
207
|
this.tokenExpiry = Date.now() + response.data.expires_in * 1e3 - 6e4;
|
|
@@ -157,7 +209,7 @@ var PathaoApiService = class {
|
|
|
157
209
|
this.circuitBreaker.isOpen = false;
|
|
158
210
|
} catch (error) {
|
|
159
211
|
this.handleCircuitBreaker();
|
|
160
|
-
throw
|
|
212
|
+
throw this.toPathaoApiError(error, "Token refresh failed");
|
|
161
213
|
}
|
|
162
214
|
}
|
|
163
215
|
getErrorMessage(error) {
|
|
@@ -170,6 +222,28 @@ var PathaoApiService = class {
|
|
|
170
222
|
}
|
|
171
223
|
return error.message || "Unknown error";
|
|
172
224
|
}
|
|
225
|
+
toPathaoApiError(error, context) {
|
|
226
|
+
if (error instanceof PathaoApiError) {
|
|
227
|
+
return error;
|
|
228
|
+
}
|
|
229
|
+
const messageFallback = this.getErrorMessage(error);
|
|
230
|
+
const axiosLike = error instanceof AxiosError ? error : typeof error === "object" && error && "response" in error ? error : null;
|
|
231
|
+
if (axiosLike) {
|
|
232
|
+
const pathaoError = axiosLike.response?.data;
|
|
233
|
+
return new PathaoApiError(
|
|
234
|
+
`${context}: ${pathaoError?.message || messageFallback}`,
|
|
235
|
+
{
|
|
236
|
+
status: axiosLike.response?.status,
|
|
237
|
+
code: pathaoError?.code ?? axiosLike.response?.status,
|
|
238
|
+
type: pathaoError?.type,
|
|
239
|
+
errors: pathaoError?.errors,
|
|
240
|
+
validation: pathaoError?.validation,
|
|
241
|
+
responseData: pathaoError ?? axiosLike.response?.data
|
|
242
|
+
}
|
|
243
|
+
);
|
|
244
|
+
}
|
|
245
|
+
return new PathaoApiError(`${context}: ${messageFallback}`);
|
|
246
|
+
}
|
|
173
247
|
handleCircuitBreaker() {
|
|
174
248
|
this.circuitBreaker.failures++;
|
|
175
249
|
this.circuitBreaker.lastFailureTime = Date.now();
|
|
@@ -180,81 +254,92 @@ var PathaoApiService = class {
|
|
|
180
254
|
// Official Pathao API: Create Order
|
|
181
255
|
async createOrder(orderData) {
|
|
182
256
|
try {
|
|
183
|
-
const response = await this.pathaoClient.post(
|
|
257
|
+
const response = await this.pathaoClient.post(
|
|
258
|
+
"/aladdin/api/v1/orders",
|
|
259
|
+
orderData
|
|
260
|
+
);
|
|
184
261
|
return response.data;
|
|
185
262
|
} catch (error) {
|
|
186
|
-
|
|
187
|
-
throw new Error(`Failed to create Pathao order: ${errorMessage}`);
|
|
263
|
+
throw this.toPathaoApiError(error, "Failed to create Pathao order");
|
|
188
264
|
}
|
|
189
265
|
}
|
|
190
266
|
// Official Pathao API: Create Store
|
|
191
267
|
async createStore(storeData) {
|
|
192
268
|
try {
|
|
193
|
-
const response = await this.pathaoClient.post(
|
|
269
|
+
const response = await this.pathaoClient.post(
|
|
270
|
+
"/aladdin/api/v1/stores",
|
|
271
|
+
storeData
|
|
272
|
+
);
|
|
194
273
|
return response.data;
|
|
195
274
|
} catch (error) {
|
|
196
|
-
|
|
197
|
-
throw new Error(`Failed to create Pathao store: ${errorMessage}`);
|
|
275
|
+
throw this.toPathaoApiError(error, "Failed to create Pathao store");
|
|
198
276
|
}
|
|
199
277
|
}
|
|
200
278
|
// Official Pathao API: Get Store List
|
|
201
279
|
async getStores() {
|
|
202
280
|
try {
|
|
203
|
-
const response = await this.pathaoClient.get(
|
|
281
|
+
const response = await this.pathaoClient.get(
|
|
282
|
+
"/aladdin/api/v1/stores"
|
|
283
|
+
);
|
|
204
284
|
return response.data;
|
|
205
285
|
} catch (error) {
|
|
206
|
-
|
|
207
|
-
throw new Error(`Failed to fetch Pathao stores: ${errorMessage}`);
|
|
286
|
+
throw this.toPathaoApiError(error, "Failed to fetch Pathao stores");
|
|
208
287
|
}
|
|
209
288
|
}
|
|
210
289
|
// Official Pathao API: Calculate Price
|
|
211
290
|
async calculatePrice(priceData) {
|
|
212
291
|
try {
|
|
213
|
-
const response = await this.pathaoClient.post(
|
|
292
|
+
const response = await this.pathaoClient.post(
|
|
293
|
+
"/aladdin/api/v1/merchant/price-plan",
|
|
294
|
+
priceData
|
|
295
|
+
);
|
|
214
296
|
return response.data;
|
|
215
297
|
} catch (error) {
|
|
216
|
-
|
|
217
|
-
throw new Error(`Failed to calculate Pathao price: ${errorMessage}`);
|
|
298
|
+
throw this.toPathaoApiError(error, "Failed to calculate Pathao price");
|
|
218
299
|
}
|
|
219
300
|
}
|
|
220
301
|
// Official Pathao API: Get Cities
|
|
221
302
|
async getCities() {
|
|
222
303
|
try {
|
|
223
|
-
const response = await this.pathaoClient.get(
|
|
304
|
+
const response = await this.pathaoClient.get(
|
|
305
|
+
"/aladdin/api/v1/city-list"
|
|
306
|
+
);
|
|
224
307
|
return response.data;
|
|
225
308
|
} catch (error) {
|
|
226
|
-
|
|
227
|
-
throw new Error(`Failed to fetch Pathao cities: ${errorMessage}`);
|
|
309
|
+
throw this.toPathaoApiError(error, "Failed to fetch Pathao cities");
|
|
228
310
|
}
|
|
229
311
|
}
|
|
230
312
|
// Official Pathao API: Get Zones for a City
|
|
231
313
|
async getZones(cityId) {
|
|
232
314
|
try {
|
|
233
|
-
const response = await this.pathaoClient.get(
|
|
315
|
+
const response = await this.pathaoClient.get(
|
|
316
|
+
`/aladdin/api/v1/cities/${cityId}/zone-list`
|
|
317
|
+
);
|
|
234
318
|
return response.data;
|
|
235
319
|
} catch (error) {
|
|
236
|
-
|
|
237
|
-
throw new Error(`Failed to fetch Pathao zones: ${errorMessage}`);
|
|
320
|
+
throw this.toPathaoApiError(error, "Failed to fetch Pathao zones");
|
|
238
321
|
}
|
|
239
322
|
}
|
|
240
323
|
// Official Pathao API: Get Areas for a Zone
|
|
241
324
|
async getAreas(zoneId) {
|
|
242
325
|
try {
|
|
243
|
-
const response = await this.pathaoClient.get(
|
|
326
|
+
const response = await this.pathaoClient.get(
|
|
327
|
+
`/aladdin/api/v1/zones/${zoneId}/area-list`
|
|
328
|
+
);
|
|
244
329
|
return response.data;
|
|
245
330
|
} catch (error) {
|
|
246
|
-
|
|
247
|
-
throw new Error(`Failed to fetch Pathao areas: ${errorMessage}`);
|
|
331
|
+
throw this.toPathaoApiError(error, "Failed to fetch Pathao areas");
|
|
248
332
|
}
|
|
249
333
|
}
|
|
250
334
|
// Official Pathao API: Get Order Status
|
|
251
335
|
async getOrderStatus(consignmentId) {
|
|
252
336
|
try {
|
|
253
|
-
const response = await this.pathaoClient.get(
|
|
337
|
+
const response = await this.pathaoClient.get(
|
|
338
|
+
`/aladdin/api/v1/orders/${consignmentId}/info`
|
|
339
|
+
);
|
|
254
340
|
return response.data;
|
|
255
341
|
} catch (error) {
|
|
256
|
-
|
|
257
|
-
throw new Error(`Failed to fetch Pathao order status: ${errorMessage}`);
|
|
342
|
+
throw this.toPathaoApiError(error, "Failed to fetch Pathao order status");
|
|
258
343
|
}
|
|
259
344
|
}
|
|
260
345
|
// Official Pathao API: Create Bulk Order
|
|
@@ -263,8 +348,7 @@ var PathaoApiService = class {
|
|
|
263
348
|
const response = await this.pathaoClient.post("/aladdin/api/v1/orders/bulk", { orders });
|
|
264
349
|
return response.data;
|
|
265
350
|
} catch (error) {
|
|
266
|
-
|
|
267
|
-
throw new Error(`Failed to create bulk Pathao orders: ${errorMessage}`);
|
|
351
|
+
throw this.toPathaoApiError(error, "Failed to create bulk Pathao orders");
|
|
268
352
|
}
|
|
269
353
|
}
|
|
270
354
|
// Helper method to validate phone number
|
|
@@ -278,7 +362,9 @@ var PathaoApiService = class {
|
|
|
278
362
|
if (cleanPhone.length === 11 && cleanPhone.startsWith("01")) {
|
|
279
363
|
return cleanPhone;
|
|
280
364
|
}
|
|
281
|
-
throw new Error(
|
|
365
|
+
throw new Error(
|
|
366
|
+
"Invalid phone number format. Must be 11 digits starting with 01"
|
|
367
|
+
);
|
|
282
368
|
}
|
|
283
369
|
// Helper method to validate address
|
|
284
370
|
static validateAddress(address) {
|
|
@@ -322,13 +408,24 @@ var PathaoApiService = class {
|
|
|
322
408
|
this.isAuthenticating = false;
|
|
323
409
|
this.authPromise = null;
|
|
324
410
|
this.requestQueue = [];
|
|
325
|
-
this.circuitBreaker =
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
411
|
+
this.circuitBreaker.failures = 0;
|
|
412
|
+
this.circuitBreaker.isOpen = false;
|
|
413
|
+
this.circuitBreaker.lastFailureTime = 0;
|
|
414
|
+
}
|
|
415
|
+
// Static factory method to create instance from environment variables
|
|
416
|
+
static fromEnv(options) {
|
|
417
|
+
const config = {
|
|
418
|
+
clientId: "",
|
|
419
|
+
clientSecret: "",
|
|
420
|
+
username: "",
|
|
421
|
+
password: "",
|
|
422
|
+
baseURL: ""
|
|
331
423
|
};
|
|
424
|
+
return new _PathaoApiService(config, options);
|
|
425
|
+
}
|
|
426
|
+
// Static factory method to create instance from configuration object
|
|
427
|
+
static fromConfig(config, options) {
|
|
428
|
+
return new _PathaoApiService(config, options);
|
|
332
429
|
}
|
|
333
430
|
};
|
|
334
431
|
|
|
@@ -344,6 +441,6 @@ var ItemType = /* @__PURE__ */ ((ItemType2) => {
|
|
|
344
441
|
return ItemType2;
|
|
345
442
|
})(ItemType || {});
|
|
346
443
|
|
|
347
|
-
export { DeliveryType, ItemType, PathaoApiService };
|
|
444
|
+
export { DeliveryType, ItemType, PathaoApiError, PathaoApiService };
|
|
348
445
|
//# sourceMappingURL=index.mjs.map
|
|
349
446
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/pathao-api.ts","../src/types.ts"],"names":["config","DeliveryType","ItemType"],"mappings":"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","file":"index.mjs","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 PathaoStoreCreateResponse,\n PathaoStoreListResponse,\n PathaoStoreRequest,\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();\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();\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();\n throw new Error(`Token refresh failed: ${this.getErrorMessage(error)}`);\n }\n }\n\n private getErrorMessage(error: unknown): 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 as Error).message || 'Unknown error';\n }\n\n private handleCircuitBreaker(): 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: unknown) {\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<PathaoStoreCreateResponse> {\n try {\n const response = await this.pathaoClient.post<PathaoStoreCreateResponse>('/aladdin/api/v1/stores', storeData);\n return response.data;\n } catch (error: unknown) {\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<PathaoStoreListResponse> {\n try {\n const response = await this.pathaoClient.get<PathaoStoreListResponse>('/aladdin/api/v1/stores');\n return response.data;\n } catch (error: unknown) {\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: unknown) {\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: unknown) {\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: unknown) {\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: unknown) {\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: unknown) {\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(\n orders: PathaoOrderRequest[],\n ): Promise<{ message: string; type: string; code: number; data: boolean }> {\n try {\n const response = await this.pathaoClient.post<{\n message: string;\n type: string;\n code: number;\n data: boolean;\n }>('/aladdin/api/v1/orders/bulk', { orders });\n return response.data;\n } catch (error: unknown) {\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 Creation Response\nexport interface PathaoStoreCreateResponse {\n type: string;\n code: number;\n message: string;\n data: {\n store_name: string; // Only store_name returned on creation\n };\n}\n\n// Official Pathao Store List Item (from GET /stores)\nexport interface PathaoStore {\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// Official Pathao Store List Response\nexport interface PathaoStoreListResponse {\n type: string;\n code: number;\n message: string;\n data: {\n data: PathaoStore[];\n total: number;\n current_page: number;\n per_page: number;\n total_in_page: number;\n last_page: number;\n path: string;\n to: number;\n from: number;\n last_page_url: string;\n first_page_url: 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}\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"]}
|
|
1
|
+
{"version":3,"sources":["../src/pathao-api.ts","../src/types.ts"],"names":["config","DeliveryType","ItemType"],"mappings":"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","file":"index.mjs","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 PathaoStoreCreateResponse,\n PathaoStoreListResponse,\n PathaoStoreRequest,\n PathaoZoneResponse,\n} from './types';\n\nexport class PathaoApiError extends Error {\n status: number | undefined;\n code: number | undefined;\n type: string | undefined;\n errors: Record<string, string[]> | undefined;\n validation: Record<string, string[]> | undefined;\n responseData: unknown;\n\n constructor(\n message: string,\n options: {\n status?: number | undefined;\n code?: number | undefined;\n type?: string | undefined;\n errors?: Record<string, string[]> | undefined;\n validation?: Record<string, string[]> | undefined;\n responseData?: unknown;\n } = {},\n ) {\n super(message);\n this.name = 'PathaoApiError';\n this.status = options.status;\n this.code = options.code;\n this.type = options.type;\n this.errors = options.errors;\n this.validation = options.validation;\n this.responseData = options.responseData;\n }\n}\n\n// Internal resolved config with guaranteed timeout\ninterface ResolvedPathaoConfig extends PathaoConfig {\n timeout: number;\n}\n\n// Circuit breaker configuration\ninterface CircuitBreakerConfig {\n threshold?: number; // Default: 5\n timeout?: number; // Default: 60000ms\n}\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: ResolvedPathaoConfig;\n private isAuthenticating: boolean = false;\n private authPromise: Promise<void> | null = null;\n private requestQueue: Array<{\n resolve: () => void;\n reject: (error: Error) => void;\n }> = [];\n private hasValidated: boolean = false;\n private debug: boolean = false;\n private circuitBreaker: {\n failures: number;\n lastFailureTime: number;\n threshold: number;\n timeout: number;\n isOpen: boolean;\n };\n\n constructor(config: PathaoConfig, options?: { debug?: boolean; circuitBreaker?: CircuitBreakerConfig }) {\n const timeout: number =\n config.timeout || parseInt(process.env.PATHAO_TIMEOUT || '30000', 10);\n\n this.config = {\n baseURL: config.baseURL || process.env.PATHAO_BASE_URL || '',\n timeout,\n clientId: config.clientId || process.env.PATHAO_CLIENT_ID || '',\n clientSecret:\n 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.debug = options?.debug || false;\n this.circuitBreaker = {\n failures: 0,\n lastFailureTime: 0,\n threshold: options?.circuitBreaker?.threshold ?? 5,\n timeout: options?.circuitBreaker?.timeout ?? 60000,\n isOpen: false,\n };\n\n this.pathaoClient = axios.create({\n baseURL: this.config.baseURL,\n timeout: this.config.timeout,\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\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 // Validate configuration on first API call\n this.validateConfiguration();\n await this.ensureAuthenticated();\n if (this.accessToken) {\n config.headers.Authorization = `Bearer ${this.accessToken}`;\n }\n\n if (this.debug) {\n console.log(`[Pathao SDK] ${config.method?.toUpperCase()} ${config.url}`, {\n headers: config.headers,\n data: config.data,\n });\n }\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\n if (this.debug) {\n console.log(`[Pathao SDK] Response ${response.status}`, {\n url: response.config.url,\n data: response.data,\n });\n }\n\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();\n return Promise.reject(error);\n }\n );\n }\n\n private validateConfiguration(): void {\n // Only validate once\n if (this.hasValidated) {\n return;\n }\n\n if (!this.config.baseURL) {\n throw this.toPathaoApiError(\n new Error(\n \"Pathao API baseURL is required. You can provide it via constructor config or PATHAO_BASE_URL environment variable\"\n ),\n \"Configuration validation failed\"\n );\n }\n\n if (\n !this.config.clientId ||\n !this.config.clientSecret ||\n !this.config.username ||\n !this.config.password\n ) {\n throw this.toPathaoApiError(\n new Error(\n \"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 \"Configuration validation failed\"\n );\n }\n\n this.hasValidated = true;\n }\n\n private async ensureAuthenticated(): Promise<void> {\n // Check circuit breaker\n if (this.circuitBreaker.isOpen) {\n if (\n Date.now() - this.circuitBreaker.lastFailureTime >\n this.circuitBreaker.timeout\n ) {\n this.circuitBreaker.isOpen = false;\n this.circuitBreaker.failures = 0;\n } else {\n throw new Error(\n \"Circuit breaker is open. Too many authentication failures.\"\n );\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>(\n \"/aladdin/api/v1/issue-token\",\n {\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\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();\n throw this.toPathaoApiError(error, \"Authentication failed\");\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>(\n \"/aladdin/api/v1/issue-token\",\n {\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\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();\n throw this.toPathaoApiError(error, \"Token refresh failed\");\n }\n }\n\n private getErrorMessage(error: unknown): 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 as Error).message || \"Unknown error\";\n }\n\n private toPathaoApiError(error: unknown, context: string): PathaoApiError {\n if (error instanceof PathaoApiError) {\n return error;\n }\n\n const messageFallback = this.getErrorMessage(error);\n const axiosLike =\n error instanceof AxiosError\n ? error\n : typeof error === \"object\" && error && \"response\" in (error as any)\n ? (error as AxiosError)\n : null;\n if (axiosLike) {\n const pathaoError = axiosLike.response?.data as PathaoError | undefined;\n return new PathaoApiError(\n `${context}: ${pathaoError?.message || messageFallback}`,\n {\n status: axiosLike.response?.status,\n code: pathaoError?.code ?? axiosLike.response?.status,\n type: pathaoError?.type,\n errors: pathaoError?.errors,\n validation: pathaoError?.validation,\n responseData: pathaoError ?? axiosLike.response?.data,\n }\n );\n }\n\n return new PathaoApiError(`${context}: ${messageFallback}`);\n }\n\n private handleCircuitBreaker(): 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(\n orderData: PathaoOrderRequest\n ): Promise<PathaoOrderResponse> {\n try {\n const response = await this.pathaoClient.post<PathaoOrderResponse>(\n \"/aladdin/api/v1/orders\",\n orderData\n );\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, \"Failed to create Pathao order\");\n }\n }\n\n // Official Pathao API: Create Store\n async createStore(\n storeData: PathaoStoreRequest\n ): Promise<PathaoStoreCreateResponse> {\n try {\n const response = await this.pathaoClient.post<PathaoStoreCreateResponse>(\n \"/aladdin/api/v1/stores\",\n storeData\n );\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, \"Failed to create Pathao store\");\n }\n }\n\n // Official Pathao API: Get Store List\n async getStores(): Promise<PathaoStoreListResponse> {\n try {\n const response = await this.pathaoClient.get<PathaoStoreListResponse>(\n \"/aladdin/api/v1/stores\"\n );\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, \"Failed to fetch Pathao stores\");\n }\n }\n\n // Official Pathao API: Calculate Price\n async calculatePrice(\n priceData: PathaoPriceRequest\n ): Promise<PathaoPriceResponse> {\n try {\n const response = await this.pathaoClient.post<PathaoPriceResponse>(\n \"/aladdin/api/v1/merchant/price-plan\",\n priceData\n );\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, \"Failed to calculate Pathao price\");\n }\n }\n\n // Official Pathao API: Get Cities\n async getCities(): Promise<PathaoCityResponse> {\n try {\n const response = await this.pathaoClient.get<PathaoCityResponse>(\n \"/aladdin/api/v1/city-list\"\n );\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, \"Failed to fetch Pathao cities\");\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>(\n `/aladdin/api/v1/cities/${cityId}/zone-list`\n );\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, \"Failed to fetch Pathao zones\");\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>(\n `/aladdin/api/v1/zones/${zoneId}/area-list`\n );\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, \"Failed to fetch Pathao areas\");\n }\n }\n\n // Official Pathao API: Get Order Status\n async getOrderStatus(\n consignmentId: string\n ): Promise<PathaoOrderStatusResponse> {\n try {\n const response = await this.pathaoClient.get<PathaoOrderStatusResponse>(\n `/aladdin/api/v1/orders/${consignmentId}/info`\n );\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, \"Failed to fetch Pathao order status\");\n }\n }\n\n // Official Pathao API: Create Bulk Order\n async createBulkOrder(\n orders: PathaoOrderRequest[]\n ): Promise<{ message: string; type: string; code: number; data: boolean }> {\n try {\n const response = await this.pathaoClient.post<{\n message: string;\n type: string;\n code: number;\n data: boolean;\n }>(\"/aladdin/api/v1/orders/bulk\", { orders });\n return response.data;\n } catch (error: unknown) {\n throw this.toPathaoApiError(error, \"Failed to create bulk Pathao orders\");\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(\n \"Invalid phone number format. Must be 11 digits starting with 01\"\n );\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.failures = 0;\n this.circuitBreaker.isOpen = false;\n this.circuitBreaker.lastFailureTime = 0;\n }\n\n // Static factory method to create instance from environment variables\n static fromEnv(options?: { debug?: boolean; circuitBreaker?: CircuitBreakerConfig }): PathaoApiService {\n const config: PathaoConfig = {\n clientId: \"\",\n clientSecret: \"\",\n username: \"\",\n password: \"\",\n baseURL: \"\",\n };\n return new PathaoApiService(config, options);\n }\n\n // Static factory method to create instance from configuration object\n static fromConfig(config: PathaoConfig, options?: { debug?: boolean; circuitBreaker?: CircuitBreakerConfig }): PathaoApiService {\n return new PathaoApiService(config, options);\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 Creation Response\nexport interface PathaoStoreCreateResponse {\n type: string;\n code: number;\n message: string;\n data: {\n store_name: string; // Only store_name returned on creation\n };\n}\n\n// Official Pathao Store List Item (from GET /stores)\nexport interface PathaoStore {\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// Official Pathao Store List Response\nexport interface PathaoStoreListResponse {\n type: string;\n code: number;\n message: string;\n data: {\n data: PathaoStore[];\n total: number;\n current_page: number;\n per_page: number;\n total_in_page: number;\n last_page: number;\n path: string;\n to: number;\n from: number;\n last_page_url: string;\n first_page_url: 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}\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; // Optional - defaults to 30000 if not provided\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"]}
|