♻️ Introduce typebot v6 with events (#1013)

Closes #885
This commit is contained in:
Baptiste Arnaud
2023-11-08 15:34:16 +01:00
committed by GitHub
parent 68e4fc71fb
commit 35300eaf34
634 changed files with 58971 additions and 31449 deletions

View File

@@ -57,6 +57,7 @@ export const sendMessageV1 = publicProcedure
logs,
clientSideActions,
newSessionState,
visitedEdges,
} = await startSession({
version: 1,
startParams,
@@ -77,6 +78,7 @@ export const sendMessageV1 = publicProcedure
input,
logs: allLogs,
clientSideActions,
visitedEdges,
})
return {
@@ -103,6 +105,7 @@ export const sendMessageV1 = publicProcedure
newSessionState,
logs,
lastMessageNewFormat,
visitedEdges,
} = await continueBotFlow(message, { version: 1, state: session.state })
const allLogs = clientLogs ? [...(logs ?? []), ...clientLogs] : logs
@@ -116,6 +119,7 @@ export const sendMessageV1 = publicProcedure
input,
logs: allLogs,
clientSideActions,
visitedEdges,
})
return {

View File

@@ -57,6 +57,7 @@ export const sendMessageV2 = publicProcedure
logs,
clientSideActions,
newSessionState,
visitedEdges,
} = await startSession({
version: 2,
startParams,
@@ -77,6 +78,7 @@ export const sendMessageV2 = publicProcedure
input,
logs: allLogs,
clientSideActions,
visitedEdges,
})
return {
@@ -103,6 +105,7 @@ export const sendMessageV2 = publicProcedure
newSessionState,
logs,
lastMessageNewFormat,
visitedEdges,
} = await continueBotFlow(message, { version: 2, state: session.state })
const allLogs = clientLogs ? [...(logs ?? []), ...clientLogs] : logs
@@ -116,6 +119,7 @@ export const sendMessageV2 = publicProcedure
input,
logs: allLogs,
clientSideActions,
visitedEdges,
})
return {

View File

@@ -94,7 +94,7 @@ const updateSessionState = (
},
}
: typebotInQueue
),
) as SessionState['typebotsQueue'],
})
const updateVariablesInSession = (

View File

@@ -1,17 +1,19 @@
import { publicProcedure } from '@/helpers/server/trpc'
import { TRPCError } from '@trpc/server'
import {
Block,
FileInputBlock,
InputBlockType,
LogicBlockType,
PublicTypebot,
TypebotLinkBlock,
parseGroups,
} from '@typebot.io/schemas'
import { byId, isDefined } from '@typebot.io/lib'
import { z } from 'zod'
import { generatePresignedUrl } from '@typebot.io/lib/s3/deprecated/generatePresignedUrl'
import { env } from '@typebot.io/env'
import prisma from '@typebot.io/lib/prisma'
import { InputBlockType } from '@typebot.io/schemas/features/blocks/inputs/constants'
import { LogicBlockType } from '@typebot.io/schemas/features/blocks/logic/constants'
import { PublicTypebot } from '@typebot.io/prisma'
export const getUploadUrl = publicProcedure
.meta({
@@ -45,13 +47,20 @@ export const getUploadUrl = publicProcedure
'S3 not properly configured. Missing one of those variables: S3_ENDPOINT, S3_ACCESS_KEY, S3_SECRET_KEY',
})
const publicTypebot = (await prisma.publicTypebot.findFirst({
const publicTypebot = await prisma.publicTypebot.findFirst({
where: { typebotId },
select: {
version: true,
groups: true,
typebotId: true,
},
})) as Pick<PublicTypebot, 'groups' | 'typebotId'>
})
if (!publicTypebot)
throw new TRPCError({
code: 'BAD_REQUEST',
message: 'Typebot not found',
})
const fileUploadBlock = await getFileUploadBlock(publicTypebot, blockId)
@@ -73,27 +82,32 @@ export const getUploadUrl = publicProcedure
})
const getFileUploadBlock = async (
publicTypebot: Pick<PublicTypebot, 'groups' | 'typebotId'>,
publicTypebot: Pick<PublicTypebot, 'groups' | 'typebotId' | 'version'>,
blockId: string
): Promise<FileInputBlock | null> => {
const fileUploadBlock = publicTypebot.groups
.flatMap((group) => group.blocks)
const groups = parseGroups(publicTypebot.groups, {
typebotVersion: publicTypebot.version,
})
const fileUploadBlock = groups
.flatMap<Block>((group) => group.blocks)
.find(byId(blockId))
if (fileUploadBlock?.type === InputBlockType.FILE) return fileUploadBlock
const linkedTypebotIds = publicTypebot.groups
.flatMap((group) => group.blocks)
const linkedTypebotIds = groups
.flatMap<Block>((group) => group.blocks)
.filter((block) => block.type === LogicBlockType.TYPEBOT_LINK)
.flatMap((block) => (block as TypebotLinkBlock).options.typebotId)
.flatMap((block) => (block as TypebotLinkBlock).options?.typebotId)
.filter(isDefined)
const linkedTypebots = (await prisma.publicTypebot.findMany({
const linkedTypebots = await prisma.publicTypebot.findMany({
where: { typebotId: { in: linkedTypebotIds } },
select: {
groups: true,
},
})) as Pick<PublicTypebot, 'groups'>[]
const fileUploadBlockFromLinkedTypebots = linkedTypebots
.flatMap((typebot) => typebot.groups)
.flatMap((group) => group.blocks)
})
const fileUploadBlockFromLinkedTypebots = parseGroups(
linkedTypebots.flatMap((typebot) => typebot.groups),
{ typebotVersion: publicTypebot.version }
)
.flatMap<Block>((group) => group.blocks)
.find(byId(blockId))
if (fileUploadBlockFromLinkedTypebots?.type === InputBlockType.FILE)
return fileUploadBlockFromLinkedTypebots

View File

@@ -3,9 +3,11 @@ import { TRPCError } from '@trpc/server'
import { z } from 'zod'
import { generatePresignedPostPolicy } from '@typebot.io/lib/s3/generatePresignedPostPolicy'
import { env } from '@typebot.io/env'
import { InputBlockType, publicTypebotSchema } from '@typebot.io/schemas'
import prisma from '@typebot.io/lib/prisma'
import { getSession } from '@typebot.io/bot-engine/queries/getSession'
import { parseGroups } from '@typebot.io/schemas'
import { InputBlockType } from '@typebot.io/schemas/features/blocks/inputs/constants'
import { getBlockById } from '@typebot.io/lib/getBlockById'
export const generateUploadUrl = publicProcedure
.meta({
@@ -56,6 +58,7 @@ export const generateUploadUrl = publicProcedure
typebotId: filePathProps.typebotId,
},
select: {
version: true,
groups: true,
typebot: {
select: {
@@ -75,8 +78,9 @@ export const generateUploadUrl = publicProcedure
const filePath = `public/workspaces/${workspaceId}/typebots/${filePathProps.typebotId}/results/${filePathProps.resultId}/${filePathProps.fileName}`
const fileUploadBlock = publicTypebotSchema._def.schema.shape.groups
.parse(publicTypebot.groups)
const fileUploadBlock = parseGroups(publicTypebot.groups, {
typebotVersion: publicTypebot.version,
})
.flatMap((group) => group.blocks)
.find((block) => block.id === filePathProps.blockId)
@@ -90,7 +94,7 @@ export const generateUploadUrl = publicProcedure
fileType,
filePath,
maxFileSize:
fileUploadBlock.options.sizeLimit ??
fileUploadBlock.options?.sizeLimit ??
env.NEXT_PUBLIC_BOT_FILE_UPLOAD_MAX_SIZE,
})
@@ -118,6 +122,7 @@ export const generateUploadUrl = publicProcedure
typebotId,
},
select: {
version: true,
groups: true,
typebot: {
select: {
@@ -139,10 +144,18 @@ export const generateUploadUrl = publicProcedure
const filePath = `public/workspaces/${workspaceId}/typebots/${typebotId}/results/${resultId}/${filePathProps.fileName}`
const fileUploadBlock = publicTypebotSchema._def.schema.shape.groups
.parse(publicTypebot.groups)
.flatMap((group) => group.blocks)
.find((block) => block.id === session.state.currentBlock?.blockId)
if (session.state.currentBlockId === undefined)
throw new TRPCError({
code: 'BAD_REQUEST',
message: "Can't find currentBlockId in session state",
})
const { block: fileUploadBlock } = getBlockById(
session.state.currentBlockId,
parseGroups(publicTypebot.groups, {
typebotVersion: publicTypebot.version,
})
)
if (fileUploadBlock?.type !== InputBlockType.FILE)
throw new TRPCError({
@@ -154,8 +167,9 @@ export const generateUploadUrl = publicProcedure
fileType,
filePath,
maxFileSize:
fileUploadBlock.options.sizeLimit ??
env.NEXT_PUBLIC_BOT_FILE_UPLOAD_MAX_SIZE,
fileUploadBlock.options && 'sizeLimit' in fileUploadBlock.options
? fileUploadBlock.options.sizeLimit
: env.NEXT_PUBLIC_BOT_FILE_UPLOAD_MAX_SIZE,
})
return {