evolution-api icon indicating copy to clipboard operation
evolution-api copied to clipboard

Prisma $executeRawUnsafe() falha com jsonb_array_elements_text em campos que não são arrays

Open leofelipet opened this issue 8 months ago • 2 comments

Welcome!

  • [x] Yes, I have searched for similar issues on GitHub and found none.

What did you do?

Identifiquei um problema ao tentar utilizar as funções de labels.
Ao adicionar o label via API, eu não conseguia remover a API do PostgreSQL via app oficial do WhatsApp.

Em algumas ocasiões a etiqueta era adicionada no contato, mas não era salva no banco de dados.

What did you expect?

Esperava que a adição e remoção de etiquetas acontecessem fluidamente usando a API e que fossem salvas no banco de dados.

What did you observe instead of what you expected?

Alguns erros de console:

ERROR: cannot extract elements from a scalar
Código de erro: 22023 (invalid_parameter_value)
PrismaClientKnownRequestError: Raw query failed. Code: `22023`. Message: `ERROR: cannot extract elements from a scalar`
  • Falha no banco
  • Prisma repassa o erro
  • Se usado via HTTP ou automação, a chamada quebra com 400 Bad Request

Screenshots/Videos

No response

Which version of the API are you using?

2.2.3

What is your environment?

Linux

Other environment specifications

Rodando via Docker com Linux Alpine.

If applicable, paste the log output

ERROR: cannot extract elements from a scalar
SQL state: 22023
Código de erro: invalid_parameter_value
PrismaClientKnownRequestError: 
Invalid `prisma.$executeRawUnsafe()` invocation:

Raw query failed. Code: `22023`. Message: `ERROR: cannot extract elements from a scalar`
{
  "errorMessage": "Bad request - please check your parameters",
  "errorDescription": "Bad Request",
  "errorDetails": {
    "rawErrorMessage": [
      "400 - "{\"status\":400,\"error\":\"Bad Request\",\"response\":{\"message\":[\"Unable to add label to chat\",\"PrismaClientKnownRequestError: \nInvalid `prisma.$executeRawUnsafe()` invocation:\n\n\nRaw query failed. Code: `22023`. Message: `ERROR: cannot extract elements from a scalar`\"]}}""
    ],
    "httpCode": "400"
  }
}

Additional Notes

Eu consegui resolver o problema, pelo menos para o meu uso.
Com auxílio de uma IA, identifiquei o problema no arquivo:
src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts

Atualizei as seguintes funções:
addLabel e removeLabel

Abaixo as funções corrigidas:

private async addLabel(labelId: string, instanceId: string, chatId: string) {
  const id = cuid();

  await this.prismaRepository.$executeRawUnsafe(
    `INSERT INTO "Chat" ("id", "instanceId", "remoteJid", "labels", "createdAt", "updatedAt")
     VALUES ($4, $2, $3, to_jsonb(ARRAY[$1]::text[]), NOW(), NOW()) 
    ON CONFLICT ("instanceId", "remoteJid")
     DO UPDATE
       SET "labels" = (
         SELECT to_jsonb(array_agg(DISTINCT elem))
         FROM (
           SELECT jsonb_array_elements_text(
             CASE 
               WHEN jsonb_typeof("Chat"."labels") = 'array' THEN "Chat"."labels"
               ELSE '[]'::jsonb
             END
           ) AS elem
           UNION
           SELECT $1::text AS elem
         ) sub
       ),
       "updatedAt" = NOW();`,
    labelId,
    instanceId,
    chatId,
    id,
  );
}
private async removeLabel(labelId: string, instanceId: string, chatId: string) {
  const id = cuid();

  await this.prismaRepository.$executeRawUnsafe(
    `INSERT INTO "Chat" ("id", "instanceId", "remoteJid", "labels", "createdAt", "updatedAt")
     VALUES ($4, $2, $3, '[]'::jsonb, NOW(), NOW()) 
    ON CONFLICT ("instanceId", "remoteJid")
     DO UPDATE
       SET "labels" = COALESCE (
         (
           SELECT jsonb_agg(elem)
           FROM (
             SELECT elem
             FROM jsonb_array_elements_text(
               CASE 
                 WHEN jsonb_typeof("Chat"."labels") = 'array' THEN "Chat"."labels"
                 ELSE '[]'::jsonb
               END
             ) AS elem
             WHERE elem <> $1
           ) sub
         ),
         '[]'::jsonb
       ),
       "updatedAt" = NOW();`,
    labelId,
    instanceId,
    chatId,
    id,
  );
}

leofelipet avatar Apr 26 '25 19:04 leofelipet

Uma informação importante, tem um bug na tabela do chat que impede que essa solução seja efetuada. Primeiro precisa corrigir esse bug #1317 para depois resolver o bug que comentei acima.

leofelipet avatar Apr 26 '25 19:04 leofelipet

Show. Também estou com esse problema. Utilizo o docker com o portainer. Como faço pra alterar os arquivos da evolution?

heitorkfh avatar May 03 '25 20:05 heitorkfh