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."); } for (const sched of config.schedule) { Xcron.schedule( sched, async () => { logging.info( NAME_SPACE, " -------------------- ON INIT SCHEDULE --------------------" ); await main("N"); await main("E"); await main("R"); logging.info( NAME_SPACE, "-------------------- END SCHEDULE--------------------" ); }, { timezone: "Asia/Jakarta", } ); }