消息事件:` pending` , `saved`

dev/supplier-email-drawer
Lei OT 9 months ago
parent d7cd08aaa4
commit b71892b117

@ -27,7 +27,7 @@ exports.newConnect = async ctx => {
const { sessionId } = sessionStore.createSession(phone, whatsApp1);
// }
ctx.assert(whatsApp1, 503, 'No available connections');
return { qr, phone, sessionId: phone, domainName };
return { qr, phone, session_id: phone, wai_server: domainName };
} catch (error) {
console.error('create connection error', error);
ctx.assert(null, 500, 'Failed to create connection or generate QR code.');

@ -16,8 +16,8 @@ const eventTypeMapped = {
'message:received': 'wai.message.received',
'message:updated': 'wai.message.updated',
};
const timeField = { pending: 'createTime', sent: 'sendTime', delivered: 'deliverTime', read: 'readTime' };
const statusMapped = { pending: 'accepted', sent: 'sent', delivered: 'delivered', read: 'read' }
const timeField = { saved: 'createTime', pending: 'createTime', sent: 'sendTime', delivered: 'deliverTime', read: 'readTime' };
const statusMapped = { saved: 'accepted', pending: 'accepted', sent: 'sent', delivered: 'delivered', read: 'read' }
const directionField = { 'message:received': 'inbound', 'message:updated': 'outbound' };
/**
@ -52,7 +52,7 @@ const setupConnectionHandler = () => {
try {
// find Or create
await addCurrentConnection({
...objectMapper(connectionData, { phone: [{ key: 'wa_id' }, { key: 'sesson_id' }], channelId: 'channel_id', createTimestamp: 'createtime' }, false),
...objectMapper(connectionData, { phone: [{ key: 'wa_id' }, { key: 'sesson_id' }], channelId: 'channel_id', createTimestamp: 'createtime', version: 'version' }, false),
service_type: 'baileys',
status: 'connecting',
});
@ -63,6 +63,7 @@ const setupConnectionHandler = () => {
logger.info(`Setting up event ${'connection:open'}`);
whatsappEvents.on('connection:open', async connectionData => {
logger.info(`event ${'connection:open'}`, connectionData);
// todo: 更新实例
try {
await updateConnection(
{
@ -78,6 +79,7 @@ const setupConnectionHandler = () => {
});
logger.info(`Setting up event ${'connection:close'}`);
whatsappEvents.on('connection:close', async connectionData => {
logger.info(`event ${'connection:close'}`, connectionData);
try {
sessionStore.removeSession(connectionData.channelId);
await updateConnection(
@ -85,7 +87,7 @@ const setupConnectionHandler = () => {
...objectMapper(connectionData, { whatsAppNo: [{ key: 'wa_id' }, { key: 'sesson_id' }], channelId: 'channel_id' }),
service_type: 'baileys',
},
{ connect_domain: domain, connect_name: domainName },
{ connect_domain: domain, connect_name: domainName, channel_id: connectionData.channelId },
);
// todo: 通知前端: 重新扫码
} catch (error) {
@ -95,20 +97,25 @@ const setupConnectionHandler = () => {
// });
};
/**
* WhatsApp 消息事件
* pending -> saved -> sent(*) -> delivered -> read
*/
const setupMessageHandler = () => {
messageEventNames.forEach(eventName => {
logger.info(`Setting up event ${eventName}`);
whatsappEvents.on(eventName, async messageData => {
if (messageData.status === 'pending') {
logger.info('message pending', messageData);
return false;
}
// if (messageData.status === 'pending') {
// logger.info('message pending', messageData);
// return false;
// }
try {
const now = new Date(new Date().getTime() + 60 * 60 * 1000).toISOString();
const savedMsg = await getOutboundMessage({ id: messageData.id });
const bixFields = pick(m, ['actionId', 'externalId']);
logger.info('message evt NOT pending \n', m, bixFields);
const targetUpsert = messageData.externalId ? { actionId: messageData.externalId } : { id: messageData.id };
const savedMsg = await getOutboundMessage(targetUpsert);
const bixFields = pick(savedMsg, ['actionId', 'externalId']);
logger.info('message evt\n', eventName, messageData, savedMsg);
const webhookBody = webhookBodyBuilder({ ...messageData, ...bixFields }, eventName);
const { waiMessage } = webhookBody;
@ -119,7 +126,8 @@ const setupMessageHandler = () => {
const pusher = { customerProfile_id: waiMessage.customerProfile?.id || '', customerProfile_name: waiMessage.customerProfile?.name || '' };
const record = objectMapper(waiMessage, { from: 'froms', to: 'tos', status: 'msg_status', type: 'msgtype' }, false);
const contentFields = waiMessage.type === 'text' ? { text_body: waiMessage.text.body } : {};
await upsertOutboundMessage(m.sn || null, { ...timeFields, ...upsertFields, ...pusher, ...contentFields, ...record, message_origin: savedMsg?.message_origin || JSON.stringify(messageData) });
await upsertOutboundMessage({ ...timeFields, ...upsertFields, ...pusher, ...contentFields, ...record, message_origin: savedMsg?.message_origin || JSON.stringify(messageData) }, targetUpsert);
// console.log('upsert=========================', upsert);
await callWebhook(webhookBody);
} catch (error) {

Loading…
Cancel
Save