77 lines
2.5 KiB
TypeScript
77 lines
2.5 KiB
TypeScript
import * as sdk from '@botpress/sdk'
|
|
import { AttioApiClient } from '../attio-api'
|
|
import * as bp from '.botpress'
|
|
|
|
export const register: bp.IntegrationProps['register'] = async ({ ctx, client, webhookUrl, logger }) => {
|
|
try {
|
|
const accessToken = ctx.configuration.accessToken
|
|
const attioClient = new AttioApiClient(accessToken)
|
|
|
|
// Test the connection using the API client
|
|
logger.forBot().info('Testing connection to Attio...')
|
|
await attioClient.testConnection()
|
|
logger.forBot().info('Connection to Attio successful')
|
|
|
|
// Check if webhooks already exist
|
|
logger.forBot().info('Checking if webhooks already exist...')
|
|
const { state } = await client.getOrSetState({
|
|
name: 'attioIntegrationInfo',
|
|
type: 'integration',
|
|
id: ctx.integrationId,
|
|
payload: {
|
|
attioWebhookId: '',
|
|
},
|
|
})
|
|
|
|
if (!state.payload.attioWebhookId) {
|
|
logger.forBot().info('Webhooks do not exist. Creating webhooks...')
|
|
const webhookResp = await attioClient.createWebhook({
|
|
data: {
|
|
target_url: webhookUrl,
|
|
subscriptions: [
|
|
{ event_type: 'record.created', filter: null },
|
|
{ event_type: 'record.updated', filter: null },
|
|
{ event_type: 'record.deleted', filter: null },
|
|
],
|
|
},
|
|
})
|
|
const attioWebhookId = String(webhookResp.data.id.webhook_id)
|
|
await client.setState({
|
|
type: 'integration',
|
|
name: 'attioIntegrationInfo',
|
|
id: ctx.integrationId,
|
|
payload: { attioWebhookId },
|
|
})
|
|
}
|
|
|
|
logger.forBot().info('Webhooks created')
|
|
} catch (thrown) {
|
|
const error = thrown instanceof Error ? thrown : new Error(String(thrown))
|
|
throw new sdk.RuntimeError(error.message)
|
|
}
|
|
}
|
|
|
|
export const unregister: bp.IntegrationProps['unregister'] = async ({ ctx, client, logger }) => {
|
|
try {
|
|
const accessToken = ctx.configuration.accessToken
|
|
const attioClient = new AttioApiClient(accessToken)
|
|
|
|
const stateAttioIntegrationInfo = await client.getState({
|
|
id: ctx.integrationId,
|
|
name: 'attioIntegrationInfo',
|
|
type: 'integration',
|
|
})
|
|
|
|
const { state } = stateAttioIntegrationInfo
|
|
const { attioWebhookId } = state.payload
|
|
|
|
if (attioWebhookId) {
|
|
await attioClient.deleteWebhook(attioWebhookId)
|
|
logger.forBot().info('Webhook successfully deleted')
|
|
}
|
|
} catch (thrown) {
|
|
const error = thrown instanceof Error ? thrown : new Error(String(thrown))
|
|
throw new sdk.RuntimeError(error.message)
|
|
}
|
|
}
|