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:
10
packages/global/common/fn/utils.ts
Normal file
10
packages/global/common/fn/utils.ts
Normal 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;
|
||||
}
|
||||
};
|
||||
@@ -26,7 +26,7 @@ export const formatTimeToChatTime = (time: Date) => {
|
||||
|
||||
// 如果时间是今天,展示几时:几分
|
||||
if (now.isSame(target, 'day')) {
|
||||
return target.format('HH:mm');
|
||||
return target.format('HH : mm');
|
||||
}
|
||||
|
||||
// 如果是昨天,展示昨天
|
||||
|
||||
@@ -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')
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -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: [
|
||||
|
||||
@@ -2,5 +2,6 @@ export enum PublishChannelEnum {
|
||||
share = 'share',
|
||||
iframe = 'iframe',
|
||||
apikey = 'apikey',
|
||||
feishu = 'feishu'
|
||||
feishu = 'feishu',
|
||||
wecom = 'wecom'
|
||||
}
|
||||
|
||||
38
packages/global/support/outLink/type.d.ts
vendored
38
packages/global/support/outLink/type.d.ts
vendored
@@ -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
|
||||
|
||||
31
packages/global/support/tmpData/constant.ts
Normal file
31
packages/global/support/tmpData/constant.ts
Normal 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];
|
||||
5
packages/global/support/tmpData/type.d.ts
vendored
Normal file
5
packages/global/support/tmpData/type.d.ts
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
export type TmpDataSchema<T> = {
|
||||
dataId: string;
|
||||
data: T;
|
||||
expireAt: Date;
|
||||
};
|
||||
@@ -21,6 +21,6 @@ export type CreateUsageProps = {
|
||||
appId?: string;
|
||||
pluginId?: string;
|
||||
totalPoints: number;
|
||||
source: UsageSourceEnum;
|
||||
source: `${UsageSourceEnum}`;
|
||||
list: UsageListItemType[];
|
||||
};
|
||||
|
||||
@@ -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')
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user