2
0

🚸 Rename "webhook" block to "HTTP request"

This commit is contained in:
Baptiste Arnaud
2024-02-16 12:04:25 +01:00
parent 8d50dc9dfa
commit 33cbb2b254
35 changed files with 165 additions and 154 deletions

View File

@ -1,15 +1,15 @@
import {
WebhookBlock,
HttpRequestBlock,
ZapierBlock,
MakeComBlock,
PabblyConnectBlock,
SessionState,
Webhook,
HttpRequest,
Variable,
WebhookResponse,
HttpResponse,
KeyValue,
ChatLog,
ExecutableWebhook,
ExecutableHttpRequest,
AnswerInSessionState,
} from '@typebot.io/schemas'
import { stringify } from 'qs'
@ -28,7 +28,7 @@ import {
import { env } from '@typebot.io/env'
import { parseAnswers } from '@typebot.io/lib/results/parseAnswers'
type ParsedWebhook = ExecutableWebhook & {
type ParsedWebhook = ExecutableHttpRequest & {
basicAuth: { username?: string; password?: string }
isJson: boolean
}
@ -48,7 +48,7 @@ type Params = { disableRequestTimeout?: boolean; timeout?: number }
export const executeWebhookBlock = async (
state: SessionState,
block: WebhookBlock | ZapierBlock | MakeComBlock | PabblyConnectBlock,
block: HttpRequestBlock | ZapierBlock | MakeComBlock | PabblyConnectBlock,
params: Params = {}
): Promise<ExecuteIntegrationResponse> => {
const logs: ChatLog[] = []
@ -57,7 +57,7 @@ export const executeWebhookBlock = async (
('webhookId' in block
? ((await prisma.webhook.findUnique({
where: { id: block.webhookId },
})) as Webhook | null)
})) as HttpRequest | null)
: null)
if (!webhook) return { outgoingEdgeId: block.outgoingEdgeId }
const parsedWebhook = await parseWebhookAttributes(state)({
@ -110,7 +110,7 @@ const parseWebhookAttributes =
webhook,
isCustomBody,
}: {
webhook: Webhook
webhook: HttpRequest
isCustomBody?: boolean
}): Promise<ParsedWebhook | undefined> => {
if (!webhook.url) return
@ -136,7 +136,7 @@ const parseWebhookAttributes =
const headers = convertKeyValueTableToObject(
webhook.headers,
typebot.variables
) as ExecutableWebhook['headers'] | undefined
) as ExecutableHttpRequest['headers'] | undefined
const queryParams = stringify(
convertKeyValueTableToObject(webhook.queryParams, typebot.variables)
)
@ -172,7 +172,7 @@ export const executeWebhook = async (
webhook: ParsedWebhook,
params: Params = {}
): Promise<{
response: WebhookResponse
response: HttpResponse
logs?: ChatLog[]
startTimeShouldBeUpdated?: boolean
}> => {

View File

@ -4,7 +4,7 @@ import {
PabblyConnectBlock,
ChatLog,
VariableWithUnknowValue,
WebhookBlock,
HttpRequestBlock,
ZapierBlock,
} from '@typebot.io/schemas'
import { SessionState } from '@typebot.io/schemas/features/chat/sessionState'
@ -14,7 +14,7 @@ import { updateVariablesInSession } from '@typebot.io/variables/updateVariablesI
type Props = {
state: SessionState
block: WebhookBlock | ZapierBlock | MakeComBlock | PabblyConnectBlock
block: HttpRequestBlock | ZapierBlock | MakeComBlock | PabblyConnectBlock
logs?: ChatLog[]
response: {
statusCode: number

View File

@ -1,7 +1,7 @@
import { parseVariables } from '@/features/variables'
import { IntegrationState } from '@/types'
import {
WebhookBlock,
HttpRequestBlock,
ZapierBlock,
MakeComBlock,
PabblyConnectBlock,
@ -11,7 +11,7 @@ import { stringify } from 'qs'
import { sendRequest, byId } from '@typebot.io/lib'
export const executeWebhook = async (
block: WebhookBlock | ZapierBlock | MakeComBlock | PabblyConnectBlock,
block: HttpRequestBlock | ZapierBlock | MakeComBlock | PabblyConnectBlock,
{
blockId,
variables,

View File

@ -1,7 +1,7 @@
import { ExecutableWebhook } from '@typebot.io/schemas'
import { ExecutableHttpRequest } from '@typebot.io/schemas'
export const executeWebhook = async (
webhookToExecute: ExecutableWebhook
webhookToExecute: ExecutableHttpRequest
): Promise<string> => {
const { url, method, body, headers } = webhookToExecute
try {

View File

@ -1,10 +1,9 @@
import { Webhook as WebhookFromDb } from '@typebot.io/prisma'
import {
Block,
BlockV5,
PublicTypebotV5,
TypebotV5,
Webhook,
HttpRequest,
} from '@typebot.io/schemas'
import { isWebhookBlock, isDefined } from '../utils'
import prisma from '../prisma'
@ -54,9 +53,11 @@ const migrateWebhookBlock =
? {
id: webhook.id,
url: webhook.url ?? undefined,
method: (webhook.method as Webhook['method']) ?? HttpMethod.POST,
headers: (webhook.headers as Webhook['headers']) ?? [],
queryParams: (webhook.queryParams as Webhook['headers']) ?? [],
method:
(webhook.method as HttpRequest['method']) ?? HttpMethod.POST,
headers: (webhook.headers as HttpRequest['headers']) ?? [],
queryParams:
(webhook.queryParams as HttpRequest['headers']) ?? [],
body: webhook.body ?? undefined,
}
: {

View File

@ -7,7 +7,7 @@ import {
WorkspaceRole,
} from '@typebot.io/prisma'
import { createId } from '@paralleldrive/cuid2'
import { Typebot, TypebotV6, Webhook } from '@typebot.io/schemas'
import { Typebot, TypebotV6, HttpRequest } from '@typebot.io/schemas'
import { readFileSync } from 'fs'
import { proWorkspaceId, userId } from './databaseSetup'
import {
@ -154,7 +154,7 @@ export const updateUser = (data: Partial<User>) =>
export const createWebhook = async (
typebotId: string,
webhookProps?: Partial<Webhook>
webhookProps?: Partial<HttpRequest>
) => {
try {
await prisma.webhook.delete({ where: { id: 'webhook1' } })

View File

@ -8,7 +8,7 @@ import type {
Block,
TextInputBlock,
TextBubbleBlock,
WebhookBlock,
HttpRequestBlock,
ImageBubbleBlock,
VideoBubbleBlock,
BlockWithOptionsType,
@ -117,7 +117,7 @@ export const isIntegrationBlock = (block: Block): block is IntegrationBlock =>
) as any[]
).includes(block.type)
export const isWebhookBlock = (block: Block): block is WebhookBlock =>
export const isWebhookBlock = (block: Block): block is HttpRequestBlock =>
[
IntegrationBlockType.WEBHOOK,
IntegrationBlockType.PABBLY_CONNECT,

View File

@ -1,14 +1,14 @@
import { z } from '../../../../zod'
import { IntegrationBlockType } from '../constants'
import { webhookBlockSchemas } from '../webhook'
import { httpBlockSchemas } from '../webhook'
export const makeComBlockSchemas = {
v5: webhookBlockSchemas.v5.merge(
v5: httpBlockSchemas.v5.merge(
z.object({
type: z.enum([IntegrationBlockType.MAKE_COM]),
})
),
v6: webhookBlockSchemas.v6.merge(
v6: httpBlockSchemas.v6.merge(
z.object({
type: z.enum([IntegrationBlockType.MAKE_COM]),
})

View File

@ -1,14 +1,14 @@
import { z } from '../../../../zod'
import { IntegrationBlockType } from '../constants'
import { webhookBlockSchemas } from '../webhook'
import { httpBlockSchemas } from '../webhook'
export const pabblyConnectBlockSchemas = {
v5: webhookBlockSchemas.v5.merge(
v5: httpBlockSchemas.v5.merge(
z.object({
type: z.enum([IntegrationBlockType.PABBLY_CONNECT]),
})
),
v6: webhookBlockSchemas.v6.merge(
v6: httpBlockSchemas.v6.merge(
z.object({
type: z.enum([IntegrationBlockType.PABBLY_CONNECT]),
})

View File

@ -7,7 +7,7 @@ import { pixelBlockSchema } from './pixel/schema'
import { sendEmailBlockSchema } from './sendEmail'
import { zemanticAiBlockSchema } from './zemanticAi'
import { zapierBlockSchemas } from './zapier'
import { webhookBlockSchemas } from './webhook'
import { httpBlockSchemas } from './webhook'
import { makeComBlockSchemas } from './makeCom'
import { pabblyConnectBlockSchemas } from './pabblyConnect'
@ -20,7 +20,7 @@ export const integrationBlockSchemas = {
openAIBlockSchema,
pabblyConnectBlockSchemas.v5,
sendEmailBlockSchema,
webhookBlockSchemas.v5,
httpBlockSchemas.v5,
zapierBlockSchemas.v5,
pixelBlockSchema,
zemanticAiBlockSchema,
@ -33,7 +33,7 @@ export const integrationBlockSchemas = {
openAIBlockSchema,
pabblyConnectBlockSchemas.v6,
sendEmailBlockSchema,
webhookBlockSchemas.v6,
httpBlockSchemas.v6,
zapierBlockSchemas.v6,
pixelBlockSchema,
zemanticAiBlockSchema,

View File

@ -1,4 +1,4 @@
import { WebhookBlockV6 } from './schema'
import { HttpRequestBlockV6 } from './schema'
export enum HttpMethod {
POST = 'POST',
@ -20,7 +20,7 @@ export const defaultWebhookBlockOptions = {
isAdvancedConfig: false,
isCustomBody: false,
isExecutedOnClient: false,
} as const satisfies WebhookBlockV6['options']
} as const satisfies HttpRequestBlockV6['options']
export const defaultTimeout = 10
export const maxTimeout = 120

View File

@ -21,7 +21,7 @@ const keyValueSchema = z.object({
value: z.string().optional(),
})
export const webhookV5Schema = z.object({
export const httpRequestV5Schema = z.object({
id: z.string(),
queryParams: keyValueSchema.array().optional(),
headers: keyValueSchema.array().optional(),
@ -30,61 +30,63 @@ export const webhookV5Schema = z.object({
body: z.string().optional(),
})
const webhookSchemas = {
v5: webhookV5Schema,
v6: webhookV5Schema.omit({
const httpRequestSchemas = {
v5: httpRequestV5Schema,
v6: httpRequestV5Schema.omit({
id: true,
}),
}
const webhookSchema = z.union([webhookSchemas.v5, webhookSchemas.v6])
const httpRequestSchema = z.union([
httpRequestSchemas.v5,
httpRequestSchemas.v6,
])
export const webhookOptionsV5Schema = z.object({
export const httpRequestOptionsV5Schema = z.object({
variablesForTest: z.array(variableForTestSchema).optional(),
responseVariableMapping: z.array(responseVariableMappingSchema).optional(),
isAdvancedConfig: z.boolean().optional(),
isCustomBody: z.boolean().optional(),
isExecutedOnClient: z.boolean().optional(),
webhook: webhookSchemas.v5.optional(),
webhook: httpRequestSchemas.v5.optional(),
timeout: z.number().min(1).max(maxTimeout).optional(),
})
const webhookOptionsSchemas = {
v5: webhookOptionsV5Schema,
v6: webhookOptionsV5Schema.merge(
const httpRequestOptionsSchemas = {
v5: httpRequestOptionsV5Schema,
v6: httpRequestOptionsV5Schema.merge(
z.object({
webhook: webhookSchemas.v6.optional(),
webhook: httpRequestSchemas.v6.optional(),
})
),
}
const webhookBlockV5Schema = blockBaseSchema.merge(
const httpBlockV5Schema = blockBaseSchema.merge(
z.object({
type: z.enum([IntegrationBlockType.WEBHOOK]),
options: webhookOptionsSchemas.v5.optional(),
type: z
.enum([IntegrationBlockType.WEBHOOK])
.describe('Legacy name for HTTP Request block'),
options: httpRequestOptionsSchemas.v5.optional(),
webhookId: z.string().optional(),
})
)
export const webhookBlockSchemas = {
v5: webhookBlockV5Schema,
v6: webhookBlockV5Schema
export const httpBlockSchemas = {
v5: httpBlockV5Schema,
v6: httpBlockV5Schema
.omit({
webhookId: true,
})
.merge(
z.object({
options: webhookOptionsSchemas.v6.optional(),
options: httpRequestOptionsSchemas.v6.optional(),
})
),
}
const webhookBlockSchema = z.union([
webhookBlockSchemas.v5,
webhookBlockSchemas.v6,
])
const httpBlockSchema = z.union([httpBlockSchemas.v5, httpBlockSchemas.v6])
export const executableWebhookSchema = z.object({
export const executableHttpRequestSchema = z.object({
url: z.string(),
headers: z.record(z.string()).optional(),
body: z.unknown().optional(),
@ -93,16 +95,16 @@ export const executableWebhookSchema = z.object({
export type KeyValue = { id: string; key?: string; value?: string }
export type WebhookResponse = {
export type HttpResponse = {
statusCode: number
data?: unknown
}
export type ExecutableWebhook = z.infer<typeof executableWebhookSchema>
export type ExecutableHttpRequest = z.infer<typeof executableHttpRequestSchema>
export type Webhook = z.infer<typeof webhookSchema>
export type WebhookBlock = z.infer<typeof webhookBlockSchema>
export type WebhookBlockV6 = z.infer<typeof webhookBlockSchemas.v6>
export type HttpRequest = z.infer<typeof httpRequestSchema>
export type HttpRequestBlock = z.infer<typeof httpBlockSchema>
export type HttpRequestBlockV6 = z.infer<typeof httpBlockSchemas.v6>
export type ResponseVariableMapping = z.infer<
typeof responseVariableMappingSchema
>

View File

@ -1,14 +1,14 @@
import { z } from '../../../../zod'
import { IntegrationBlockType } from '../constants'
import { webhookBlockSchemas } from '../webhook'
import { httpBlockSchemas } from '../webhook'
export const zapierBlockSchemas = {
v5: webhookBlockSchemas.v5.merge(
v5: httpBlockSchemas.v5.merge(
z.object({
type: z.enum([IntegrationBlockType.ZAPIER]),
})
),
v6: webhookBlockSchemas.v6.merge(
v6: httpBlockSchemas.v6.merge(
z.object({
type: z.enum([IntegrationBlockType.ZAPIER]),
})

View File

@ -3,7 +3,7 @@ import { extendZodWithOpenApi } from 'zod-openapi'
import { listVariableValue } from '../typebot/variable'
import {
googleAnalyticsOptionsSchema,
executableWebhookSchema,
executableHttpRequestSchema,
pixelOptionsSchema,
redirectOptionsSchema,
} from '../blocks'
@ -120,7 +120,7 @@ export const clientSideActionSchema = z.discriminatedUnion('type', [
z
.object({
type: z.literal('webhookToExecute'),
webhookToExecute: executableWebhookSchema,
webhookToExecute: executableHttpRequestSchema,
})
.merge(clientSideActionBaseSchema)
.openapi({