2
0
Files
bot/packages/bot-engine/saveStateToDatabase.ts
2024-05-15 14:24:55 +02:00

81 lines
2.1 KiB
TypeScript

import {
ContinueChatResponse,
ChatSession,
SetVariableHistoryItem,
} from '@typebot.io/schemas'
import { upsertResult } from './queries/upsertResult'
import { updateSession } from './queries/updateSession'
import { createSession } from './queries/createSession'
import { deleteSession } from './queries/deleteSession'
import { Prisma, VisitedEdge } from '@typebot.io/prisma'
import prisma from '@typebot.io/lib/prisma'
type Props = {
session: Pick<ChatSession, 'state'> & { id?: string }
input: ContinueChatResponse['input']
logs: ContinueChatResponse['logs']
clientSideActions: ContinueChatResponse['clientSideActions']
visitedEdges: VisitedEdge[]
setVariableHistory: SetVariableHistoryItem[]
hasCustomEmbedBubble?: boolean
initialSessionId?: string
}
export const saveStateToDatabase = async ({
session: { state, id },
input,
logs,
clientSideActions,
visitedEdges,
setVariableHistory,
hasCustomEmbedBubble,
initialSessionId,
}: Props) => {
const containsSetVariableClientSideAction = clientSideActions?.some(
(action) => action.expectsDedicatedReply
)
const isCompleted = Boolean(
!input && !containsSetVariableClientSideAction && !hasCustomEmbedBubble
)
const queries: Prisma.PrismaPromise<any>[] = []
const resultId = state.typebotsQueue[0].resultId
if (id) {
if (isCompleted && resultId) queries.push(deleteSession(id))
else queries.push(updateSession({ id, state, isReplying: false }))
}
const session = id
? { state, id }
: await createSession({ id: initialSessionId, state, isReplying: false })
if (!resultId) {
if (queries.length > 0) await prisma.$transaction(queries)
return session
}
const answers = state.typebotsQueue[0].answers
queries.push(
upsertResult({
resultId,
typebot: state.typebotsQueue[0].typebot,
isCompleted: Boolean(
!input && !containsSetVariableClientSideAction && answers.length > 0
),
hasStarted: answers.length > 0,
lastChatSessionId: session.id,
logs,
visitedEdges,
setVariableHistory,
})
)
await prisma.$transaction(queries)
return session
}