Skip to content

Commit 6b776c5

Browse files
committed
fix(webhooks): lifecycle code accuracy
1 parent 2cee30f commit 6b776c5

File tree

4 files changed

+905
-1077
lines changed

4 files changed

+905
-1077
lines changed

apps/sim/app/api/webhooks/[id]/route.ts

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@ import { getSession } from '@/lib/auth'
77
import { validateInteger } from '@/lib/core/security/input-validation'
88
import { PlatformEvents } from '@/lib/core/telemetry'
99
import { generateRequestId } from '@/lib/core/utils/request'
10+
import {
11+
cleanupExternalWebhook,
12+
createExternalWebhookSubscription,
13+
shouldRecreateExternalWebhookSubscription,
14+
} from '@/lib/webhooks/provider-subscriptions'
1015
import { getUserEntityPermissions } from '@/lib/workspaces/permissions/utils'
1116

1217
const logger = createLogger('WebhookAPI')
@@ -177,6 +182,46 @@ export async function PATCH(request: NextRequest, { params }: { params: Promise<
177182
return NextResponse.json({ error: 'Access denied' }, { status: 403 })
178183
}
179184

185+
const existingProviderConfig =
186+
(webhookData.webhook.providerConfig as Record<string, unknown>) || {}
187+
let nextProviderConfig =
188+
providerConfig !== undefined &&
189+
resolvedProviderConfig &&
190+
typeof resolvedProviderConfig === 'object'
191+
? (resolvedProviderConfig as Record<string, unknown>)
192+
: existingProviderConfig
193+
const nextProvider = (provider ?? webhookData.webhook.provider) as string
194+
195+
if (
196+
providerConfig !== undefined &&
197+
shouldRecreateExternalWebhookSubscription({
198+
previousProvider: webhookData.webhook.provider as string,
199+
nextProvider,
200+
previousConfig: existingProviderConfig,
201+
nextConfig: nextProviderConfig,
202+
})
203+
) {
204+
await cleanupExternalWebhook(
205+
{ ...webhookData.webhook, providerConfig: existingProviderConfig },
206+
webhookData.workflow,
207+
requestId
208+
)
209+
210+
const result = await createExternalWebhookSubscription(
211+
request,
212+
{
213+
...webhookData.webhook,
214+
provider: nextProvider,
215+
providerConfig: nextProviderConfig,
216+
},
217+
webhookData.workflow,
218+
session.user.id,
219+
requestId
220+
)
221+
222+
nextProviderConfig = result.updatedProviderConfig as Record<string, unknown>
223+
}
224+
180225
logger.debug(`[${requestId}] Updating webhook properties`, {
181226
hasPathUpdate: path !== undefined,
182227
hasProviderUpdate: provider !== undefined,
@@ -188,16 +233,16 @@ export async function PATCH(request: NextRequest, { params }: { params: Promise<
188233
// Merge providerConfig to preserve credential-related fields
189234
let finalProviderConfig = webhooks[0].webhook.providerConfig
190235
if (providerConfig !== undefined) {
191-
const existingConfig = (webhooks[0].webhook.providerConfig as Record<string, unknown>) || {}
236+
const existingConfig = existingProviderConfig
192237
finalProviderConfig = {
193-
...resolvedProviderConfig,
238+
...nextProviderConfig,
194239
credentialId: existingConfig.credentialId,
195240
credentialSetId: existingConfig.credentialSetId,
196241
userId: existingConfig.userId,
197242
historyId: existingConfig.historyId,
198243
lastCheckedTimestamp: existingConfig.lastCheckedTimestamp,
199244
setupCompleted: existingConfig.setupCompleted,
200-
externalId: existingConfig.externalId,
245+
externalId: nextProviderConfig.externalId ?? existingConfig.externalId,
201246
}
202247
}
203248

0 commit comments

Comments
 (0)