· 6 years ago · Apr 01, 2020, 01:02 PM
1const AWS = require("aws-sdk");
2// const AsyncForEach = require("async-await-foreach");
3const axios = require("axios");
4const { Client } = require("@elastic/elasticsearch");
5const argv = require("minimist")(process.argv.slice(2));
6const chalk = require("chalk");
7
8let staging;
9let storeID;
10
11if (argv.hasOwnProperty("staging") && argv.staging && ["dev", "alpha", "production"].includes(argv["staging"])) {
12 staging = argv["staging"];
13} else {
14 console.log('--staging is missing or given staging argument is not "dev", "alpha" or "production"');
15 return;
16}
17
18// if (
19// argv.hasOwnProperty('storeID') &&
20// argv.storeID
21// ) {
22// storeID = argv['storeID'];
23// } else {
24// console.log('--storeID is missing');
25// }
26
27const ENV = staging; // dev | alpha | production
28const ES_INFO = require(`./auth/${ENV}.json`);
29const ES_INDEX = ES_INFO["index"];
30const ES_CHATBOT_INDEX = ES_INFO["chatbotIndex"];
31const API_HOST = ES_INFO["apiHost"];
32
33// const client = new elasticsearch.Client({
34// host: `https://${ES_INFO['host']}`,
35// httpAuth: `${ES_INFO['user']}:${ES_INFO['pass']}`
36// });
37const client = new Client({
38 node: `https://${ES_INFO["user"]}:${ES_INFO["pass"]}@${ES_INFO["host"]}`
39});
40
41const S3_BUCKET_NAME = "upload.convolab.ai";
42const S3_ID = "AKIA44LJGXK3GYMNSSWU";
43const S3_SECRET = "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";
44
45const s3 = new AWS.S3({
46 accessKeyId: S3_ID,
47 secretAccessKey: S3_SECRET
48});
49
50const sleep = ms => {
51 return new Promise(resolve => setTimeout(resolve, ms));
52};
53
54const getOrder = (storeID, orderStatus) => {
55 return axios
56 .get(`${API_HOST}/order/storeID/${storeID}?status=${orderStatus}`)
57 .then(result => {
58 return result.data;
59 })
60 .catch(error => {
61 console.log("Error while getting order with storeID: " + storeID + " and orderStatus: " + orderStatus + " with error: ", error);
62 });
63};
64const getUserInfo = userPSID => {
65 const options = { index: ES_CHATBOT_INDEX, type: "user", id: userPSID };
66 return client
67 .get(options)
68 .then(result => result.body._source)
69 .catch(error => {
70 console.error("Error while getting user info: ", error.name);
71 return error;
72 });
73};
74
75const sendImage = (currentFilename, newFilename, userID, pageAccessToken) => {
76 const copyObjectParams = {
77 Bucket: `${S3_BUCKET_NAME}/arislab/workpoint/workpoint_x_barbequeplaza/sent`,
78 CopySource: `${S3_BUCKET_NAME}/arislab/workpoint/workpoint_x_barbequeplaza/pending/${currentFilename}`,
79 Key: newFilename,
80 ACL: "public-read"
81 };
82 const deleteObjectParams = {
83 Bucket: `${S3_BUCKET_NAME}/arislab/workpoint/workpoint_x_barbequeplaza/pending`,
84 Key: currentFilename
85 };
86
87 console.log("Sending", currentFilename);
88 const moving = new Promise((resolve, reject) => {
89 s3.copyObject(copyObjectParams, (err, data) => {
90 if (err) {
91 reject(err);
92 } else {
93 resolve(data);
94 }
95 });
96 })
97 .then(res => {
98 console.log(`Copied pending/${currentFilename} to sent/${newFilename}`);
99 // console.log("copy success --->", res);
100 return new Promise((resolve, reject) => {
101 s3.deleteObject(deleteObjectParams, (err, data) => {
102 if (err) {
103 reject(err);
104 } else {
105 resolve(data);
106 }
107 });
108 });
109 })
110 .then(() => {
111 // console.log("delete success");
112 console.log(`Deleted pending/${newFilename}\nMoving completed`); //sendImage ends here. need to do facebook api
113 })
114 .catch(err => {
115 console.log("Error in moving process --->", err.message);
116 });
117
118 return moving.then(() => {
119 const data = {
120 recipient: {
121 id: userID
122 },
123 message: {
124 attachment: {
125 type: "image",
126 payload: {
127 url: `https://upload.convolab.ai/arislab/workpoint/workpoint_x_barbequeplaza/sent/${newFilename}`
128 }
129 }
130 }
131 };
132 console.log("data", JSON.stringify(data));
133 axios({
134 method: "post",
135 url: `https://graph.facebook.com/v6.0/me/messages?access_token=${pageAccessToken}`,
136 data: data
137 })
138 .then(res => {
139 console.log(chalk.green(`Sent ${currentFilename}`));
140 })
141 .catch(err => {
142 console.log(err);
143 });
144 });
145};
146
147checkIfImageWasSent = (orderID, productID) => {
148 var params = {
149 Bucket: `${S3_BUCKET_NAME}/arislab/workpoint/workpoint_x_barbequeplaza/sent`,
150 Key: `${orderID}_${productID}_1.jpg`
151 };
152 return new Promise((resolve, reject) => {
153 s3.getObject(params, function(err, data) {
154 if (err) {
155 reject(err);
156 } else {
157 resolve(data);
158 }
159 });
160 })
161 .then(true)
162 .catch(err => console.log("checkIfImageWasSent: Searching image to send"));
163};
164
165checkIfImageExists = index => {
166 var params = {
167 Bucket: `${S3_BUCKET_NAME}/arislab/workpoint/workpoint_x_barbequeplaza/pending`,
168 Key: `${index}.jpg`
169 };
170 return new Promise((resolve, reject) => {
171 s3.getObject(params, function(err, data) {
172 if (err) {
173 reject(err);
174 } else {
175 resolve(data);
176 }
177 });
178 })
179 .then(true)
180 .catch(err => console.log("checIfImageExists error:", err.message));
181};
182
183const STORE_ID = "347f90d8-2668-42cc-8824-30c17ce66807";
184const PRODUCT_ID = "0289ktb9ewxt";
185
186(async () => {
187 var firstImageIndex = 1;
188 const orders = await getOrder(STORE_ID, "SUCCESS");
189 for (let order of orders) {
190 // console.log('order na ja', order)
191 const userInfo = await getUserInfo(order.userID);
192 // console.log(userInfo.info._channel.config.token)
193 for (let product of order.selectedProduct) {
194 const wasSent = await checkIfImageWasSent(order.orderID, product.productID);
195 if (!wasSent) {
196 if (product.productID === PRODUCT_ID) {
197 for (let i = 1; i <= product.availableQuantity; i++) {
198 for (let j = firstImageIndex; j <= 2000; j++) {
199 //search for the first image of the bucket (assume we have less than 2000 products)
200 const isImageExisting = await checkIfImageExists(j);
201 if (isImageExisting) {
202 console.log(`${j}.jpg found`);
203 let productNumber = 1;
204 for (let k = j; k < j + product.availableQuantity; k++) {
205 //send image to customer from j index
206 await sendImage(
207 `${k}.jpg`,
208 `${order.orderID}_${product.productID}_${productNumber}.jpg`,
209 order.userID,
210 userInfo.info._channel.config.token
211 );
212 productNumber++;
213 }
214 exit = true;
215 firstImageIndex = j + 1;
216 break;
217 } else {
218 console.log(`${j}.jpg not found. Continue to next index...`);
219 }
220 }
221 }
222 break;
223 }
224 } else {
225 console.log(`Order ${order.orderID} has been sent. Continue to next order...`);
226 break;
227 }
228 }
229 }
230})();