From 8351e20fd30a732d51c09bbe2552fbb4edeec872 Mon Sep 17 00:00:00 2001 From: Baptiste Arnaud Date: Wed, 15 May 2024 17:47:38 +0200 Subject: [PATCH] :bug: (wa) Fix WhatsApp session stuck if state object is empty Closes #1513 --- packages/bot-engine/queries/getSession.ts | 12 ++++++++++-- .../queries/removeIsReplyingInChatSession.ts | 7 +++++++ ...nHasReplying.ts => setIsReplyingInChatSession.ts} | 2 +- packages/bot-engine/whatsapp/resumeWhatsAppFlow.ts | 6 ++++-- 4 files changed, 22 insertions(+), 5 deletions(-) create mode 100644 packages/bot-engine/queries/removeIsReplyingInChatSession.ts rename packages/bot-engine/queries/{setChatSessionHasReplying.ts => setIsReplyingInChatSession.ts} (89%) diff --git a/packages/bot-engine/queries/getSession.ts b/packages/bot-engine/queries/getSession.ts index 014e5f97b..10f012d52 100644 --- a/packages/bot-engine/queries/getSession.ts +++ b/packages/bot-engine/queries/getSession.ts @@ -1,11 +1,19 @@ import prisma from '@typebot.io/lib/prisma' import { sessionStateSchema } from '@typebot.io/schemas' +import { deleteSession } from './deleteSession' export const getSession = async (sessionId: string) => { const session = await prisma.chatSession.findUnique({ where: { id: sessionId }, select: { id: true, state: true, updatedAt: true, isReplying: true }, }) - if (!session) return null - return { ...session, state: sessionStateSchema.parse(session.state) } + if (!session?.state) return null + if (Object.keys(session.state).length === 0) { + await deleteSession(session.id) + return null + } + return { + ...session, + state: sessionStateSchema.parse(session.state), + } } diff --git a/packages/bot-engine/queries/removeIsReplyingInChatSession.ts b/packages/bot-engine/queries/removeIsReplyingInChatSession.ts new file mode 100644 index 000000000..4a583fc83 --- /dev/null +++ b/packages/bot-engine/queries/removeIsReplyingInChatSession.ts @@ -0,0 +1,7 @@ +import prisma from '@typebot.io/lib/prisma' + +export const removeIsReplyingInChatSession = async (id: string) => + prisma.chatSession.updateMany({ + where: { id }, + data: { isReplying: false }, + }) diff --git a/packages/bot-engine/queries/setChatSessionHasReplying.ts b/packages/bot-engine/queries/setIsReplyingInChatSession.ts similarity index 89% rename from packages/bot-engine/queries/setChatSessionHasReplying.ts rename to packages/bot-engine/queries/setIsReplyingInChatSession.ts index 6140f9b04..465bb48c2 100644 --- a/packages/bot-engine/queries/setChatSessionHasReplying.ts +++ b/packages/bot-engine/queries/setIsReplyingInChatSession.ts @@ -4,7 +4,7 @@ type Props = { existingSessionId: string | undefined newSessionId: string } -export const setChatSessionHasReplying = async ({ +export const setIsReplyingInChatSession = async ({ existingSessionId, newSessionId, }: Props) => { diff --git a/packages/bot-engine/whatsapp/resumeWhatsAppFlow.ts b/packages/bot-engine/whatsapp/resumeWhatsAppFlow.ts index 6c04befd5..418a39610 100644 --- a/packages/bot-engine/whatsapp/resumeWhatsAppFlow.ts +++ b/packages/bot-engine/whatsapp/resumeWhatsAppFlow.ts @@ -13,7 +13,8 @@ import { saveStateToDatabase } from '../saveStateToDatabase' import prisma from '@typebot.io/lib/prisma' import { isDefined } from '@typebot.io/lib/utils' import { Reply } from '../types' -import { setChatSessionHasReplying } from '../queries/setChatSessionHasReplying' +import { setIsReplyingInChatSession } from '../queries/setIsReplyingInChatSession' +import { removeIsReplyingInChatSession } from '../queries/removeIsReplyingInChatSession' type Props = { receivedMessage: WhatsAppIncomingMessage @@ -75,7 +76,7 @@ export const resumeWhatsAppFlow = async ({ } } - await setChatSessionHasReplying({ + await setIsReplyingInChatSession({ existingSessionId: session?.id, newSessionId: sessionId, }) @@ -101,6 +102,7 @@ export const resumeWhatsAppFlow = async ({ : { error: 'workspaceId not found' } if ('error' in resumeResponse) { + await removeIsReplyingInChatSession(sessionId) console.log('Chat not starting:', resumeResponse.error) return { message: 'Message received',