mirror of
https://github.com/simstudioai/sim.git
synced 2026-04-06 03:00:16 -04:00
Move all provider-specific subscription create/delete logic from the monolithic provider-subscriptions.ts into individual provider handler files via new createSubscription/deleteSubscription methods on WebhookProviderHandler. Replace the two massive if-else dispatch chains (11 branches each) with simple registry lookups via getProviderHandler(). provider-subscriptions.ts reduced from 2,337 lines to 128 lines (orchestration only). Also migrate polling configuration (gmail, outlook, rss, imap) into provider handlers via configurePolling() method, and challenge/verification handling (slack, whatsapp, teams) via handleChallenge() method. Delete polling-config.ts. Create new handler files for fathom and lemlist providers. Extract shared subscription utilities into subscription-utils.ts. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
92 lines
3.8 KiB
TypeScript
92 lines
3.8 KiB
TypeScript
import { createLogger } from '@sim/logger'
|
|
import { NextResponse } from 'next/server'
|
|
import { airtableHandler } from '@/lib/webhooks/providers/airtable'
|
|
import { ashbyHandler } from '@/lib/webhooks/providers/ashby'
|
|
import { attioHandler } from '@/lib/webhooks/providers/attio'
|
|
import { calcomHandler } from '@/lib/webhooks/providers/calcom'
|
|
import { calendlyHandler } from '@/lib/webhooks/providers/calendly'
|
|
import { circlebackHandler } from '@/lib/webhooks/providers/circleback'
|
|
import { confluenceHandler } from '@/lib/webhooks/providers/confluence'
|
|
import { fathomHandler } from '@/lib/webhooks/providers/fathom'
|
|
import { firefliesHandler } from '@/lib/webhooks/providers/fireflies'
|
|
import { genericHandler } from '@/lib/webhooks/providers/generic'
|
|
import { githubHandler } from '@/lib/webhooks/providers/github'
|
|
import { gmailHandler } from '@/lib/webhooks/providers/gmail'
|
|
import { googleFormsHandler } from '@/lib/webhooks/providers/google-forms'
|
|
import { grainHandler } from '@/lib/webhooks/providers/grain'
|
|
import { hubspotHandler } from '@/lib/webhooks/providers/hubspot'
|
|
import { imapHandler } from '@/lib/webhooks/providers/imap'
|
|
import { jiraHandler } from '@/lib/webhooks/providers/jira'
|
|
import { lemlistHandler } from '@/lib/webhooks/providers/lemlist'
|
|
import { linearHandler } from '@/lib/webhooks/providers/linear'
|
|
import { microsoftTeamsHandler } from '@/lib/webhooks/providers/microsoft-teams'
|
|
import { outlookHandler } from '@/lib/webhooks/providers/outlook'
|
|
import { rssHandler } from '@/lib/webhooks/providers/rss'
|
|
import { slackHandler } from '@/lib/webhooks/providers/slack'
|
|
import { stripeHandler } from '@/lib/webhooks/providers/stripe'
|
|
import { telegramHandler } from '@/lib/webhooks/providers/telegram'
|
|
import { twilioHandler } from '@/lib/webhooks/providers/twilio'
|
|
import { twilioVoiceHandler } from '@/lib/webhooks/providers/twilio-voice'
|
|
import { typeformHandler } from '@/lib/webhooks/providers/typeform'
|
|
import type { WebhookProviderHandler } from '@/lib/webhooks/providers/types'
|
|
import { verifyTokenAuth } from '@/lib/webhooks/providers/utils'
|
|
import { webflowHandler } from '@/lib/webhooks/providers/webflow'
|
|
import { whatsappHandler } from '@/lib/webhooks/providers/whatsapp'
|
|
|
|
const logger = createLogger('WebhookProviderRegistry')
|
|
|
|
const PROVIDER_HANDLERS: Record<string, WebhookProviderHandler> = {
|
|
airtable: airtableHandler,
|
|
ashby: ashbyHandler,
|
|
attio: attioHandler,
|
|
calendly: calendlyHandler,
|
|
calcom: calcomHandler,
|
|
circleback: circlebackHandler,
|
|
confluence: confluenceHandler,
|
|
fireflies: firefliesHandler,
|
|
generic: genericHandler,
|
|
gmail: gmailHandler,
|
|
github: githubHandler,
|
|
google_forms: googleFormsHandler,
|
|
fathom: fathomHandler,
|
|
grain: grainHandler,
|
|
hubspot: hubspotHandler,
|
|
imap: imapHandler,
|
|
jira: jiraHandler,
|
|
lemlist: lemlistHandler,
|
|
linear: linearHandler,
|
|
'microsoft-teams': microsoftTeamsHandler,
|
|
outlook: outlookHandler,
|
|
rss: rssHandler,
|
|
slack: slackHandler,
|
|
stripe: stripeHandler,
|
|
telegram: telegramHandler,
|
|
twilio: twilioHandler,
|
|
twilio_voice: twilioVoiceHandler,
|
|
typeform: typeformHandler,
|
|
webflow: webflowHandler,
|
|
whatsapp: whatsappHandler,
|
|
}
|
|
|
|
/**
|
|
* Default handler for unknown/future providers.
|
|
* Uses timing-safe comparison for bearer token validation.
|
|
*/
|
|
const defaultHandler: WebhookProviderHandler = {
|
|
verifyAuth({ request, requestId, providerConfig }) {
|
|
const token = providerConfig.token
|
|
if (typeof token === 'string') {
|
|
if (!verifyTokenAuth(request, token)) {
|
|
logger.warn(`[${requestId}] Unauthorized webhook access attempt - invalid token`)
|
|
return new NextResponse('Unauthorized', { status: 401 })
|
|
}
|
|
}
|
|
return null
|
|
},
|
|
}
|
|
|
|
/** Look up the provider handler, falling back to the default bearer token handler. */
|
|
export function getProviderHandler(provider: string): WebhookProviderHandler {
|
|
return PROVIDER_HANDLERS[provider] ?? defaultHandler
|
|
}
|