Files
ts-gateway-send-wa/source/server.ts
AlfandiMario df3ebb771c rm unused log
2024-11-19 18:26:33 +07:00

256 lines
7.0 KiB
TypeScript

import config from "./config/config";
import logging from "./config/logging";
import * as Xcron from "node-cron";
import {
getListOutbox,
sendToQontak,
uploadFileCdn,
changeStatusOutbox,
} from "./lib-inject";
export const NAME_SPACE = "SENT RESULT VIA WA";
const VERSION = "1.0";
let isRunning = false;
logging.info(NAME_SPACE, "Starting. Ver:", `${VERSION}`);
const on_init = async () => {
logging.info(
NAME_SPACE,
"-------------------- ON INIT START --------------------"
);
await main("N");
await main("E");
await main("R");
logging.info(
NAME_SPACE,
"-------------------- ON INIT END --------------------"
);
};
on_init();
async function main(status: string) {
if (isRunning) {
logging.info(NAME_SPACE, "Process is running. Skip this run.");
return;
}
isRunning = true;
try {
logging.info(NAME_SPACE, "Process is running. Start to get list outbox.");
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);
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;
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);
logging.info(NAME_SPACE, "\t Uploading File to CDN: ", resp);
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);
}
}
}
} 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);
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);
}
}
}
logging.info(NAME_SPACE, "End Job Get Order");
isRunning = false;
} catch (e) {
isRunning = false;
if (e instanceof Error) {
logging.error(NAME_SPACE, e.message);
} else {
logging.error(NAME_SPACE, "Unknown");
}
}
}
async function getLists(status: string) {
const statusOutbox = status;
// const statusOutbox = config.statusOutbox;
const startDate = config.startDate;
const endDate = config.endDate;
var resp = await getListOutbox(statusOutbox, 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
);
}
const result =
typeof resp.data === "string" ? JSON.parse(resp.data) : resp.data;
return result;
}
async function sentMsg(item: any, status: string, retry: number) {
let payload = {
orderID: item.orderID,
orderDate: item.orderDate,
patientDOB: item.patientDOB,
patientName: item.patientName,
patientHp: item.patientHp,
corpName: item.CorporateName,
fileName: item.fileName,
statusOutbox: status,
retryOutbox: retry,
sendWaID: item.sendWaID,
};
// return payload;
/* Axios for POST to the WA API */
var response = await sendToQontak(payload); // Response "OK"
return response;
}
async function uploadFile(item: any) {
let payload = {
fileName: item.fileName,
rptUrl: item.localUrl,
mime: "application/pdf",
XWaOutboxID: item.sendWaID,
};
// return payload;
var response = await uploadFileCdn(payload); // Response "OK"
return response;
}
async function changeStatus(item: any, status: string, retry: number) {
let payload = {
toStatus: status,
XWaOutboxID: item.sendWaID,
retry: retry,
};
// return payload;
var response = await changeStatusOutbox(payload);
return response;
}
async function delay(ms: number) {
return new Promise((resolve) => setTimeout(resolve, ms));
}
function elseif(arg0: boolean) {
throw new Error("Function not implemented.");
}