Skip to content

Conversation

@rodps
Copy link

@rodps rodps commented Nov 23, 2025

📋 Description

Quando sincronizamos o nosso whatsapp com o Evolution, as mensagens ficam salvas com o seguinte formato da propriedade 'key':

{
"id": "AC5D7F832B92FA9393B492D9F9B88C20",
"fromMe": true,
"remoteJid": "[email protected]"
}

porém, quando recebemos novas mensagens nos eventos upsert, as mensagens salvas ficam com o seguinte formato:

{
"id": "AC5D7F832B92FA9393B492D9F9B88C20",
"fromMe": true,
"remoteJid": "267628186730669@lid",
"participant": "",
"remoteJidAlt": "[email protected]",
"addressingMode": "lid"
}

Como é possível observar, o remoteJid é salvo com o endereçamento LID e o JID fica na propriedade remoteJidAlt

A alteração proposta pretende corrigir o filtro de busca de mensagens para considerar tanto o remoteJid quando o remoteJidAlt dentro da cláusula OR da função fetchMessages. Atualmente a busca só funciona filtrando por remoteJid ou remoteJidAlt, e não os dois ao mesmo tempo. Por exemplo, se eu quiser filtrar pela requisição abaixo eu não consigo:

{
"where": {
"key": {
"remoteJid": "[email protected]"
"remoteJidAlt": "[email protected]"
}
}
}

Isso busca somente as mensagens com o remoteJid indicado, e não com o remoteJidAlt também.

O objetivo da modificação seria atribuir uma condição OR das duas propriedades: se existir remoteJid OU remoteJidAlt com o valor especificado.

🔗 Related Issue

Closes #(issue_number)

🧪 Type of Change

  • 🐛 Bug fix (non-breaking change which fixes an issue)
  • ✨ New feature (non-breaking change which adds functionality)
  • 💥 Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • 📚 Documentation update
  • 🔧 Refactoring (no functional changes)
  • ⚡ Performance improvement
  • 🧹 Code cleanup
  • 🔒 Security fix

🧪 Testing

  • Manual testing completed
  • Functionality verified in development environment
  • No breaking changes introduced
  • Tested with different connection types (if applicable)

📸 Screenshots (if applicable)

✅ Checklist

  • My code follows the project's style guidelines
  • I have performed a self-review of my code
  • I have commented my code, particularly in hard-to-understand areas
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings
  • [ X I have manually tested my changes thoroughly
  • I have verified the changes work with different scenarios
  • Any dependent changes have been merged and published

📝 Additional Notes

Summary by Sourcery

Bug Fixes:

  • Fix message queries that failed to return results when filtering simultaneously by remoteJid and remoteJidAlt by consolidating these conditions into one OR clause.

@sourcery-ai
Copy link
Contributor

sourcery-ai bot commented Nov 23, 2025

Reviewer's guide (collapsed on small PRs)

Reviewer's Guide

Adjusts WhatsApp Baileys message fetching so remoteJid and remoteJidAlt are handled together via a single OR condition instead of separate filters, ensuring messages can be retrieved regardless of whether the JID is stored in remoteJid or remoteJidAlt.

Sequence diagram for unified remoteJid/remoteJidAlt message fetching

sequenceDiagram
    actor "Client"
    participant "API Server"
    participant "BaileysStartupService"
    participant "Database"

    "Client"->>"API Server": "HTTP request: fetchMessages with keyFilters { remoteJid, remoteJidAlt }"
    "API Server"->>"BaileysStartupService": "call fetchMessages(keyFilters)"

    "BaileysStartupService"->>"BaileysStartupService": "build where clause with AND conditions (id, fromMe, participant, etc.)"
    "BaileysStartupService"->>"BaileysStartupService": "add OR condition for key.remoteJid and key.remoteJidAlt using the same filter value"

    "BaileysStartupService"->>"Database": "query messages with combined OR filter on key.remoteJid and key.remoteJidAlt"
    "Database"-->>"BaileysStartupService": "return messages matching remoteJid OR remoteJidAlt"
    "BaileysStartupService"-->>"API Server": "return unified result set"
    "API Server"-->>"Client": "HTTP response with messages from both addressing modes"
Loading

Flow diagram for building unified remoteJid/remoteJidAlt filter

flowchart TD
    A[Start building fetchMessages filters] --> B{Is keyFilters.id defined?}
    B -->|"Yes"| C(["Add AND condition: key.path ['id'] equals keyFilters.id"])
    B -->|"No"| D[Skip id filter]

    C --> E{Is keyFilters.fromMe defined?}
    D --> E

    E -->|"Yes"| F(["Add AND condition: key.path ['fromMe'] equals keyFilters.fromMe"])
    E -->|"No"| G[Skip fromMe filter]

    F --> H{Is keyFilters.participant defined?}
    G --> H

    H -->|"Yes"| I(["Add AND condition: key.path ['participant'] equals keyFilters.participant"])
    H -->|"No"| J[Skip participant filter]

    I --> K{Is keyFilters.remoteJid or keyFilters.remoteJidAlt defined?}
    J --> K

    K -->|"Yes"| L(["Add OR condition: (key.path ['remoteJid'] equals value) OR (key.path ['remoteJidAlt'] equals value)"])
    K -->|"No"| M[Skip remoteJid/remoteJidAlt filters]

    L --> N[Execute database query with constructed AND and OR filters]
    M --> N

    N --> O[Return messages matching remoteJid OR remoteJidAlt when provided]
Loading

File-Level Changes

Change Details Files
Unify key.remoteJid and key.remoteJidAlt filtering under a shared OR clause in fetchMessages queries so callers can search by either field with a single value.
  • Remove the standalone AND-level filter on key.remoteJid in the message fetch query construction.
  • Rely on the existing OR block that compares the provided JID value against both key.remoteJid and key.remoteJidAlt, ensuring either field can satisfy the condition.
  • Apply the same change to both query paths that build filters for fetching messages, keeping their behavior consistent.
src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

Copy link
Contributor

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey there - I've reviewed your changes - here's some feedback:

  • Consider adding a brief comment near the new OR block explaining why remoteJid is no longer part of the AND filters and is only handled inside OR with remoteJidAlt, so future maintainers understand the changed filtering semantics.
  • If neither remoteJid nor remoteJidAlt is provided in keyFilters, it may be cleaner to skip building the OR block entirely (rather than including an OR with only empty conditions) to avoid constructing unnecessarily complex queries.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- Consider adding a brief comment near the new OR block explaining why remoteJid is no longer part of the AND filters and is only handled inside OR with remoteJidAlt, so future maintainers understand the changed filtering semantics.
- If neither remoteJid nor remoteJidAlt is provided in keyFilters, it may be cleaner to skip building the OR block entirely (rather than including an OR with only empty conditions) to avoid constructing unnecessarily complex queries.

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants