73 lines
2.7 KiB
TypeScript
73 lines
2.7 KiB
TypeScript
import { RuntimeError } from '@botpress/sdk'
|
|
import { GoogleAnalyticsClient, parseError, parseJsonObject } from './client'
|
|
import * as bp from '.botpress'
|
|
|
|
export default new bp.Integration({
|
|
register: async ({ ctx, logger }) => {
|
|
try {
|
|
await getClient(ctx).validateConfiguration()
|
|
logger.forBot().info('Google Analytics integration configured successfully')
|
|
} catch (error) {
|
|
throw new RuntimeError(`Failed to configure Google Analytics integration: ${parseError(error)}`)
|
|
}
|
|
},
|
|
unregister: async ({ logger }) => {
|
|
logger.forBot().info('Google Analytics integration unregistered')
|
|
},
|
|
actions: {
|
|
trackNode: async ({ ctx, input, logger }) => {
|
|
logger.forBot().info(`Tracking Google Analytics page view for node "${input.nodeId}"`)
|
|
|
|
try {
|
|
await getClient(ctx).trackEvent(input.userId, 'page_view', {
|
|
page_title: input.nodeId,
|
|
})
|
|
logger.forBot().info(`Tracked Google Analytics page view for node "${input.nodeId}"`)
|
|
return {}
|
|
} catch (error) {
|
|
throw new RuntimeError(`Failed to track node "${input.nodeId}" in Google Analytics: ${parseError(error)}`)
|
|
}
|
|
},
|
|
trackEvent: async ({ ctx, input, logger }) => {
|
|
logger.forBot().info(`Tracking Google Analytics event "${input.eventName}"`)
|
|
|
|
try {
|
|
const eventPayload = parseJsonObject(input.eventPayload, 'eventPayload')
|
|
|
|
await getClient(ctx).trackEvent(input.userId, input.eventName, eventPayload)
|
|
logger.forBot().info(`Tracked Google Analytics event "${input.eventName}"`)
|
|
return {}
|
|
} catch (error) {
|
|
throw new RuntimeError(`Failed to track event "${input.eventName}" in Google Analytics: ${parseError(error)}`)
|
|
}
|
|
},
|
|
updateUserProfile: async ({ ctx, input, logger }) => {
|
|
logger.forBot().info(`Updating Google Analytics user profile for "${input.userId}"`)
|
|
|
|
try {
|
|
const userProfile = parseJsonObject(input.userProfile, 'userProfile')
|
|
|
|
await getClient(ctx).updateUserProfile(input.userId, userProfile)
|
|
logger.forBot().info(`Updated Google Analytics user profile for "${input.userId}"`)
|
|
return {}
|
|
} catch (error) {
|
|
throw new RuntimeError(
|
|
`Failed to update user profile for "${input.userId}" in Google Analytics: ${parseError(error)}`
|
|
)
|
|
}
|
|
},
|
|
},
|
|
channels: {},
|
|
handler: async () => {},
|
|
})
|
|
|
|
function getClient(ctx: bp.Context): GoogleAnalyticsClient {
|
|
const { measurementId, apiSecret } = ctx.configuration
|
|
|
|
if (!measurementId || !apiSecret) {
|
|
throw new RuntimeError('Google Analytics Measurement ID and API Secret are required.')
|
|
}
|
|
|
|
return new GoogleAnalyticsClient(measurementId, apiSecret)
|
|
}
|