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/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: "https://api-hermes.pathao.com",
17
- timeout: 3e4,
18
- ...config
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 || "https://api-hermes.pathao.com",
22
- timeout: this.config.timeout || 3e4,
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
- console.warn("Token refresh failed, attempting fresh authentication");
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
- console.log("Pathao authentication successful");
141
+ this.circuitBreaker.failures = 0;
142
+ this.circuitBreaker.isOpen = false;
66
143
  } catch (error) {
67
- console.error("Pathao authentication failed:", error);
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
- console.log("Pathao token refresh successful");
162
+ this.circuitBreaker.failures = 0;
163
+ this.circuitBreaker.isOpen = false;
86
164
  } catch (error) {
87
- console.error("Pathao token refresh failed:", error);
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.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
- console.log("Calculating Pathao price:", {
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/cities");
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 Areas
213
- async getAreas() {
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("/aladdin/api/v1/areas");
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"]}