Commit Graph

20 Commits

Author SHA1 Message Date
Gabriel Jablonski
c234023a4a
feat(zapi): handle contact messages and ignore notifications (#124)
* chore: skip notification messages

* feat: contact card messages

* fix: notification message handling

* chore: reduce code duplication

* fix: improve contact name handling in attachment

* chore(zapi): promo banner with affiliate link (#126)

* chore(zapi): promo banner with affiliate link

* chore: remove useless comment

* chore(zapi): add note about hardcoded affiliate link

* feat: provider.event_received for raw provider events (#127)

* chore(zapi): promo banner with affiliate link

* chore: remove useless comment

* feat: provider.event_received for raw provider events

* feat: add provider_event_received handling in webhook listener

* feat(baileys): use senderLid as contact identifier (#128)

* chore(zapi): promo banner with affiliate link

* chore: remove useless comment

* feat: provider.event_received for raw provider events

* feat(baileys): use senderLid as contact identifier

* fix: simplify webhook_data method by removing unnecessary fields
2025-10-26 10:48:06 -03:00
Cayo P. R. Oliveira
76deea996d
chore: refactor incoming_message_baileys_service using composition and fix some failure points (#53)
* feat: implement connection update handling for Baileys

* feat: add message update handling for Baileys integration

* feat: implement message processing and handling for Baileys integration

* fix: clear message source ID from Redis when contact is not found

* fix: raise error when attachment file is not found during media handling

* refactor: reorganize includes in incoming_message_baileys_service

* feat: add helper methods for message handling in Baileys integration

* feat: include IncomingMessageServiceHelpers in MessagesUpdate module

* refactor: replace IncomingMessageServiceHelpers with BaileysHandlers::Helpers in connection_update, messages_update, and messages_upsert modules

* fix: mark message as unsupported when attachment file is not found

* refactor: remove unnecessary namespace for includes in IncomingMessageBaileysService

* refactor: add private visibility to methods in connection_update, helpers, messages_update, and messages_upsert modules

* refactor: preserve original message in handle_edited_content method

* fix: attachment error handling

* feat: implement conversation creation logic in set_conversation method

* refactor: remove unused error handling for attachment not found in messages update and upsert

* feat: update last seen timestamps in conversation on message status update

* feat: log warning for unsupported message update status in Baileys service

* chore: merge

---------

Co-authored-by: gabrieljablonski <contact@gabrieljablonski.com>
2025-05-29 10:56:39 -03:00
Gabriel Jablonski
e188262877
fix(baileys): race condition send_message/incoming message (#51)
* fix: race condition send_message/incoming message

* fix: handle update race condition as well
2025-05-29 10:43:42 -03:00
Cayo P. R. Oliveira
c3e0e70490
feat: update message status and last seen timestamps (#52)
* feat: update message status and last seen timestamps

* test: enhance message status and content update handling in Baileys service tests

* feat: update last seen timestamps in conversation on message update

* chore: simplify status update condition for incoming messages

* feat: optimize last seen timestamp updates in conversation

* chore: improve last seen spec

* feat: update message content handling in content update scenario
2025-05-29 09:55:39 -03:00
Cayo P. R. Oliveira
548c0351ec
Fix/baileys unread message (#50)
* fix: correct structure of lastMessages in message content

* fix: update send_message to store external_created_at timestamp with result from request

* fix: filter incoming messages for unread conversation logic

* fix: improve extraction of message timestamp in send_message method

* feat: enhance message timestamp extraction and update logic in send_message method

* refactor: send_message to improve error handling and update external_created_at timestamp

* chore: move message timestamp extraction to helper

* fix: use message timestamp extract on incoming

* fix: update unread_conversation to handle last message correctly for Baileys provider

---------

Co-authored-by: gabrieljablonski <contact@gabrieljablonski.com>
2025-05-23 17:19:01 -03:00
Cayo P. R. Oliveira
5735134772
feat: Baileys-API get media using CDN (#48)
* feat: add get_media method to retrieve media from provider service

* feat: implement media attachment handling and add media_url method

* feat: add includeMedia option to webhook request in WhatsappBaileysService

* feat: add get_media method to error handling in WhatsappBaileysService

* feat: add includeMedia option to webhook request in WhatsappBaileysService spec

* feat: add media_url method to retrieve media URL in WhatsappBaileysService spec

* refactor: remove get_media method from WhatsappBaileysService and Channel::Whatsapp

* refactor: streamline message handling in IncomingMessageBaileysService spec

* chore: add todo comment about includeMedia

* refactor: simplify media download stubbing in IncomingMessageBaileysService spec

* refactor: simplify media download stubbing in IncomingMessageBaileysService spec

* fix: add missing end statements missed in rebase

---------

Co-authored-by: gabrieljablonski <contact@gabrieljablonski.com>
2025-05-21 18:38:56 -03:00
Cayo P. R. Oliveira
a760442010
fix: mark message read edge case (#46)
* feat: enhance message_content_attributes to handle reaction messages

* fix: update external_created_at to use raw message timestamp directly

* fix: update readableTime to use externalCreatedAt if available

* feat: enhance timestamp formatting with localization support for pt-BR

* feat: add note to message_content_attributes about external_created_at timestamp

* fix: add missing newline at end of conversation.json files

* test: add additional cases for messageTimestamp formatting

* chore: remove outdated note about external_created_at in message_content_attributes

* refactor: remove out of scope task changes

* feat: add test for setting external_created_at in content_attributes on new message

* fix: use last_seen_at message query conditions only if present

* test: add SQL execution tests for messages_read with last_seen_at conditions

* fix: ensure SQL notifications are unsubscribed after message read events

* refactor: streamline message query in messages_read method

* test: update messages_read specs to test expected behavior

* refactor: simplify readableTime computation by removing unnecessary externalCreatedAt check

* fix: update readableTime computation to use externalCreatedAt if available

* test: enhance messages_read specs to use a consistent event object

* test: refactor spec for creating message with external_created_at in messages.upsert event

* Refactor incoming message specs for clarity and consistency

- Consolidated raw_message and params definitions using let blocks for better readability.
- Updated tests to directly manipulate raw_message and params within individual examples.
- Ensured consistent naming and structure across different message types.
- Improved assertions to reflect changes in message attributes and expectations.

* refactor: streamline messages.update event handling and improve test clarity

* test: refactor messages.upsert event specs to use a consistent timestamp

* test: enhance reaction message handling in incoming_message_baileys_service_spec
2025-05-16 14:13:00 -03:00
gabrieljablonski
027eb8de0b chore: add todo about denormalized brazilian phone numbers 2025-05-10 01:01:27 -03:00
Cayo P. R. Oliveira
322f0d1922
feat: use message is unsupported content attribute (#44)
* refactor: simplify message_type method using a hash for message types

* refactor: streamline message handling and update unsupported message logic

* refactor: simplify create_message method by inlining sender_type and message_type assignments

* refactor: simplify message_type method for improved readability and performance

* feat: allow is_recorded_audio as boolean

* chore: refactor create message + attach media logic

* fix: unsupported message templates

---------

Co-authored-by: gabrieljablonski <contact@gabrieljablonski.com>
2025-05-09 10:52:07 -03:00
gabrieljablonski
16637c03c6 feat: add support for file mimetypes and update attachment filename generation 2025-05-08 22:23:54 -03:00
gabrieljablonski
d4915e864f fix: create message with attachment in a single step 2025-05-08 21:36:06 -03:00
Cayo P. R. Oliveira
8d5a6bc4b5
feat: add flag to edited messages and content history tracking (#35)
* fix: handle protocol messages in IncomingMessageBaileysService and ignore it

* fix: ignore protocol messages before create conversation and contact

* feat: add flag to edited messages and content history tracking

* refactor: update message model to use edit_history instead of content_history for tracking edits

* refactor: update message model to track previous content instead of edit history

* test: fix message content update test to correctly track original content

---------

Co-authored-by: gabrieljablonski <contact@gabrieljablonski.com>
2025-05-06 16:40:09 -03:00
Cayo P. R. Oliveira
a52a4cf8ce
fix: ignore protocolMessages (#34)
* fix: handle protocol messages in IncomingMessageBaileysService and ignore it

* fix: ignore protocol messages before create conversation and contact

* chore: update test description for contact inbox and message creation

* chore: simplify protocol message check in handle_message method
2025-04-30 21:33:53 -03:00
Cayo P. R. Oliveira
8e913236e5
feat: baileys messages reactions (#33)
* fix: update send_message method to handle  baileys-api send-message changes

* chore: simplify update of is_unsupported

* feat: add support for message reactions in WhatsApp Baileys service

* chore: update context description for unsupported message in send_message spec

* feat: enhance incoming messages Baileys service to support message reactions and external source ID handling

* fix: correct typo in comment for is_reaction attribute in Message model

* chore: simplify message handling by removing external source ID checks and unused methods

* fix: update comment to reflect necessary change for source_id in set_contact method

* fix: refactor message handling for reactions and simplify jid generation

* fix: add comment to clarify behavior of find_message_by_source_id method

* fix: update unsupported message handling

* chore: specs for reaction messages

* fix: simplify message update handling by removing redundant validation method

* fix: update reaction message handling to use in_reply_to_external_id and fix spec

* fix: enhance message handling for unsupported types and update specs

* fix: update reaction message handling to set is_reaction flag and enhance specs

* fix: update specs for send message in reaction

* revert: remove mb0 from input

* fix: streamline jid generation in send_message_request

* refactor: specs

* refactor: move content attributes to helper

* test: spec for empty reaction

* refactor: streamline references to replied message

* test: refactor spec

* test: refactor spec

---------

Co-authored-by: gabrieljablonski <contact@gabrieljablonski.com>
2025-04-29 20:57:36 -03:00
Cayo P. R. Oliveira
8fc14186e0
feat: process Baileys attachments, fix contact name creation, and handle unsupported messages (#26)
* fix: return not_found status for missing messages in WhatsApp webhook

* feat: enhance message handling to support image attachments

* chore: Handle incoming whatsapp baileys service attachments and implement specs for images and videos

* fix: add file_content_type method to incoming baileys messages

* chore: specs for stickers, audio and files

* fix: handle media attachment errors

* chore: convert file_content_type to string when attaching media

* fix: add handling for attachment not found error in incoming message service

* chore: refactor file_content_type method and simplify filename method

* chore: update media attachment tests

* feat: baileys unsupported message alert (#27)

* feat: create alert message for unsupported message types

* chore: fail message when try send not supported type in baileys

* chore: add tests for unsupported message handling in Baileys service

* chore: correct spelling

* chore: NIT in spec name

* chore: remove unnecessary message reload in unsupported message type test

* feat: baileys support to send attachments (#28)

* feat: enhance message sending logic with support for attachments and interactive messages

* fix: update message format to use messageContent for text messages

* feat: attachment message sending

* fix: use strict encoding for attachment file download

* chore: streamline message sending logic and remove unused error classes

* chore: remove type from message sending logic

* chore: update message sending specs

* chore: raise MessageNotSentError instead of updating message status to failed

* chore: change baileys contact name preferences (#30)

* refactor: improve contact name handling and extraction from JID

* test: enhance message handling to update contact names based on pushName and verifiedBizName

* chore: update contact name condition to match phone number from JID

* chore: correct method name typo

* chore: correct variable names for phone number consistency in tests

* chore: update message payload structure and improve error handling in send_message

* test: re-add testing for error handling

* feat: enhance contact name handling and add self-message detection

* fix: ensure presence check for verified business name in contact name retrieval

* test: improve specs

---------

Co-authored-by: gabrieljablonski <contact@gabrieljablonski.com>

---------

Co-authored-by: gabrieljablonski <contact@gabrieljablonski.com>
Co-authored-by: Gabriel Jablonski <gabriel@fazer.ai>

---------

Co-authored-by: gabrieljablonski <contact@gabrieljablonski.com>
Co-authored-by: Gabriel Jablonski <gabriel@fazer.ai>

* fix: try to disconnect baileys before destroy inbox (#29)

* fix: ensure proper disconnection of Baileys provider on channel destruction

* test: add callback tests for disconnecting channel provider in Whatsapp spec

* refactor: simplify condition for disconnecting Baileys provider on channel destruction

* refactor: enhance disconnect_channel_provider specs for Baileys provider

* test: verify channel destruction does not call disconnect_channel_provider

---------

Co-authored-by: gabrieljablonski <contact@gabrieljablonski.com>

---------

Co-authored-by: gabrieljablonski <contact@gabrieljablonski.com>
Co-authored-by: Gabriel Jablonski <gabriel@fazer.ai>
2025-04-25 16:39:17 -03:00
Gabriel Jablonski
17e2029017
fix: allow composing message when using baileys inbox (#23)
* fix: allow composing message for baileys inbox

* fix: match compose format for phone number as contact name
2025-04-09 19:15:22 -03:00
Cayo P. R. Oliveira
25670564eb
feat: add message update processing in IncomingMessageBaileysService (#20)
* feat: add message update processing in IncomingMessageBaileysService

* feat: implement message update handling in IncomingMessageBaileysService

* feat: add MessageNotFoundError for handling invalid update messages in IncomingMessageBaileysService

* chore: specs for message.update events and bug fixes

* chore: refactor message update handling in IncomingMessageBaileysService

* chore: nit remove redundant comment

* chore: enhance logging for unsupported message update statuses in IncomingMessageBaileysService and disabled metrics

* chore: message status update logic with transition checks

* chore: update status mapping for PENDING to sent in status_mapper

* chore: update status_mapper comments and fix case statement for status codes

* fix: logging for unsupported message updates in update_message_content method

* test: add specs for unsupported status transitions in messages.update event

* refactor: ensure message status is reloaded before assertion in messages.update event spec

* refactor: status variable in status_mapper method

* refactor: rename status_transition_allowed method to status_transition_allowed?

* refactor: streamline message creation in specs by using let! for setup

* feat: process webhook whatsapp await response (#21)

* feat: enhance WhatsApp webhook processing and error responses handling

* chore: correct spelling of 'WhatsApp' in webhook controller specs

* refactor: rename webhook processing method and improve error handling

* chore: update error handling in WhatsApp controller specs for specific exceptions

* refactor: remove handling for StandardError in WhatsApp controller specs

* refactor: simplify perform_whatsapp_events_job method

* chore: update response status from not_found to bad_request for invalid message

* refactor: update expectations for job processing in WhatsApp controller specs
2025-04-09 19:14:38 -03:00
Cayo P. R. Oliveira
e0708ca6f8 fix: handle new contact without push name (#13)
* fix: resolve bug for contact name when user stats a new conversation with a new contact

* chore: update specs to cover the bug resolution

* chore: correct variable name

* chore: simplify update contact name handling

* chore: ensure pushName is always a string and leave a comment to keep an eye if always pushName will be present

* fix: update contact name access

* chore: identify and permit only direct users jid types (#14)

* fix: add jid_type method to classify message sender types and prevent processing for non-user jids

* chore: update jid parsing to correctly extract phone number and improve message type detection

* chore: add spec to ensure no conversation is created for non-user messages

* chore: update jid shape comment

* chore: refactor jid_type method

* chore: update message_type logic for classify text messages when is a extendedTextMessage

* refactor: update spec that no conversation is created for non-user messages

* fix: use update! method for contact name update

* chore: add note on distinguishing broadcast and status JIDs in Baileys

* chore: add note on Baileys internal function for JID classification
2025-04-03 23:28:38 -03:00
Cayo P. R. Oliveira
7ee0ec2fdb fix: handle extended text message type of incoming message upsert (#9)
* feat: support extended text messages in WhatsApp incoming message service

* fix: correct isEditorHotKeyEnabled's spec

* ci: add baileys-api service to docker-compose configuration

* feat!: update validate_provider_config? endpoint

* feat: add Resend email delivery method and configuration (#11)

* feat: add Resend email delivery method and configuration

* chore: simplify ResendProvider initialization by removing settings parameter

* test: update ResendProvider initialization in tests by removing unnecessary settings parameter

* chore: improvements

* chore: add support for external frontend URL in environment configuration

* chore: ensure trailing slash

* ci: updated docker compose

* feat: update Resend email delivery method to use headers for sender and recipient

* feat: update email templates to use user's name instead of email

* fix: simplify extended text message structure in Baileys service spec

---------

Co-authored-by: gabrieljablonski <contact@gabrieljablonski.com>
Co-authored-by: Gabriel Jablonski <gabriel@fazer.ai>
2025-04-03 23:28:38 -03:00
Cayo P. R. Oliveira
acd1e56a28 feat: baileys provider for whatsapp (#7)
* feat: baileys provider and placeholder for link device modal

* chore: drop qrcode.vue in favor of just img tag

* chore: update modal props

* feat: setup channel provider connection

* chore: update .env.example with Baileys API default configuration

* feat: add support for Baileys provider in WhatsApp events processing

* chore: rename Baileys API default host variable to DEFAULT_BAILEYS_URL

* feat: add setup and disconnect methods for Baileys channel provider in inboxes controller that will be implemented

* feat: add CHANNEL_CONNECTION_UPDATE event and include it in broadcast data preparation

* refactor: simplify channel retrieval logic in WhatsappEventsJob

* refactor: revert CHANNEL_UPDATE_EVENTS constant from ActionCableBroadcastJob

* feat: add 'baileys' as a provider option in Whatsapp channel model

* feat: add provider_connection field to Whatsapp channel model and migration

* refactor: remove unnecessary  CHANNEL_CONNECTION_UPDATE event type

* feat: implement channel provider connection with baileys API

* feat: add inbox association to Whatsapp channel model and update webhook URL handling

* feat: enhance Baileys service to handle webhook multiple event types

* refactor: simplify webhook verification logic in Baileys service

* feat: add setup channel provider call, and refactor some logic

* chore: adapt logic to new API

* refactor: fix typo

* refactor: fix import

* refactor: fix typo

* chore: add fixme comment about race condition

* fix: remove double disconnect call

* feat: implement message processing for incoming WhatsApp messages

* refactor: streamline message type determination and improve readability

* chore: increase cache key granularity

provider connection info might be updated multiple times within 1 second, so updates might be lost due to cache key not being updated. changing cache key to milliseconds solves this

* feat: add `is-loading` to buttons

* feat: update send_message method to use 'to' parameter and improve error handling

* refactor: simplify test setup and update API key in specs

* chore: add setup and disconnect channel provider specs

* test: fix spec after increase cache key granularity

* feat: handle reconnecting state on modal

* style: centered error text

* feat: advanced options on create inbox

* feat: handle new reconnecting on backend

* refactor: update inbox controller specs and leave a FIXME note

* test: add specs for Whatsapp::IncomingMessageBaileysService

* feat: add baileys configuration page

* feat: link device button when disconnected on conversation

* chore: refactor .env.example

* feat: add TODO for unimplemented methods in IncomingMessageBaileysService

* fix: correct method name and update environment variable references in WhatsappBaileysService

* refactor: simplify channel lookup by removing redundant method and handling phone number check directly

* chore: add TODO for unimplemented event processing methods in IncomingMessageBaileysService

* fix: update environment variable references in WhatsappBaileysService tests

* chore(webhook): add pt-BR translations

* chore: add pt-br translations

* chore: inboxname component margin

* refactor: inboxname computed prop

* feat: enhance WhatsApp provider connection handling and message processing

* test: inbox controller

* chore: improve baileys connection and messages handling

* test: incoming message service baileys

* refactor: update provider config validation and improve test setup for WhatsApp Baileys service

* fix: ensure only text messages are sent and update message source ID

* fix: create message

* fix: only update message on success

* test: fix broken specs

* chore: raise error on unsupported message content type

* feat: hide provider connection data from non-admins

* fix: update advanced options

* chore: move class definition

* fix: issue with send_message not returning id

---------

Co-authored-by: gabrieljablonski <contact@gabrieljablonski.com>
2025-04-03 23:28:38 -03:00