Publish app - feishu and wecom (#2375)

* feat(app publish): feishu bot (#2290)

* feat: feishu publish channel fe

* feat: enable feishu fe,
feat: feishu token api

* feat: feishu bot

* chore: extract saveChat from projects/app

* chore: remove debug log output

* feat: Basic Info

* chore: feishu bot fe adjusting

* feat: feishu bot docs

* feat: new tmpData collection for all tmpdata

* chore: compress the image

* perf: feishu config

* feat: source name

* perf: text desc

* perf: load system plugins

* perf: chat source

* feat(publish): Wecom bot (#2343)

* chore: Wecom Config

* feat(fe): wecom config fe

* feat: wecom fe

* chore: uses the newest editmodal

* feat: update png; adjust the fe

* chore: adjust fe

* perf: publish app ui

---------

Co-authored-by: Finley Ge <32237950+FinleyGe@users.noreply.github.com>
This commit is contained in:
Archer
2024-08-13 21:52:18 +08:00
committed by GitHub
parent 7417de74da
commit 0f3418daf5
71 changed files with 1301 additions and 498 deletions

View File

@@ -0,0 +1,10 @@
export const retryRun = <T>(fn: () => T, retry = 2): T => {
try {
return fn();
} catch (error) {
if (retry > 0) {
return retryRun(fn, retry - 1);
}
throw error;
}
};

View File

@@ -26,7 +26,7 @@ export const formatTimeToChatTime = (time: Date) => {
// 如果时间是今天,展示几时:几分
if (now.isSame(target, 'day')) {
return target.format('HH:mm');
return target.format('HH : mm');
}
// 如果是昨天,展示昨天

View File

@@ -1,3 +1,5 @@
import { i18nT } from '../../../web/i18n/utils';
export enum ChatRoleEnum {
System = 'System',
Human = 'Human',
@@ -30,23 +32,27 @@ export enum ChatSourceEnum {
online = 'online',
share = 'share',
api = 'api',
team = 'team'
team = 'team',
feishu = 'feishu'
}
export const ChatSourceMap = {
[ChatSourceEnum.test]: {
name: 'core.chat.logs.test'
name: i18nT('common:core.chat.logs.test')
},
[ChatSourceEnum.online]: {
name: 'core.chat.logs.online'
name: i18nT('common:core.chat.logs.online')
},
[ChatSourceEnum.share]: {
name: 'core.chat.logs.share'
name: i18nT('common:core.chat.logs.share')
},
[ChatSourceEnum.api]: {
name: 'core.chat.logs.api'
name: i18nT('common:core.chat.logs.api')
},
[ChatSourceEnum.team]: {
name: 'core.chat.logs.team'
name: i18nT('common:core.chat.logs.team')
},
[ChatSourceEnum.feishu]: {
name: i18nT('common:core.chat.logs.feishu')
}
};

View File

@@ -26,7 +26,7 @@ export const TextEditorNode: FlowNodeTemplateType = {
inputs: [
{
...Input_Template_DynamicInput,
description: '可以引用其他节点的输出,作为文本拼接的变量,通过 {{字段名}} 来引用变量',
description: '可以引用其他节点的输出,作为文本拼接的变量,输入 / 唤起变量列表',
customInputConfig: {
selectValueTypeList: Object.values(WorkflowIOValueTypeEnum),
showDescription: false,
@@ -39,7 +39,7 @@ export const TextEditorNode: FlowNodeTemplateType = {
valueType: WorkflowIOValueTypeEnum.string,
required: true,
label: '拼接文本',
placeholder: '可通过 {{字段名}} 来引用变量'
placeholder: '可输入 / 唤起变量列表'
}
],
outputs: [

View File

@@ -2,5 +2,6 @@ export enum PublishChannelEnum {
share = 'share',
iframe = 'iframe',
apikey = 'apikey',
feishu = 'feishu'
feishu = 'feishu',
wecom = 'wecom'
}

View File

@@ -1,8 +1,9 @@
import { AppSchema } from 'core/app/type';
import { AppSchema } from '../../core/app/type';
import { PublishChannelEnum } from './constant';
import { RequireOnlyOne } from '../../common/type/utils';
// Feishu Config interface
export interface FeishuType {
export interface FeishuAppType {
appId: string;
appSecret: string;
// Encrypt config
@@ -10,29 +11,28 @@ export interface FeishuType {
encryptKey?: string; // no secret if null
// Token Verification
// refer to: https://open.feishu.cn/document/server-docs/event-subscription-guide/event-subscription-configure-/encrypt-key-encryption-configuration-case
verificationToken: string;
verificationToken?: string;
}
// TODO: Unused
export interface WecomType {
ReplyLimit: Boolean;
defaultResponse: string;
immediateResponse: boolean;
WXWORK_TOKEN: string;
WXWORK_AESKEY: string;
WXWORK_SECRET: string;
WXWORD_ID: string;
export interface WecomAppType {
AgentId: string;
CorpId: string;
SuiteSecret: string;
CallbackToken: string;
CallbackEncodingAesKey: string;
}
export type OutLinkSchema<T = void> = {
// TODO: unused
export interface WechatAppType {}
export type OutlinkAppType = FeishuAppType | WecomAppType | undefined;
export type OutLinkSchema<T extends OutlinkAppType = undefined> = {
_id: string;
shareId: string;
teamId: string;
tmbId: string;
appId: string;
// teamId: Schema.Types.ObjectId;
// tmbId: Schema.Types.ObjectId;
// appId: Schema.Types.ObjectId;
name: string;
usagePoints: number;
lastTime: Date;
@@ -55,7 +55,7 @@ export type OutLinkSchema<T = void> = {
hookUrl?: string;
};
app?: T;
app: T;
};
// to handle MongoDB querying
@@ -64,10 +64,10 @@ export type OutLinkWithAppType = Omit<OutLinkSchema, 'appId'> & {
};
// Edit the Outlink
export type OutLinkEditType<T = void> = {
export type OutLinkEditType<T = undefined> = {
_id?: string;
name: string;
responseDetail: OutLinkSchema<T>['responseDetail'];
responseDetail?: OutLinkSchema<T>['responseDetail'];
// response when request
immediateResponse?: string;
// response when error or other situation

View File

@@ -0,0 +1,31 @@
export enum TmpDataEnum {
FeishuAccessToken = 'feishu_access_token',
WecomAccessToken = 'wecom_access_token'
}
type _TmpDataMetadata = {
[TmpDataEnum.FeishuAccessToken]: {
FeishuAppId: string;
};
[TmpDataEnum.WecomAccessToken]: {
CorpId: string;
AgentId: string;
};
};
type _TmpDataType = {
[TmpDataEnum.FeishuAccessToken]: {
accessToken: string;
};
[TmpDataEnum.WecomAccessToken]: {
accessToken: string;
};
};
export const TmpDataExpireTime = {
[TmpDataEnum.FeishuAccessToken]: 1000 * 60 * 60 * 1.5, // 1.5 hours
[TmpDataEnum.WecomAccessToken]: 1000 * 60 * 60 * 2 // 2 hours
};
export type TmpDataMetadata<T extends TmpDataEnum> = _TmpDataMetadata[T];
export type TmpDataType<T extends TmpDataEnum> = _TmpDataType[T];

View File

@@ -0,0 +1,5 @@
export type TmpDataSchema<T> = {
dataId: string;
data: T;
expireAt: Date;
};

View File

@@ -21,6 +21,6 @@ export type CreateUsageProps = {
appId?: string;
pluginId?: string;
totalPoints: number;
source: UsageSourceEnum;
source: `${UsageSourceEnum}`;
list: UsageListItemType[];
};

View File

@@ -5,7 +5,8 @@ export enum UsageSourceEnum {
api = 'api',
shareLink = 'shareLink',
training = 'training',
cronJob = 'cronJob'
cronJob = 'cronJob',
feishu = 'feishu'
}
export const UsageSourceMap = {
@@ -23,5 +24,8 @@ export const UsageSourceMap = {
},
[UsageSourceEnum.cronJob]: {
label: i18nT('common:cron_job_run_app')
},
[UsageSourceEnum.feishu]: {
label: i18nT('user:usage.feishu')
}
};