· 5 years ago · Jul 21, 2020, 11:04 PM
1/**
2 * @sendle
3 * Uses sendle API to create orders and get quotes.
4 * [credentials] = { api_key: "2i213n12ina", sendle_id: "test"}
5 * [command] = get_quote, create_order, track_order
6 */
7
8const axios = require('axios');
9
10console.log(process.argv.length);
11
12if (process.argv.length == 2) {
13 console.log("Usage: node sendle.js [command] [API Key] [JSONofData]");
14 process.exit(1);
15} else if (process.argv.length < 5) {
16 console.log("Too few arguments. Usage: node sendle.js [command] [credentials] [JSONofData]");
17 process.exit(1);
18} else if (process.argv.length > 5) {
19 console.log("Too many arguments. Usage: node sendle.js [command] [credentials] [JSONofData]");
20 process.exit(1);
21}
22
23const command = process.argv[2];
24const apiKey = process.argv[3];
25const credentials = JSON.parse(process.argv[3]);
26let data = process.argv[4];
27
28try {
29 if(JSON.parse(data)) data = JSON.parse(data);
30} catch (error) {
31 console.log(error);
32 console.log("Error reading the JSON input. Input JSON data must be in valid serialized JSON format");
33 process.exit(1);
34}
35
36// define base url
37const url = "https://test-api.yello.delivery/v1/";
38
39const choice = {
40
41 // Input { "pickup_suburb": "", "pickup_postcode": "", "delivery_suburb": ""}
42 // '{"postcode":"2000", "suburb":"", "state":"", "weight":"", "qty":"1"}'
43 // Output
44 // {[
45 // {type: "standard", price: "20.85", : days: "", eta: "12/08/2019", window: ""}
46 // {type: "express", price: "24.85", days: "4", eta: "", window: ""}
47 // {type: "express", price: "62.85", days: "", eta: "", window: "7pm to 10pm"}
48 // ]}
49 "get_quote": async data => {
50
51 console.log('Getting quotes');
52
53 const quoteData = {
54 'pickupAddress': {
55 'postcode': data.pickup_postcode,
56 'suburb': data.pickup_suburb,
57 'state': data.pickup_state,
58 'addressText': data.pickupAddress
59 },
60 'deliveryAddress': {
61 'postcode': data.delivery_postcode,
62 'suburb': data.delivery_suburb,
63 'state': data.delivery_state,
64 'addressText': data.deliveryAddress
65 },
66 'parcels': [
67 {
68 'qty': data.qty,
69 'length': data.length,
70 'width': data.width,
71 'depth': data.depth || 0,
72 'weight': data.weight || 0,
73 'name': data.parcel_name,
74 'brand': data.parcel_brand,
75 'barcodeHash': data.barcodeHash,
76 'category': data.parcelCategory,
77 'price': data.price,
78 'description': data.description,
79 'handlingFee': data.handlingFee,
80 'largeFreightFee': data.largeFreightFee
81 }
82 ],
83 'storeReference': data.storeReference,
84 'storeCustomReference': data.storeCustomReference,
85 'pickupAt': data.pickupAt
86 }
87
88 // Define variable for returning JSON
89 let quoteReturn;
90 let response = [];
91
92
93 try {
94 quoteReturn = await axios.get(`${url}/stores`, {
95 headers: {
96 "Content-Type": "application/json",
97 "secret_key": "secret_key:sec_live_xxxxxxxxxxxxxxxxxxxx"
98 },
99 data: JSON.stringify(quoteData)
100 })
101
102 // Restructure object and return
103
104 quoteReturn.data.forEach(r => {
105 response.push(r);
106 })
107
108 console.log(response);
109
110 return response;
111
112 } catch (error) {
113 const errorData = error.response.data.messages
114 console.log("Error: ", error.response.data.messages);
115
116 return errorHandler;
117 }
118
119 },
120 "create_order": async data => {
121 // Accepts JSON as follows:
122 // '{ "pickup_date": "2020/07/30", "description": "test", "description": "76 Myrtle Creek Avenue",
123 // "first_mile_option": "drop_off" || "pickup"
124 // "weight": "1", "volume"; "0.01"
125 // "sender": { "name": "", "phone": "", "company": "", "address": "", "suburb": "", "state": "", "postcode": "", "country": "", "instructions": ""}
126 // "receiver": { "name": "", "phone": "", "company": "", "address": "", "suburb": "", "state": "", "postcode": "", "country": "", "instructions": ""}
127
128 console.log("Creating order...");
129
130 const orderData = {
131 'storeReference': data.storeReference,
132 'orderReference': data.orderReference,
133 'pickupStoreName': data.pickupStoreName,
134 'pickupAddress': {
135 'addressText': data.pickupAddress,
136 'latitude': data.pickup_lat,
137 'longitude': data.pickup_long
138 },
139 'deliveryAddress': {
140 'addressText': data.deliveryAddress,
141 'latitude': data.delivery_lat,
142 'longitude': data.delivery_long
143 },
144 'customerName': data.customer_name,
145 'customerPhone': data.customer_phone,
146 'deliverAt': data.deliver_at,
147 'pickupAt': data.pickup_at,
148 'instructions': data.instructions,
149 'paymentMethod': data.payment_method,
150 'orderValue': data.order_value,
151 'description': data.descritpion,
152 'verificationsChecklist': {
153 'proofOfPhoto': data.proof_of_photo,
154 'recipientSignature': data.recipient_signature,
155 'proofOfAge': data.proof_of_age
156 },
157 'parcels': [
158 {
159 'qty': data.qty,
160 'length': data.length,
161 'width': data.width,
162 'depth': data.depth,
163 'weight': data.weight,
164 'name': data.parcel_name,
165 'brand': data.parcel_brand,
166 'barcodeHash': data.barcode_hash,
167 'category': data.parcel_category,
168 'price': data.price,
169 'description': data.parcel_desc,
170 'handlingFee': data.handling_fee,
171 'largeFreightFee': data.large_freight_fee
172 }
173 ]
174 }
175
176 // Define variable for returning JSON
177 let orderReturn;
178
179 try {
180 orderReturn = await axios.post(`${url}/orders`, {
181 headers: {
182 "Content-Type": "application/json",
183 'secret_key': 'sec_live_xxxxxxxxxxxxxxxxxxxx'
184 },
185 data: JSON.stringify(orderData)
186 })
187
188 console.log(orderReturn.data);
189
190 return orderReturn.data;
191
192 } catch (error) {
193 console.log(JSON.stringify(error.response.data));
194
195 return JSON.stringify(error.response.data);
196 }
197
198 },
199 "track_order": async data => {
200
201 // Input
202 // '{ order_id: "S3ND73" }'
203 // Output
204 // { state: "Delivered", "tracking_events:
205 // [ { "event_type": "Pickup", "description": "Parcel picked up"}, {
206 // { "event_type": "Pickup", "description": "Parcel picked up"}
207 // } ]
208 // "}
209
210 console.log('Getting track order...');
211
212 const order = data.order_id;
213
214 try {
215 const trackingData = await axios.get(`${url}/orders/${order}/track`, {
216 headers: {
217 "Content-Type": "application/json",
218 'secret_key': 'sec_live_xxxxxxxxxxxxxxxxxxxx'
219 }
220 })
221
222 if(trackingData) {
223 console.log(JSON.stringify(trackingData));
224 }
225 } catch (error) {
226 console.log(JSON.stringify(error));
227
228 }
229
230 },
231}
232
233if (command in choice) {
234 choice[command](data);
235}
236else {
237 choice['default']();
238}