diff --git a/wai-server/api/channels/channel.controller.js b/wai-server/api/channels/channel.controller.js index fd776fc..cac5028 100644 --- a/wai-server/api/channels/channel.controller.js +++ b/wai-server/api/channels/channel.controller.js @@ -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.'); diff --git a/wai-server/core/handler/whatsappHandler.js b/wai-server/core/handler/whatsappHandler.js index 338f2b5..19bbfc1 100644 --- a/wai-server/core/handler/whatsappHandler.js +++ b/wai-server/core/handler/whatsappHandler.js @@ -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) {