· 6 years ago · Mar 22, 2020, 09:16 PM
1function(req, res, next) {
2 try {
3 if (req.session && req.session.user && req.session.user.substore_id) {
4 var substore = req.session.user.substore_id
5 var getSubstoreName = {
6 entityName: 'ms.substores',
7 resourceId: substore,
8 command: 'get'
9 }
10 var sellerObj = {
11 distance: Number.MAX_SAFE_INTEGER,
12 sellerId: null
13 };
14 req.msApp.call(getSubstoreName, async function (err, substoreResponse) {
15 if (err) {
16 next();
17 }
18 let index = 0;
19 if (substoreResponse && substoreResponse.data && substoreResponse.data.alias) {
20
21 if (res.data && res.data.shipping_address) {
22 var getAllSeller = {
23 entityName: 'ms.sellers',
24 query:{
25 filters:[
26 { field: 'substore', value: [substoreResponse.data.alias], operator: 'in' }
27 ]
28 }
29 }
30 req.msApp.call('list', getAllSeller, async function (err, resp) {
31 let customerCoordinate = await getCoordinates(res.data.shipping_address);
32 if (resp && resp.data && resp.data.records && resp.data.records.length) {
33 resp.data.records.forEach(async (seller) => {
34 var getSellerData = {
35 entityName: 'ms.sellers',
36 resourceId: seller._id,
37 command: 'get'
38 }
39 let sellerData = await req.msApp.callAsync(getSellerData);
40 index++;
41 if (sellerData && sellerData.data && sellerData.data.metafields && sellerData.data.metafields.lat &&
42 sellerData.data.metafields.long) {
43 let lat = sellerData.data.metafields.lat;
44 let long = sellerData.data.metafields.long;
45 let distance = getDistanceBetweenCoordinate(lat, long, customerCoordinate.lat, customerCoordinate.lng)
46 if (sellerObj.distance > distance) {
47 sellerObj.distance = distance;
48 sellerObj.sellerId = sellerData.data._id;
49 }
50 if (index == resp.data.records.length) {
51 var approveOrder = {
52 entityName: 'ms.orders',
53 data: {
54 order_id: req.data._id.toString(),
55 seller: sellerObj.sellerId.toString(),
56 },
57 command: 'approveOrder'
58 }
59 let appOrder = await req.msApp.callAsync(approveOrder)
60 console.log("Approve Order command", appOrder)
61 next();
62 }
63 }
64 })
65 } else {
66 next();
67 }
68 });
69 next();
70 } else {
71 next();
72 }
73 }else{
74 next();
75 }
76 function getCoordinates(shippingAddress) {
77 return new Promise((resolve, reject) => {
78 var request = require('ms-utils').request();
79 var api_key = 'GOOGLE MAPS API KEY';
80 let apiURL = `https://maps.googleapis.com/maps/api/geocode/json?components=`;
81 let createQueryString = [];
82 if (shippingAddress.address && shippingAddress.address.length) {
83 createQueryString.push(`locality:${shippingAddress.address}`)
84 }
85 if (shippingAddress.city && shippingAddress.city.length) {
86 createQueryString.push(`city:${shippingAddress.city}`)
87 }
88 if (shippingAddress.country && shippingAddress.country.length) {
89 createQueryString.push(`country:${shippingAddress.country}`)
90 }
91
92 if (shippingAddress.state && shippingAddress.state.length) {
93 createQueryString.push(`province:${shippingAddress.state}`)
94 }
95
96 if (shippingAddress.zip && shippingAddress.zip.length) {
97 createQueryString = [`postal_code:${shippingAddress.zip}`]
98 }
99 query_data = createQueryString.join('|')
100 apiURL = apiURL + query_data + `&key=${api_key}`
101 request.get(apiURL, function (err, resp) {
102 if (err) {
103 reject()
104 }
105 try {
106 if (resp && resp.body) {
107 let data = JSON.parse(resp.body).results
108 if (data && data[0].geometry && data[0].geometry.location) {
109 return resolve(data[0].geometry.location)
110 } else {
111 reject();
112 }
113 }
114 } catch (err) {
115 reject()
116 }
117 })
118 })
119 }
120 function getDistanceBetweenCoordinate(lat1, lon1, lat2, lon2) {
121 var R = 6371; // Radius of the earth in km
122 var dLat = deg2rad(lat2 - lat1); // deg2rad below
123 var dLon = deg2rad(lon2 - lon1);
124 var a =
125 Math.sin(dLat / 2) * Math.sin(dLat / 2) +
126 Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) *
127 Math.sin(dLon / 2) * Math.sin(dLon / 2)
128 ;
129 var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
130 var d = R * c; // Distance in km
131 return d;
132 }
133 function deg2rad(deg) {
134 return deg * (Math.PI / 180)
135 }
136 });
137 } else {
138 next();
139 }
140 } catch (e) {
141 console.log("Unexpected Error:", e);
142 next()
143 }
144}