feat: support webhook-manager (#1152)
Reviewed-on: daoyoucloud/tachybase#1152
This commit is contained in:
parent
dd6dd616d3
commit
7ef88ad093
@ -13,5 +13,9 @@
|
||||
"koa": "^2.13.4",
|
||||
"lodash": "4.17.21",
|
||||
"sequelize": "^6.26.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/koa": "^2.15.0",
|
||||
"@types/lodash": "^4.17.5"
|
||||
}
|
||||
}
|
||||
|
@ -1,8 +1,10 @@
|
||||
import { Cache } from '@tachybase/cache';
|
||||
import { Database } from '@tachybase/database';
|
||||
import { Action } from '@tachybase/resourcer';
|
||||
|
||||
import Koa from 'koa';
|
||||
import lodash from 'lodash';
|
||||
|
||||
import * as actions from './actions';
|
||||
|
||||
export * as utils from './utils';
|
||||
@ -18,6 +20,11 @@ export interface Context extends Koa.Context {
|
||||
body: any;
|
||||
app: any;
|
||||
|
||||
/**
|
||||
* 是否包裹 data 对象,比如返回的 body 为 "success",withoutDataWrapping 为 false 的时候,返回的 body 会被包成 { "data": "success" }
|
||||
*/
|
||||
withoutDataWrapping?: boolean;
|
||||
|
||||
[key: string]: any;
|
||||
}
|
||||
|
||||
|
@ -21,7 +21,7 @@ import { Telemetry, TelemetryOptions } from '@tachybase/telemetry';
|
||||
import { applyMixins, AsyncEmitter, importModule, Toposort, ToposortOptions } from '@tachybase/utils';
|
||||
|
||||
import { Command, CommandOptions, ParseOptions } from 'commander';
|
||||
import glob from 'glob';
|
||||
import { sync } from 'glob';
|
||||
import { i18n, InitOptions } from 'i18next';
|
||||
import Koa, { DefaultContext as KoaDefaultContext, DefaultState as KoaDefaultState } from 'koa';
|
||||
import compose from 'koa-compose';
|
||||
@ -643,7 +643,7 @@ export class Application<StateT = DefaultState, ContextT = DefaultContext> exten
|
||||
};
|
||||
const extensions = ['js', 'ts'];
|
||||
const patten = `${directory}/*.{${extensions.join(',')}}`;
|
||||
const files = glob.sync(patten, {
|
||||
const files = sync(patten, {
|
||||
ignore: ['**/*.d.ts'],
|
||||
});
|
||||
const appVersion = await this.version.get();
|
||||
|
@ -1,5 +1,5 @@
|
||||
import { Context, Next } from '@tachybase/actions';
|
||||
import stream from 'stream';
|
||||
import { Context, Next } from '@tachybase/actions';
|
||||
|
||||
export function dataWrapping() {
|
||||
return async function dataWrapping(ctx: Context, next: Next) {
|
||||
|
@ -9,11 +9,12 @@ import { getSSKey, TokenConfigurationResourceKey, useMapConfiguration } from '..
|
||||
|
||||
interface BaseConfigurationProps {
|
||||
type: 'feishu';
|
||||
children: React.ReactNode;
|
||||
}
|
||||
|
||||
export const TokenTypes = [{ label: '飞书', value: 'feishu' }];
|
||||
|
||||
const BaseConfiguration: React.FC<BaseConfigurationProps> = ({ type, children }) => {
|
||||
const BaseConfiguration = ({ type, children }: BaseConfigurationProps) => {
|
||||
const [isDisabled, disableAction] = useBoolean(false);
|
||||
const apiClient = useAPIClient();
|
||||
const [form] = Form.useForm();
|
||||
|
@ -0,0 +1,687 @@
|
||||
import React from 'react';
|
||||
import { ExtendCollectionsProvider, SchemaComponent } from '@tachybase/client';
|
||||
import { ISchema } from '@tachybase/schema';
|
||||
|
||||
import { tval } from '../locale';
|
||||
|
||||
const collection = {
|
||||
name: 'webhooks',
|
||||
fields: [
|
||||
{
|
||||
type: 'string',
|
||||
name: 'name',
|
||||
interface: 'input',
|
||||
uiSchema: {
|
||||
title: tval('name'),
|
||||
type: 'string',
|
||||
'x-component': 'Input',
|
||||
required: true,
|
||||
} as ISchema,
|
||||
},
|
||||
{
|
||||
type: 'boolean',
|
||||
name: 'enabled',
|
||||
interface: 'radioGroup',
|
||||
uiSchema: {
|
||||
title: tval('Enabled'),
|
||||
type: 'string',
|
||||
enum: [
|
||||
{ label: tval('On'), value: true, color: '#52c41a' },
|
||||
{ label: tval('Off'), value: false },
|
||||
],
|
||||
'x-component': 'Radio.Group',
|
||||
'x-decorator': 'FormItem',
|
||||
default: false,
|
||||
} as ISchema,
|
||||
},
|
||||
{
|
||||
type: 'string',
|
||||
name: 'type',
|
||||
interface: 'radioGroup',
|
||||
uiSchema: {
|
||||
title: tval('Type'),
|
||||
type: 'string',
|
||||
enum: [
|
||||
{ label: tval('Code'), value: 'code' },
|
||||
{ label: tval('Plugin'), value: 'plugin', disabled: true },
|
||||
],
|
||||
'x-component': 'Radio.Group',
|
||||
'x-decorator': 'FormItem',
|
||||
default: 'code',
|
||||
} as ISchema,
|
||||
},
|
||||
{
|
||||
type: 'text',
|
||||
name: 'code',
|
||||
interface: 'textarea',
|
||||
uiSchema: {
|
||||
title: tval('Code'),
|
||||
type: 'string',
|
||||
'x-component': 'Input.TextArea',
|
||||
} as ISchema,
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
const schema: ISchema = {
|
||||
type: 'void',
|
||||
properties: {
|
||||
table: {
|
||||
type: 'void',
|
||||
'x-decorator': 'TableBlockProvider',
|
||||
'x-acl-action': 'webhooks:list',
|
||||
'x-use-decorator-props': 'useTableBlockDecoratorProps',
|
||||
'x-decorator-props': {
|
||||
collection,
|
||||
dataSource: 'main',
|
||||
action: 'list',
|
||||
params: {
|
||||
pageSize: 20,
|
||||
},
|
||||
rowKey: 'id',
|
||||
showIndex: true,
|
||||
dragSort: false,
|
||||
},
|
||||
'x-component': 'CardItem',
|
||||
'x-filter-targets': [],
|
||||
properties: {
|
||||
actions: {
|
||||
type: 'void',
|
||||
'x-component': 'ActionBar',
|
||||
'x-component-props': {
|
||||
style: {
|
||||
marginBottom: 'var(--tb-spacing)',
|
||||
},
|
||||
},
|
||||
properties: {
|
||||
z8monqcdrdn: {
|
||||
type: 'void',
|
||||
'x-action': 'create',
|
||||
'x-acl-action': 'create',
|
||||
title: "{{t('Add new')}}",
|
||||
'x-component': 'Action',
|
||||
'x-decorator': 'ACLActionProvider',
|
||||
'x-component-props': {
|
||||
openMode: 'drawer',
|
||||
type: 'primary',
|
||||
component: 'CreateRecordAction',
|
||||
icon: 'PlusOutlined',
|
||||
},
|
||||
'x-align': 'right',
|
||||
'x-acl-action-props': {
|
||||
skipScopeCheck: true,
|
||||
},
|
||||
properties: {
|
||||
drawer: {
|
||||
type: 'void',
|
||||
title: '{{ t("Add record") }}',
|
||||
'x-component': 'Action.Container',
|
||||
'x-component-props': {
|
||||
className: 'nb-action-popup',
|
||||
},
|
||||
properties: {
|
||||
tabs: {
|
||||
type: 'void',
|
||||
'x-component': 'Tabs',
|
||||
'x-component-props': {},
|
||||
properties: {
|
||||
tab1: {
|
||||
type: 'void',
|
||||
title: '{{t("Add new")}}',
|
||||
'x-component': 'Tabs.TabPane',
|
||||
'x-component-props': {},
|
||||
properties: {
|
||||
grid: {
|
||||
type: 'void',
|
||||
'x-component': 'Grid',
|
||||
properties: {
|
||||
ei36i9ijtdz: {
|
||||
type: 'void',
|
||||
'x-component': 'Grid.Row',
|
||||
properties: {
|
||||
uf8t2a39414: {
|
||||
type: 'void',
|
||||
'x-component': 'Grid.Col',
|
||||
properties: {
|
||||
xkkjkzn90fv: {
|
||||
type: 'void',
|
||||
'x-acl-action-props': {
|
||||
skipScopeCheck: true,
|
||||
},
|
||||
'x-acl-action': 'webhooks:create',
|
||||
'x-decorator': 'FormBlockProvider',
|
||||
'x-use-decorator-props': 'useCreateFormBlockDecoratorProps',
|
||||
'x-decorator-props': {
|
||||
dataSource: 'main',
|
||||
collection,
|
||||
},
|
||||
'x-component': 'CardItem',
|
||||
properties: {
|
||||
'5gbs46leolu': {
|
||||
type: 'void',
|
||||
'x-component': 'FormV2',
|
||||
'x-use-component-props': 'useCreateFormBlockProps',
|
||||
properties: {
|
||||
'9tt9z4mql3z': {
|
||||
type: 'void',
|
||||
'x-component': 'ActionBar',
|
||||
'x-component-props': {
|
||||
style: {
|
||||
marginBottom: 24,
|
||||
},
|
||||
},
|
||||
properties: {
|
||||
gqrnx8zyjp1: {
|
||||
title: '{{t("Submit")}}',
|
||||
'x-action': 'submit',
|
||||
'x-component': 'Action',
|
||||
'x-component-props': {
|
||||
type: 'primary',
|
||||
htmlType: 'submit',
|
||||
useProps: '{{ useCreateActionProps }}',
|
||||
},
|
||||
'x-action-settings': {
|
||||
assignedValues: {},
|
||||
triggerWorkflows: [],
|
||||
pageMode: false,
|
||||
},
|
||||
type: 'void',
|
||||
},
|
||||
},
|
||||
},
|
||||
grid: {
|
||||
type: 'void',
|
||||
'x-component': 'Grid',
|
||||
properties: {
|
||||
'5sakq51jsle': {
|
||||
type: 'void',
|
||||
'x-component': 'Grid.Row',
|
||||
properties: {
|
||||
'6p28yhfkrbi': {
|
||||
type: 'void',
|
||||
'x-component': 'Grid.Col',
|
||||
properties: {
|
||||
name: {
|
||||
type: 'string',
|
||||
'x-component': 'CollectionField',
|
||||
'x-decorator': 'FormItem',
|
||||
'x-collection-field': 'webhooks.name',
|
||||
'x-component-props': {},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
y7idu8knr7g: {
|
||||
type: 'void',
|
||||
'x-component': 'Grid.Row',
|
||||
properties: {
|
||||
zbq1q6f85lf: {
|
||||
type: 'void',
|
||||
'x-component': 'Grid.Col',
|
||||
properties: {
|
||||
enabled: {
|
||||
type: 'string',
|
||||
'x-component': 'CollectionField',
|
||||
'x-decorator': 'FormItem',
|
||||
'x-collection-field': 'webhooks.enabled',
|
||||
'x-component-props': {},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
hmyd06j1xh1: {
|
||||
type: 'void',
|
||||
'x-component': 'Grid.Row',
|
||||
properties: {
|
||||
'6l4tt4kcu2h': {
|
||||
type: 'void',
|
||||
'x-component': 'Grid.Col',
|
||||
properties: {
|
||||
workflow: {
|
||||
type: 'string',
|
||||
'x-component': 'CollectionField',
|
||||
'x-decorator': 'FormItem',
|
||||
'x-collection-field': 'webhooks.workflow',
|
||||
'x-component-props': {
|
||||
fieldNames: {
|
||||
value: 'id',
|
||||
label: 'name',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
qrrbe5or0h5: {
|
||||
type: 'void',
|
||||
'x-component': 'Grid.Row',
|
||||
properties: {
|
||||
'5w93jhg5355': {
|
||||
type: 'void',
|
||||
'x-component': 'Grid.Col',
|
||||
properties: {
|
||||
type: {
|
||||
type: 'string',
|
||||
'x-component': 'CollectionField',
|
||||
'x-decorator': 'FormItem',
|
||||
'x-collection-field': 'webhooks.type',
|
||||
'x-component-props': {},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
'38fm61ehxvn': {
|
||||
type: 'void',
|
||||
'x-component': 'Grid.Row',
|
||||
properties: {
|
||||
arovreokda8: {
|
||||
type: 'void',
|
||||
'x-component': 'Grid.Col',
|
||||
properties: {
|
||||
code: {
|
||||
type: 'string',
|
||||
'x-component': 'CollectionField',
|
||||
'x-decorator': 'FormItem',
|
||||
'x-collection-field': 'webhooks.code',
|
||||
'x-component-props': {},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
'8l8237xpji1': {
|
||||
type: 'array',
|
||||
'x-component': 'TableV2',
|
||||
'x-use-component-props': 'useTableBlockProps',
|
||||
'x-component-props': {
|
||||
rowKey: 'id',
|
||||
rowSelection: {
|
||||
type: 'checkbox',
|
||||
},
|
||||
},
|
||||
properties: {
|
||||
c5we84shjz1: {
|
||||
type: 'void',
|
||||
'x-decorator': 'TableV2.Column.Decorator',
|
||||
'x-component': 'TableV2.Column',
|
||||
properties: {
|
||||
name: {
|
||||
'x-collection-field': 'webhooks.name',
|
||||
'x-component': 'CollectionField',
|
||||
'x-component-props': {
|
||||
ellipsis: true,
|
||||
},
|
||||
'x-read-pretty': true,
|
||||
'x-decorator': null,
|
||||
'x-decorator-props': {
|
||||
labelStyle: {
|
||||
display: 'none',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
q5o7ghhoepw: {
|
||||
type: 'void',
|
||||
'x-decorator': 'TableV2.Column.Decorator',
|
||||
'x-component': 'TableV2.Column',
|
||||
properties: {
|
||||
enabled: {
|
||||
'x-collection-field': 'webhooks.enabled',
|
||||
'x-component': 'CollectionField',
|
||||
'x-component-props': {
|
||||
ellipsis: true,
|
||||
},
|
||||
'x-read-pretty': true,
|
||||
'x-decorator': null,
|
||||
'x-decorator-props': {
|
||||
labelStyle: {
|
||||
display: 'none',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
ud1epmyj09v: {
|
||||
type: 'void',
|
||||
'x-decorator': 'TableV2.Column.Decorator',
|
||||
'x-component': 'TableV2.Column',
|
||||
properties: {
|
||||
workflow: {
|
||||
'x-collection-field': 'webhooks.workflow',
|
||||
'x-component': 'CollectionField',
|
||||
'x-component-props': {
|
||||
fieldNames: {
|
||||
value: 'id',
|
||||
label: 'name',
|
||||
},
|
||||
ellipsis: true,
|
||||
size: 'small',
|
||||
},
|
||||
'x-read-pretty': true,
|
||||
'x-decorator': null,
|
||||
'x-decorator-props': {
|
||||
labelStyle: {
|
||||
display: 'none',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
'8i54l0rnfth': {
|
||||
type: 'void',
|
||||
'x-decorator': 'TableV2.Column.Decorator',
|
||||
'x-component': 'TableV2.Column',
|
||||
properties: {
|
||||
type: {
|
||||
'x-collection-field': 'webhooks.type',
|
||||
'x-component': 'CollectionField',
|
||||
'x-component-props': {},
|
||||
'x-read-pretty': true,
|
||||
'x-decorator': null,
|
||||
'x-decorator-props': {
|
||||
labelStyle: {
|
||||
display: 'none',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
xatpoztbh5h: {
|
||||
type: 'void',
|
||||
title: '{{ t("Actions") }}',
|
||||
'x-decorator': 'TableV2.Column.ActionBar',
|
||||
'x-component': 'TableV2.Column',
|
||||
'x-component-props': {
|
||||
width: 150,
|
||||
fixed: 'right',
|
||||
},
|
||||
'x-action-column': 'actions',
|
||||
properties: {
|
||||
gta931e187b: {
|
||||
type: 'void',
|
||||
'x-decorator': 'DndContext',
|
||||
'x-component': 'Space',
|
||||
'x-component-props': {
|
||||
split: '|',
|
||||
},
|
||||
properties: {
|
||||
oyggiyxrxlr: {
|
||||
type: 'void',
|
||||
title: '{{ t("Edit") }}',
|
||||
'x-action': 'update',
|
||||
'x-component': 'Action.Link',
|
||||
'x-component-props': {
|
||||
openMode: 'drawer',
|
||||
icon: 'EditOutlined',
|
||||
},
|
||||
'x-decorator': 'ACLActionProvider',
|
||||
properties: {
|
||||
drawer: {
|
||||
type: 'void',
|
||||
title: '{{ t("Edit record") }}',
|
||||
'x-component': 'Action.Container',
|
||||
'x-component-props': {
|
||||
className: 'nb-action-popup',
|
||||
},
|
||||
properties: {
|
||||
tabs: {
|
||||
type: 'void',
|
||||
'x-component': 'Tabs',
|
||||
'x-component-props': {},
|
||||
properties: {
|
||||
tab1: {
|
||||
type: 'void',
|
||||
title: '{{t("Edit")}}',
|
||||
'x-component': 'Tabs.TabPane',
|
||||
'x-component-props': {},
|
||||
properties: {
|
||||
grid: {
|
||||
type: 'void',
|
||||
'x-component': 'Grid',
|
||||
properties: {
|
||||
to6mk4v552h: {
|
||||
type: 'void',
|
||||
'x-component': 'Grid.Row',
|
||||
properties: {
|
||||
sqvdrzdbr7r: {
|
||||
type: 'void',
|
||||
'x-component': 'Grid.Col',
|
||||
properties: {
|
||||
'8uym9fty5oy': {
|
||||
type: 'void',
|
||||
'x-acl-action-props': {
|
||||
skipScopeCheck: false,
|
||||
},
|
||||
'x-acl-action': 'webhooks:update',
|
||||
'x-decorator': 'FormBlockProvider',
|
||||
'x-use-decorator-props': 'useEditFormBlockDecoratorProps',
|
||||
'x-decorator-props': {
|
||||
action: 'get',
|
||||
dataSource: 'main',
|
||||
collection,
|
||||
},
|
||||
'x-component': 'CardItem',
|
||||
properties: {
|
||||
je28rbthifp: {
|
||||
type: 'void',
|
||||
'x-component': 'FormV2',
|
||||
'x-use-component-props': 'useEditFormBlockProps',
|
||||
properties: {
|
||||
yviwt5e73dx: {
|
||||
type: 'void',
|
||||
'x-component': 'ActionBar',
|
||||
'x-component-props': {
|
||||
style: {
|
||||
marginBottom: 'var(--tb-spacing)',
|
||||
},
|
||||
},
|
||||
properties: {
|
||||
unkmoqgvtvr: {
|
||||
title: '{{ t("Submit") }}',
|
||||
'x-action': 'submit',
|
||||
'x-component': 'Action',
|
||||
'x-use-component-props': 'useUpdateActionProps',
|
||||
'x-component-props': {
|
||||
type: 'primary',
|
||||
htmlType: 'submit',
|
||||
},
|
||||
'x-action-settings': {
|
||||
triggerWorkflows: [],
|
||||
onSuccess: {
|
||||
manualClose: false,
|
||||
redirecting: false,
|
||||
successMessage: '{{t("Updated successfully")}}',
|
||||
},
|
||||
isDeltaChanged: false,
|
||||
},
|
||||
type: 'void',
|
||||
},
|
||||
},
|
||||
},
|
||||
grid: {
|
||||
type: 'void',
|
||||
'x-component': 'Grid',
|
||||
properties: {
|
||||
'5sakq51jsle': {
|
||||
type: 'void',
|
||||
'x-component': 'Grid.Row',
|
||||
properties: {
|
||||
'6p28yhfkrbi': {
|
||||
type: 'void',
|
||||
'x-component': 'Grid.Col',
|
||||
properties: {
|
||||
name: {
|
||||
type: 'string',
|
||||
'x-component': 'CollectionField',
|
||||
'x-decorator': 'FormItem',
|
||||
'x-collection-field': 'webhooks.name',
|
||||
'x-component-props': {},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
y7idu8knr7g: {
|
||||
type: 'void',
|
||||
'x-component': 'Grid.Row',
|
||||
properties: {
|
||||
zbq1q6f85lf: {
|
||||
type: 'void',
|
||||
'x-component': 'Grid.Col',
|
||||
properties: {
|
||||
enabled: {
|
||||
type: 'string',
|
||||
'x-component': 'CollectionField',
|
||||
'x-decorator': 'FormItem',
|
||||
'x-collection-field': 'webhooks.enabled',
|
||||
'x-component-props': {},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
hmyd06j1xh1: {
|
||||
type: 'void',
|
||||
'x-component': 'Grid.Row',
|
||||
properties: {
|
||||
'6l4tt4kcu2h': {
|
||||
type: 'void',
|
||||
'x-component': 'Grid.Col',
|
||||
properties: {
|
||||
workflow: {
|
||||
type: 'string',
|
||||
'x-component': 'CollectionField',
|
||||
'x-decorator': 'FormItem',
|
||||
'x-collection-field': 'webhooks.workflow',
|
||||
'x-component-props': {
|
||||
fieldNames: {
|
||||
value: 'id',
|
||||
label: 'name',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
qrrbe5or0h5: {
|
||||
type: 'void',
|
||||
'x-component': 'Grid.Row',
|
||||
properties: {
|
||||
'5w93jhg5355': {
|
||||
type: 'void',
|
||||
'x-component': 'Grid.Col',
|
||||
properties: {
|
||||
type: {
|
||||
type: 'string',
|
||||
'x-component': 'CollectionField',
|
||||
'x-decorator': 'FormItem',
|
||||
'x-collection-field': 'webhooks.type',
|
||||
'x-component-props': {},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
'38fm61ehxvn': {
|
||||
type: 'void',
|
||||
'x-component': 'Grid.Row',
|
||||
properties: {
|
||||
arovreokda8: {
|
||||
type: 'void',
|
||||
'x-component': 'Grid.Col',
|
||||
properties: {
|
||||
code: {
|
||||
type: 'string',
|
||||
'x-component': 'CollectionField',
|
||||
'x-decorator': 'FormItem',
|
||||
'x-collection-field': 'webhooks.code',
|
||||
'x-component-props': {},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
q74i285l3sx: {
|
||||
title: '{{ t("Delete") }}',
|
||||
'x-action': 'destroy',
|
||||
'x-component': 'Action.Link',
|
||||
'x-use-component-props': 'useDestroyActionProps',
|
||||
'x-component-props': {
|
||||
icon: 'DeleteOutlined',
|
||||
confirm: {
|
||||
title: "{{t('Delete record')}}",
|
||||
content: "{{t('Are you sure you want to delete it?')}}",
|
||||
},
|
||||
},
|
||||
'x-action-settings': {
|
||||
triggerWorkflows: [],
|
||||
},
|
||||
'x-decorator': 'ACLActionProvider',
|
||||
type: 'void',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export const WebhookManager = () => {
|
||||
return (
|
||||
<ExtendCollectionsProvider collections={[collection]}>
|
||||
<SchemaComponent memoized schema={schema}></SchemaComponent>
|
||||
</ExtendCollectionsProvider>
|
||||
);
|
||||
};
|
@ -4,6 +4,7 @@ import { tval } from '../locale';
|
||||
import { Features } from './Features';
|
||||
import { LinkManager } from './LinkManager';
|
||||
import { Configuration } from './TokenConfiguration';
|
||||
import { WebhookManager } from './WebhookManager';
|
||||
|
||||
export * from './LinkManager';
|
||||
export * from './TokenConfiguration';
|
||||
@ -30,5 +31,10 @@ export class PluginSettingsHelper {
|
||||
icon: 'ShareAltOutlined',
|
||||
Component: LinkManager,
|
||||
});
|
||||
this.app.pluginSettingsManager.add('hera.webhook', {
|
||||
title: tval('Webhook manager'),
|
||||
icon: 'ShareAltOutlined',
|
||||
Component: WebhookManager,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -5,3 +5,4 @@ export * from './link-manager-controller';
|
||||
export * from './system-message-controller';
|
||||
export * from './departments';
|
||||
export * from './users';
|
||||
export * from './webhooks';
|
||||
|
@ -0,0 +1,44 @@
|
||||
import { Context } from '@tachybase/actions';
|
||||
import { Action, Controller } from '@tachybase/utils';
|
||||
|
||||
@Controller('webhooks')
|
||||
export class WebhookController {
|
||||
@Action('trigger')
|
||||
async getLink(ctx: Context) {
|
||||
const {
|
||||
params: { name },
|
||||
} = ctx.action;
|
||||
const where = {};
|
||||
if (name) {
|
||||
where['filter'] = {
|
||||
name: name,
|
||||
enabled: true,
|
||||
};
|
||||
}
|
||||
|
||||
if (!name) {
|
||||
throw new Error('not support');
|
||||
}
|
||||
const repo = ctx.db.getRepository('webhooks');
|
||||
const webhook = await repo.findOne(where);
|
||||
const webhookCtx = {
|
||||
action: ctx.action,
|
||||
body: '',
|
||||
};
|
||||
run(webhook.code, {
|
||||
ctx: webhookCtx,
|
||||
});
|
||||
if (webhookCtx.body) {
|
||||
ctx.withoutDataWrapping = true;
|
||||
ctx.body = webhookCtx.body;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function run(jsCode: string, { ctx }) {
|
||||
try {
|
||||
return new Function('$root', `with($root) { ${jsCode}; }`)({ ctx });
|
||||
} catch (err) {
|
||||
console.log('err', err);
|
||||
}
|
||||
}
|
@ -0,0 +1,31 @@
|
||||
import { defineCollection } from '@tachybase/database';
|
||||
|
||||
export default defineCollection({
|
||||
name: 'webhooks',
|
||||
dumpRules: {
|
||||
group: 'required',
|
||||
},
|
||||
fields: [
|
||||
{
|
||||
name: 'name',
|
||||
unique: true,
|
||||
type: 'string',
|
||||
},
|
||||
{
|
||||
name: 'enabled',
|
||||
type: 'boolean',
|
||||
},
|
||||
{
|
||||
name: 'workflowKey',
|
||||
type: 'string',
|
||||
},
|
||||
{
|
||||
name: 'type', // code/plugin
|
||||
type: 'string',
|
||||
},
|
||||
{
|
||||
name: 'code',
|
||||
type: 'text',
|
||||
},
|
||||
],
|
||||
});
|
@ -1,10 +1,11 @@
|
||||
import { ISchema, useForm } from '@tachybase/schema';
|
||||
import React from 'react';
|
||||
import { useActionContext, useRecord, useResourceActionContext, useResourceContext } from '@tachybase/client';
|
||||
import { ISchema, useForm } from '@tachybase/schema';
|
||||
|
||||
import { message } from 'antd';
|
||||
import { useTranslation } from 'react-i18next';
|
||||
|
||||
import { NAMESPACE } from '../locale';
|
||||
// import { triggers } from '../triggers';
|
||||
import React from 'react';
|
||||
import { executionSchema } from './executions';
|
||||
|
||||
const collection = {
|
||||
|
@ -173,6 +173,13 @@ importers:
|
||||
sequelize:
|
||||
specifier: ^6.26.0
|
||||
version: 6.35.2
|
||||
devDependencies:
|
||||
'@types/koa':
|
||||
specifier: ^2.15.0
|
||||
version: 2.15.0
|
||||
'@types/lodash':
|
||||
specifier: ^4.17.5
|
||||
version: 4.17.5
|
||||
|
||||
packages/core/app:
|
||||
dependencies:
|
||||
@ -12179,23 +12186,23 @@ packages:
|
||||
/@types/koa-bodyparser@4.3.12:
|
||||
resolution: {integrity: sha512-hKMmRMVP889gPIdLZmmtou/BijaU1tHPyMNmcK7FAHAdATnRcGQQy78EqTTxLH1D4FTsrxIzklAQCso9oGoebQ==}
|
||||
dependencies:
|
||||
'@types/koa': 2.13.12
|
||||
'@types/koa': 2.15.0
|
||||
|
||||
/@types/koa-compose@3.2.8:
|
||||
resolution: {integrity: sha512-4Olc63RY+MKvxMwVknCUDhRQX1pFQoBZ/lXcRLP69PQkEpze/0cr8LNqJQe5NFb/b19DWi2a5bTi2VAlQzhJuA==}
|
||||
dependencies:
|
||||
'@types/koa': 2.13.12
|
||||
'@types/koa': 2.15.0
|
||||
|
||||
/@types/koa-multer@1.0.4:
|
||||
resolution: {integrity: sha512-Aty7k5W/bVgvCtyc7iwzjP1QXp1CPsQE3klmIEVBphK2bthjJjUpgkvFNChckA8DPxaatzFmnotWZnXLAAnLog==}
|
||||
dependencies:
|
||||
'@types/koa': 2.13.12
|
||||
'@types/koa': 2.15.0
|
||||
dev: true
|
||||
|
||||
/@types/koa-send@4.1.6:
|
||||
resolution: {integrity: sha512-vgnNGoOJkx7FrF0Jl6rbK1f8bBecqAchKpXtKuXzqIEdXTDO6dsSTjr+eZ5m7ltSjH4K/E7auNJEQCAd0McUPA==}
|
||||
dependencies:
|
||||
'@types/koa': 2.13.12
|
||||
'@types/koa': 2.15.0
|
||||
dev: false
|
||||
|
||||
/@types/koa@2.13.12:
|
||||
@ -12210,10 +12217,22 @@ packages:
|
||||
'@types/koa-compose': 3.2.8
|
||||
'@types/node': 20.12.8
|
||||
|
||||
/@types/koa@2.15.0:
|
||||
resolution: {integrity: sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==}
|
||||
dependencies:
|
||||
'@types/accepts': 1.3.7
|
||||
'@types/content-disposition': 0.5.8
|
||||
'@types/cookies': 0.7.10
|
||||
'@types/http-assert': 1.5.5
|
||||
'@types/http-errors': 2.0.4
|
||||
'@types/keygrip': 1.0.6
|
||||
'@types/koa-compose': 3.2.8
|
||||
'@types/node': 20.12.8
|
||||
|
||||
/@types/koa__cors@5.0.0:
|
||||
resolution: {integrity: sha512-LCk/n25Obq5qlernGOK/2LUwa/2YJb2lxHUkkvYFDOpLXlVI6tKcdfCHRBQnOY4LwH6el5WOLs6PD/a8Uzau6g==}
|
||||
dependencies:
|
||||
'@types/koa': 2.13.12
|
||||
'@types/koa': 2.15.0
|
||||
dev: true
|
||||
|
||||
/@types/linkify-it@3.0.5:
|
||||
@ -12227,6 +12246,10 @@ packages:
|
||||
resolution: {integrity: sha512-wYCP26ZLxaT3R39kiN2+HcJ4kTd3U1waI/cY7ivWYqFP6pW3ZNpvi6Wd6PHZx7T/t8z0vlkXMg3QYLa7DZ/IJQ==}
|
||||
dev: true
|
||||
|
||||
/@types/lodash@4.17.5:
|
||||
resolution: {integrity: sha512-MBIOHVZqVqgfro1euRDWX7OO0fBVUUMrN6Pwm8LQsz8cWhEpihlvR70ENj3f40j58TNxZaWv2ndSkInykNBBJw==}
|
||||
dev: true
|
||||
|
||||
/@types/luxon@3.3.7:
|
||||
resolution: {integrity: sha512-gKc9P2d4g5uYwmy4s/MO/yOVPmvHyvzka1YH6i5dM03UrFofHSmgc0D0ymbDRStFWHusk6cwwF6nhLm/ckBbbQ==}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user