Prisma $executeRawUnsafe() falha com jsonb_array_elements_text em campos que não são arrays
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,
);
}
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.
Show. Também estou com esse problema. Utilizo o docker com o portainer. Como faço pra alterar os arquivos da evolution?