routexpress-bd
Version:
A TypeScript/JavaScript library for integrating Steadfast Pathao REDX delivery services
253 lines (252 loc) • 8.9 kB
JavaScript
class Steadfast {
constructor(config) {
this.config = config;
this.baseUrl = "https://portal.steadfast.com.bd/api/v1";
}
validator(orderData) {
if (!orderData.order_details.recipient_phone ||
orderData.order_details.recipient_phone.length !== 11) {
return {
status: 500,
errors: "Customer phone number must be exactly 11 digits",
};
}
if (!orderData.order_details.recipient_name ||
orderData.order_details.recipient_name.length > 100) {
return {
status: 500,
errors: "Recipient name cannot be greater than 100 characters",
};
}
if (!orderData.order_details.recipient_address ||
orderData.order_details.recipient_address.length > 250) {
return {
status: 500,
errors: "Recipient address cannot be greater than 250 characters",
};
}
if (!orderData.order_details.cod_amount ||
orderData.order_details.cod_amount < 0) {
return {
status: 500,
errors: "Cash on delivery amount cannot be less than 0",
};
}
return null;
}
async createOrder(orderData) {
try {
const validationResult = this.validator(orderData);
if (validationResult) {
return {
status: validationResult.status,
message: validationResult.errors,
};
}
const response = await fetch(`${this.baseUrl}/create_order`, {
method: "POST",
headers: {
"Api-Key": this.config.apiKey,
"Secret-Key": this.config.apiSecret,
"Content-Type": "application/json",
},
body: JSON.stringify(orderData.order_details),
});
const data = await response.json();
if (!response.ok) {
return {
status: response.status,
message: data?.message || response.statusText,
};
}
return data;
}
catch (error) {
return {
status: 500,
message: error?.message || "An unexpected error occurred",
};
}
}
async createBulkOrder(bulkOrder) {
try {
if (!bulkOrder || !bulkOrder.orders) {
throw new Error("Bulk order data with orders array is required.");
}
const { orders } = bulkOrder;
if (!Array.isArray(orders)) {
throw new Error("Orders must be an array.");
}
if (orders.length === 0) {
throw new Error("Orders array cannot be empty.");
}
if (orders.length > 500) {
throw new Error("Cannot exceed 500 orders in a bulk request.");
}
// Validate each order in the bulk request
for (const order of orders) {
const validationResult = this.validator({
order_details: {
invoice: order.invoice,
recipient_name: order.recipient_name,
recipient_phone: order.recipient_phone,
recipient_address: order.recipient_address,
cod_amount: Number(order.cod_amount),
note: order.note,
},
});
if (validationResult) {
return {
status: validationResult.status,
message: validationResult.errors,
};
}
}
// Transform orders to match API expected format
const formattedOrders = orders.map((order) => ({
invoice: order.invoice,
recipient_name: order.recipient_name,
recipient_phone: order.recipient_phone,
recipient_address: order.recipient_address,
cod_amount: order.cod_amount,
note: order.note || null,
}));
const requestPayload = {
data: JSON.stringify(formattedOrders),
};
const response = await fetch(`${this.baseUrl}/create_order/bulk-order`, {
method: "POST",
headers: {
"Api-Key": this.config.apiKey,
"Secret-Key": this.config.apiSecret,
"Content-Type": "application/json",
},
body: JSON.stringify(requestPayload),
});
const data = await response.json();
if (!response.ok) {
return {
status: response.status,
message: data?.message || response.statusText,
};
}
return data;
}
catch (error) {
return {
status: 500,
message: error?.message || "An unexpected error occurred",
};
}
}
async getStatusByCid(cid) {
try {
if (!cid) {
throw new Error("CID is required to get order status.");
}
const response = await fetch(`${this.baseUrl}/status_by_cid/${cid}`, {
method: "GET",
headers: {
"Api-Key": this.config.apiKey,
"Secret-Key": this.config.apiSecret,
},
});
const data = await response.json();
if (!response.ok) {
return {
status: response.status,
message: data?.message || response.statusText,
};
}
return data;
}
catch (error) {
return {
status: 500,
message: error?.message || "An unexpected error occurred",
};
}
}
async getStatusByInvoice(invoice) {
try {
if (!invoice) {
throw new Error("Invoice is required to get order status.");
}
const response = await fetch(`${this.baseUrl}/status_by_invoice/${invoice}`, {
method: "GET",
headers: {
"Api-Key": this.config.apiKey,
"Secret-Key": this.config.apiSecret,
},
});
const data = await response.json();
if (!response.ok) {
return {
status: response.status,
message: data?.message || response.statusText,
};
}
return data;
}
catch (error) {
return {
status: 500,
message: error?.message || "An unexpected error occurred",
};
}
}
async statusBytrackingcode(trackingcode) {
try {
if (!trackingcode) {
throw new Error("Tracking code is required to get order status.");
}
const response = await fetch(`${this.baseUrl}/status_by_trackingcode/${trackingcode}`, {
method: "GET",
headers: {
"Api-Key": this.config.apiKey,
"Secret-Key": this.config.apiSecret,
},
});
const data = await response.json();
if (!response.ok) {
return {
status: response.status,
message: data?.message || response.statusText,
};
}
return data;
}
catch (error) {
return {
status: 500,
message: error?.message || "An unexpected error occurred",
};
}
}
async getBalance() {
try {
const response = await fetch(`${this.baseUrl}/get_balance`, {
method: "GET",
headers: {
"Api-Key": this.config.apiKey,
"Secret-Key": this.config.apiSecret,
},
});
const data = await response.json();
if (!response.ok) {
return {
status: response.status,
message: data?.message || response.statusText,
};
}
return data;
}
catch (error) {
return {
status: 500,
message: error?.message || "An unexpected error occurred",
};
}
}
}
export { Steadfast };