new feat: gateway dipakai bersama dengan send-wa-kwitansi
including:
- remove batch_size di config-gw-wa.json
- merge function, bedakan dengan message_type
This commit is contained in:
327
source/server.ts
327
source/server.ts
@@ -9,22 +9,24 @@ import {
|
||||
changeStatusOutbox,
|
||||
} from "./lib-inject";
|
||||
|
||||
export const NAME_SPACE = "Gateway Send WA";
|
||||
export const NAME_SPACE = "WA_GATEWAY";
|
||||
const VERSION = "1.1";
|
||||
|
||||
let isRunning = false;
|
||||
|
||||
logging.info(NAME_SPACE, "Starting. Ver:", `${VERSION}`);
|
||||
|
||||
type MessageType = "mcu" | "payment";
|
||||
|
||||
const on_init = async () => {
|
||||
logging.info(
|
||||
NAME_SPACE,
|
||||
"-------------------- ON INIT START --------------------"
|
||||
);
|
||||
|
||||
await main("N");
|
||||
await main("E");
|
||||
await main("R");
|
||||
// Process both message types
|
||||
await processMessageType("mcu");
|
||||
await processMessageType("payment");
|
||||
|
||||
logging.info(
|
||||
NAME_SPACE,
|
||||
@@ -34,7 +36,56 @@ const on_init = async () => {
|
||||
|
||||
on_init();
|
||||
|
||||
async function main(status: string) {
|
||||
async function processMessageType(messageType: MessageType) {
|
||||
logging.info(
|
||||
NAME_SPACE,
|
||||
`Processing ${config.messageTypes[messageType].name} messages`
|
||||
);
|
||||
|
||||
await main(messageType, "N");
|
||||
await main(messageType, "E");
|
||||
await main(messageType, "R");
|
||||
}
|
||||
|
||||
async function processOutboxItem(
|
||||
messageType: MessageType,
|
||||
outbox: any,
|
||||
status: string,
|
||||
retry: number
|
||||
) {
|
||||
if (outbox.fileUrl == null) {
|
||||
const uploadResult = await uploadFile(messageType, outbox);
|
||||
logging.info(
|
||||
NAME_SPACE,
|
||||
`\t Uploading File to CDN [${config.messageTypes[messageType].name}]:`,
|
||||
uploadResult
|
||||
);
|
||||
await delay(1000);
|
||||
|
||||
if (uploadResult === "OK") {
|
||||
logging.info(NAME_SPACE, "\t File Uploaded");
|
||||
const response = await sentMsg(messageType, outbox, status, retry);
|
||||
await delay(1000);
|
||||
logging.info(
|
||||
NAME_SPACE,
|
||||
`\t Resp Qontak [${config.messageTypes[messageType].name}]:`,
|
||||
response
|
||||
);
|
||||
} else {
|
||||
await changeStatus(messageType, outbox, "E", retry);
|
||||
}
|
||||
} else {
|
||||
const response = await sentMsg(messageType, outbox, status, retry);
|
||||
await delay(1000);
|
||||
logging.info(
|
||||
NAME_SPACE,
|
||||
`\t Resp Qontak [${config.messageTypes[messageType].name}]:`,
|
||||
response
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
async function main(messageType: MessageType, status: string) {
|
||||
if (isRunning) {
|
||||
logging.info(NAME_SPACE, "Process is running. Skip this run.");
|
||||
return;
|
||||
@@ -44,185 +95,106 @@ async function main(status: string) {
|
||||
try {
|
||||
logging.info(
|
||||
NAME_SPACE,
|
||||
"Process is running. Start to get list outbox."
|
||||
`Process is running. Start to get list outbox for ${config.messageTypes[messageType].name}.`
|
||||
);
|
||||
const outboxs = await getLists(messageType, status);
|
||||
|
||||
let outboxs = await getLists(status);
|
||||
|
||||
/* Pesan minta diproses kirim */
|
||||
if (status == "N") {
|
||||
logging.info(NAME_SPACE, "GET Processed (N) Message");
|
||||
|
||||
for (let i = 0; i < outboxs.length; i++) {
|
||||
let outbox = outboxs[i];
|
||||
// logging.info(NAME_SPACE, "\t Detail: ", outbox);
|
||||
let retry = outbox.XWaOutboxIsRetry;
|
||||
|
||||
/* Jika fileUrl masih 0, maka panggil upload file */
|
||||
if (outbox.fileUrl == null) {
|
||||
let resp = uploadFile(outbox);
|
||||
logging.info(
|
||||
NAME_SPACE,
|
||||
"\t Uploading File to CDN: ",
|
||||
resp
|
||||
switch (status) {
|
||||
case "N":
|
||||
logging.info(
|
||||
NAME_SPACE,
|
||||
`GET Processed (N) Message - ${config.messageTypes[messageType].name}`
|
||||
);
|
||||
for (const outbox of outboxs) {
|
||||
await processOutboxItem(
|
||||
messageType,
|
||||
outbox,
|
||||
status,
|
||||
outbox.XWaOutboxIsRetry
|
||||
);
|
||||
logging.info(NAME_SPACE, "\t wait 2s \t");
|
||||
await delay(2000);
|
||||
|
||||
if ((await resp) == "OK") {
|
||||
logging.info(NAME_SPACE, "\t File Uploaded");
|
||||
|
||||
let response = sentMsg(outbox, status, retry);
|
||||
|
||||
logging.info(NAME_SPACE, "\t wait 4s \t");
|
||||
await delay(4000);
|
||||
|
||||
logging.info(NAME_SPACE, "\t Resp Qontak: ", response);
|
||||
} else {
|
||||
// Change Status ke Error
|
||||
changeStatus(outbox, "E", retry);
|
||||
}
|
||||
} else {
|
||||
// Jika fileUrl sudah ada maka langsung kirim file
|
||||
let response = sentMsg(outbox, status, retry);
|
||||
|
||||
logging.info(NAME_SPACE, "\t wait 4s \t");
|
||||
await delay(4000);
|
||||
|
||||
logging.info(NAME_SPACE, "\t Resp Qontak: ", response);
|
||||
}
|
||||
}
|
||||
} else if (status == "E") {
|
||||
/* Pesan Eror < 5x retry */
|
||||
logging.info(NAME_SPACE, "GET Error (E) Message");
|
||||
for (let i = 0; i < outboxs.length; i++) {
|
||||
let outbox = outboxs[i];
|
||||
// logging.info(NAME_SPACE, "\t Detail: ", outbox);
|
||||
let retry = outbox.XWaOutboxIsRetry;
|
||||
break;
|
||||
|
||||
if (retry >= 5) {
|
||||
logging.info(
|
||||
NAME_SPACE,
|
||||
"\t Retry count more than 5. Skip this message."
|
||||
);
|
||||
continue;
|
||||
} else {
|
||||
retry++;
|
||||
|
||||
if (outbox.fileUrl == null) {
|
||||
let resp = uploadFile(outbox);
|
||||
case "E":
|
||||
logging.info(
|
||||
NAME_SPACE,
|
||||
`GET Error (E) Message - ${config.messageTypes[messageType].name}`
|
||||
);
|
||||
for (const outbox of outboxs) {
|
||||
const retry = outbox.XWaOutboxIsRetry;
|
||||
if (retry >= 5) {
|
||||
logging.info(
|
||||
NAME_SPACE,
|
||||
"\t Uploading File to CDN: ",
|
||||
resp
|
||||
"\t Retry count more than 5. Skip this message."
|
||||
);
|
||||
logging.info(NAME_SPACE, "\t wait 2s \t");
|
||||
await delay(2000);
|
||||
|
||||
if ((await resp) == "OK") {
|
||||
logging.info(NAME_SPACE, "\t File Uploaded");
|
||||
|
||||
let response = sentMsg(outbox, status, retry);
|
||||
|
||||
logging.info(NAME_SPACE, "\t wait 4s \t");
|
||||
await delay(4000);
|
||||
|
||||
logging.info(
|
||||
NAME_SPACE,
|
||||
"\t Resp Qontak: ",
|
||||
response
|
||||
);
|
||||
} else {
|
||||
changeStatus(outbox, "E", retry);
|
||||
}
|
||||
} else {
|
||||
let response = sentMsg(outbox, status, retry);
|
||||
logging.info(NAME_SPACE, "\t wait 4s \t");
|
||||
await delay(4000);
|
||||
logging.info(NAME_SPACE, "\t Resp Qontak: ", response);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (status == "R") {
|
||||
logging.info(NAME_SPACE, "GET Rejected (R) Message");
|
||||
|
||||
for (let i = 0; i < outboxs.length; i++) {
|
||||
let outbox = outboxs[i];
|
||||
// logging.info(NAME_SPACE, "\t Detail: ", outbox);
|
||||
let retry = outbox.XWaOutboxIsRetry;
|
||||
|
||||
/* Jika fileUrl masih 0, maka panggil upload file */
|
||||
if (outbox.fileUrl == null) {
|
||||
let resp = uploadFile(outbox);
|
||||
logging.info(
|
||||
NAME_SPACE,
|
||||
"\t Uploading File to CDN: ",
|
||||
resp
|
||||
await processOutboxItem(
|
||||
messageType,
|
||||
outbox,
|
||||
status,
|
||||
retry + 1
|
||||
);
|
||||
logging.info(NAME_SPACE, "\t wait 2s \t");
|
||||
await delay(2000);
|
||||
|
||||
if ((await resp) == "OK") {
|
||||
logging.info(NAME_SPACE, "\t File Uploaded");
|
||||
|
||||
let response = sentMsg(outbox, status, retry);
|
||||
|
||||
logging.info(NAME_SPACE, "\t wait 4s \t");
|
||||
await delay(4000);
|
||||
|
||||
logging.info(NAME_SPACE, "\t Resp Qontak: ", response);
|
||||
} else {
|
||||
// Change Status ke Error
|
||||
changeStatus(outbox, "E", retry);
|
||||
}
|
||||
} else {
|
||||
// Jika fileUrl sudah ada maka langsung kirim file
|
||||
let response = sentMsg(outbox, status, retry);
|
||||
|
||||
logging.info(NAME_SPACE, "\t wait 4s \t");
|
||||
await delay(4000);
|
||||
|
||||
logging.info(NAME_SPACE, "\t Resp Qontak: ", response);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case "R":
|
||||
logging.info(
|
||||
NAME_SPACE,
|
||||
`GET Rejected (R) Message - ${config.messageTypes[messageType].name}`
|
||||
);
|
||||
for (const outbox of outboxs) {
|
||||
await processOutboxItem(
|
||||
messageType,
|
||||
outbox,
|
||||
status,
|
||||
outbox.XWaOutboxIsRetry
|
||||
);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
logging.info(NAME_SPACE, "End Job Get Order");
|
||||
isRunning = false;
|
||||
logging.info(
|
||||
NAME_SPACE,
|
||||
`End Job Get Order - ${config.messageTypes[messageType].name}`
|
||||
);
|
||||
} catch (e) {
|
||||
isRunning = false;
|
||||
if (e instanceof Error) {
|
||||
logging.error(NAME_SPACE, e.message);
|
||||
} else {
|
||||
logging.error(NAME_SPACE, "Unknown");
|
||||
logging.error(NAME_SPACE, "Unknown error");
|
||||
}
|
||||
} finally {
|
||||
isRunning = false;
|
||||
}
|
||||
}
|
||||
|
||||
async function getLists(status: string) {
|
||||
const statusOutbox = status;
|
||||
// const statusOutbox = config.statusOutbox;
|
||||
const startDate = config.startDate;
|
||||
const endDate = config.endDate;
|
||||
async function getLists(messageType: MessageType, status: string) {
|
||||
const { startDate, endDate } = config;
|
||||
|
||||
var resp = await getListOutbox(statusOutbox, startDate, endDate);
|
||||
if (resp["status"] != "OK") {
|
||||
const resp = await getListOutbox(messageType, status, startDate, endDate);
|
||||
if (resp?.status !== "OK") {
|
||||
logging.error(NAME_SPACE, "\t Error get outbox data", resp);
|
||||
logging.error(NAME_SPACE, "\t Error: ", resp);
|
||||
} else {
|
||||
logging.info(
|
||||
NAME_SPACE,
|
||||
"\t Success get order data found ",
|
||||
resp.data.length
|
||||
);
|
||||
return [];
|
||||
}
|
||||
const result =
|
||||
typeof resp.data === "string" ? JSON.parse(resp.data) : resp.data;
|
||||
return result;
|
||||
|
||||
logging.info(
|
||||
NAME_SPACE,
|
||||
`\t Success get order data found [${config.messageTypes[messageType].name}]`,
|
||||
resp.data?.length || 0
|
||||
);
|
||||
return typeof resp.data === "string"
|
||||
? JSON.parse(resp.data)
|
||||
: resp.data || [];
|
||||
}
|
||||
|
||||
async function sentMsg(item: any, status: string, retry: number) {
|
||||
let payload = {
|
||||
async function sentMsg(
|
||||
messageType: MessageType,
|
||||
item: any,
|
||||
status: string,
|
||||
retry: number
|
||||
) {
|
||||
const payload = {
|
||||
orderID: item.orderID,
|
||||
orderDate: item.orderDate,
|
||||
patientDOB: item.patientDOB,
|
||||
@@ -234,45 +206,41 @@ async function sentMsg(item: any, status: string, retry: number) {
|
||||
retryOutbox: retry,
|
||||
sendWaID: item.sendWaID,
|
||||
};
|
||||
// return payload;
|
||||
|
||||
/* Axios for POST to the WA API */
|
||||
var response = await sendToQontak(payload); // Response "OK"
|
||||
return response;
|
||||
return await sendToQontak(messageType, payload);
|
||||
}
|
||||
|
||||
async function uploadFile(item: any) {
|
||||
let payload = {
|
||||
async function uploadFile(messageType: MessageType, item: any) {
|
||||
const payload = {
|
||||
fileName: item.fileName,
|
||||
rptUrl: item.localUrl,
|
||||
mime: "application/pdf",
|
||||
XWaOutboxID: item.sendWaID,
|
||||
};
|
||||
// return payload;
|
||||
|
||||
var response = await uploadFileCdn(payload); // Response "OK"
|
||||
return response;
|
||||
return await uploadFileCdn(messageType, payload);
|
||||
}
|
||||
|
||||
async function changeStatus(item: any, status: string, retry: number) {
|
||||
let payload = {
|
||||
async function changeStatus(
|
||||
messageType: MessageType,
|
||||
item: any,
|
||||
status: string,
|
||||
retry: number
|
||||
) {
|
||||
const payload = {
|
||||
toStatus: status,
|
||||
XWaOutboxID: item.sendWaID,
|
||||
retry: retry,
|
||||
};
|
||||
// return payload;
|
||||
|
||||
var response = await changeStatusOutbox(payload);
|
||||
return response;
|
||||
return await changeStatusOutbox(messageType, payload);
|
||||
}
|
||||
|
||||
async function delay(ms: number) {
|
||||
return new Promise(resolve => setTimeout(resolve, ms));
|
||||
}
|
||||
function elseif(arg0: boolean) {
|
||||
throw new Error("Function not implemented.");
|
||||
}
|
||||
|
||||
// Schedule both message types
|
||||
for (const sched of config.schedule) {
|
||||
Xcron.schedule(
|
||||
sched,
|
||||
@@ -281,14 +249,11 @@ for (const sched of config.schedule) {
|
||||
NAME_SPACE,
|
||||
" -------------------- ON INIT SCHEDULE --------------------"
|
||||
);
|
||||
|
||||
await main("N");
|
||||
await main("E");
|
||||
await main("R");
|
||||
|
||||
await processMessageType("mcu");
|
||||
await processMessageType("payment");
|
||||
logging.info(
|
||||
NAME_SPACE,
|
||||
"-------------------- END SCHEDULE--------------------"
|
||||
"-------------------- END SCHEDULE --------------------"
|
||||
);
|
||||
},
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user