webhook-controller.tsβ’5.9 kB
import {
ALL_PRINCIPAL_TYPES,
EventPayload,
isMultipartFile,
WebhookUrlParams,
} from '@activepieces/shared'
import { FastifyPluginAsyncTypebox } from '@fastify/type-provider-typebox'
import { FastifyRequest } from 'fastify'
import { stepFileService } from '../file/step-file/step-file.service'
import { projectService } from '../project/project-service'
import { WebhookFlowVersionToRun } from './webhook-handler'
import { webhookSimulationService } from './webhook-simulation/webhook-simulation-service'
import { webhookService } from './webhook.service'
export const webhookController: FastifyPluginAsyncTypebox = async (app) => {
app.all(
'/:flowId/sync',
WEBHOOK_PARAMS,
async (request: FastifyRequest<{ Params: WebhookUrlParams }>, reply) => {
const response = await webhookService.handleWebhook({
data: (projectId: string) => convertRequest(request, projectId, request.params.flowId),
logger: request.log,
flowId: request.params.flowId,
async: false,
flowVersionToRun: WebhookFlowVersionToRun.LOCKED_FALL_BACK_TO_LATEST,
saveSampleData: await webhookSimulationService(request.log).exists(
request.params.flowId,
),
execute: true,
})
await reply
.status(response.status)
.headers(response.headers)
.send(response.body)
},
)
app.all(
'/:flowId',
WEBHOOK_PARAMS,
async (request: FastifyRequest<{ Params: WebhookUrlParams }>, reply) => {
const response = await webhookService.handleWebhook({
data: (projectId: string) => convertRequest(request, projectId, request.params.flowId),
logger: request.log,
flowId: request.params.flowId,
async: true,
saveSampleData: await webhookSimulationService(request.log).exists(
request.params.flowId,
),
flowVersionToRun: WebhookFlowVersionToRun.LOCKED_FALL_BACK_TO_LATEST,
execute: true,
})
await reply
.status(response.status)
.headers(response.headers)
.send(response.body)
},
)
app.all('/:flowId/draft/sync', WEBHOOK_PARAMS, async (request, reply) => {
const response = await webhookService.handleWebhook({
data: (projectId: string) => convertRequest(request, projectId, request.params.flowId),
logger: request.log,
flowId: request.params.flowId,
async: false,
saveSampleData: true,
flowVersionToRun: WebhookFlowVersionToRun.LATEST,
execute: true,
})
await reply
.status(response.status)
.headers(response.headers)
.send(response.body)
})
app.all('/:flowId/draft', WEBHOOK_PARAMS, async (request, reply) => {
const response = await webhookService.handleWebhook({
data: (projectId: string) => convertRequest(request, projectId, request.params.flowId),
logger: request.log,
flowId: request.params.flowId,
async: true,
saveSampleData: true,
flowVersionToRun: WebhookFlowVersionToRun.LATEST,
execute: true,
})
await reply
.status(response.status)
.headers(response.headers)
.send(response.body)
})
app.all('/:flowId/test', WEBHOOK_PARAMS, async (request, reply) => {
const response = await webhookService.handleWebhook({
data: (projectId: string) => convertRequest(request, projectId, request.params.flowId),
logger: request.log,
flowId: request.params.flowId,
async: true,
saveSampleData: true,
flowVersionToRun: WebhookFlowVersionToRun.LATEST,
execute: false,
})
await reply
.status(response.status)
.headers(response.headers)
.send(response.body)
})
}
const WEBHOOK_PARAMS = {
config: {
allowedPrincipals: ALL_PRINCIPAL_TYPES,
skipAuth: true,
rawBody: true,
},
schema: {
params: WebhookUrlParams,
},
}
async function convertRequest(
request: FastifyRequest,
projectId: string,
flowId: string,
): Promise<EventPayload> {
return {
method: request.method,
headers: request.headers as Record<string, string>,
body: await convertBody(request, projectId, flowId),
queryParams: request.query as Record<string, string>,
rawBody: request.rawBody,
}
}
async function convertBody(
request: FastifyRequest,
projectId: string,
flowId: string,
): Promise<unknown> {
if (request.isMultipart()) {
const jsonResult: Record<string, unknown> = {}
const requestBodyEntries = Object.entries(
request.body as Record<string, unknown>,
)
const platformId = await projectService.getPlatformId(projectId)
for (const [key, value] of requestBodyEntries) {
if (isMultipartFile(value)) {
const file = await stepFileService(request.log).saveAndEnrich({
data: value.data as Buffer,
fileName: value.filename,
stepName: 'trigger',
flowId,
contentLength: value.data.length,
platformId,
projectId,
})
jsonResult[key] = file.url
}
else {
jsonResult[key] = value
}
}
return jsonResult
}
return request.body
}