chore: import upstream snapshot with attribution

This commit is contained in:
wehub-resource-sync
2026-07-13 13:34:48 +08:00
commit 77bb5bf71f
3762 changed files with 353249 additions and 0 deletions
+80
View File
@@ -0,0 +1,80 @@
import * as error from './error'
import * as table from './table'
import * as vanilla from './vanilla-client'
import * as bp from '.botpress'
const synchronize = async (props: bp.EventHandlerProps | bp.ActionHandlerProps): Promise<{ nextToken?: string }> => {
const { state } = await props.client
.getOrSetState({
type: 'bot',
id: props.ctx.botId,
name: 'job',
payload: { nextToken: undefined },
})
.catch(error.mapError('Failed to get state "job"'))
const { nextToken } = state.payload
props.logger.info('Synchronizing...', nextToken)
const { client, configuration, actions } = props
const nextPage = await actions.listable.list({ nextToken }).catch(error.mapError('Failed to list items'))
await table.createTableIfNotExist(props, nextPage.items[0]).catch(error.mapError('Failed to create table'))
await vanilla
.clientFrom(client)
.upsertTableRows({
table: configuration.tableName,
rows: nextPage.items.map(table.escapeObject),
keyColumn: table.PRIMARY_KEY,
})
.catch(error.mapError('Failed to upsert table rows'))
await props.client
.setState({
type: 'bot',
id: props.ctx.botId,
name: 'job',
payload: { nextToken: nextPage.meta.nextToken },
})
.catch(error.mapError('Failed to set state "job"'))
return { nextToken: nextPage.meta.nextToken }
}
const plugin = new bp.Plugin({
actions: {
synchronize: async (props) => {
const { nextToken } = await synchronize(props)
return { itemsLeft: !!nextToken }
},
clear: async (props) => {
await table.deleteTableIfExist(props)
return {}
},
},
})
plugin.on.event('listItems', async (props) => {
const { event, logger } = props
logger.info(`### Event "${event.type}"`, event.payload)
await synchronize(props)
})
plugin.on.event('rowDeleted', async (props) => {
const { actions, event, logger } = props
logger.info(`### Event "${event.type}"`, event.payload)
await actions.deletable.delete({ id: props.event.payload.row.id })
})
plugin.on.event('deletable:deleted', async (props) => {
const { client, configuration, event, logger } = props
logger.info(`### Event "${event.type}"`, event.payload)
await vanilla.clientFrom(client).deleteTableRows({
table: configuration.tableName,
filter: { [table.PRIMARY_KEY]: { $eq: props.event.payload.id } },
})
})
export default plugin