|
|
|
@ -19,6 +19,7 @@ const eventTypeMapped = {
|
|
|
|
|
const timeField = { saved: 'createTime', pending: 'createTime', sent: 'sendTime', delivered: 'deliverTime', read: 'readTime', };
|
|
|
|
|
const statusMapped = { saved: 'accepted', pending: 'accepted', sent: 'sent', delivered: 'delivered', read: 'read', failed: 'failed' }
|
|
|
|
|
const directionField = { 'message:received': 'inbound', 'message:updated': 'outbound' };
|
|
|
|
|
const directionPrefix = { 'inbound': 'in_', 'outbound': 'out_' };
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @returns {Object} webhookBody
|
|
|
|
@ -35,11 +36,12 @@ const webhookBodyBuilder = (messageData, messageType) => {
|
|
|
|
|
waiMessage: {
|
|
|
|
|
...messageData,
|
|
|
|
|
...(messageData.updateTime ? { [timeField[messageData.status]]: messageData.updateTime } : {}),
|
|
|
|
|
id: `${directionPrefix[messageData.direction]}${messageData.id}`,
|
|
|
|
|
wamid: messageData.id,
|
|
|
|
|
// direction: directionField[messageType],
|
|
|
|
|
status: statusMapped?.[messageData.status] || messageData.status || '',
|
|
|
|
|
// externalId: '-1', // todo:
|
|
|
|
|
externalId: `-${messageData.externalId || 1}`, // debug: 测试: 是负值
|
|
|
|
|
externalId: messageData?.externalId || '',
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
return message;
|
|
|
|
@ -99,7 +101,7 @@ const setupConnectionHandler = () => {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* WhatsApp 消息事件
|
|
|
|
|
* pending -> saved -> sent(*) -> delivered -> read
|
|
|
|
|
* pending ⏰ -> saved ⏰ -> sent(*) ✔ -> delivered ✔✔ -> read ✅
|
|
|
|
|
* saved -> pending -> sent(*) -> delivered -> read
|
|
|
|
|
*/
|
|
|
|
|
const setupMessageHandler = () => {
|
|
|
|
@ -113,7 +115,7 @@ const setupMessageHandler = () => {
|
|
|
|
|
try {
|
|
|
|
|
const now = new Date(new Date().getTime() + 60 * 60 * 1000).toISOString();
|
|
|
|
|
|
|
|
|
|
const targetUpsert = messageData.externalId ? { actionId: messageData.externalId } : { id: messageData.id };
|
|
|
|
|
const targetUpsert = messageData.externalId ? { actionId: messageData.externalId } : { wamid: messageData.id };
|
|
|
|
|
const savedMsg = await getOutboundMessage(targetUpsert);
|
|
|
|
|
const bixFields = pick(savedMsg, ['actionId', 'externalId']);
|
|
|
|
|
logger.info('message evt\n', eventName, messageData, savedMsg);
|
|
|
|
|