Skip to content

Commit 62ff228

Browse files
feat: related resource
1 parent 6967585 commit 62ff228

40 files changed

Lines changed: 1469 additions & 861 deletions

File tree

‎ui/src/api/API_README.md‎

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ src/api/
2121
│ │ ├── application/ # 智能体接口
2222
│ │ ├── knowledge/ # 知识库接口
2323
│ │ ├── model/ # 模型接口
24-
│ │ ├── trigger/ # 触发器分页查询接口
24+
│ │ ├── trigger/ # 触发器查询及维护接口
2525
│ │ ├── tool/ # 工具、工具工作流及工具商店接口
2626
│ │ └── <resource>.ts # 工作空间公共资源接口
2727
│ └── provider.ts # Workspace 与 System 共用的模型供应商接口
@@ -186,7 +186,8 @@ API 枚举与类型统一在 `src/api` 范围内管理,相关规则由本文
186186
`resource_user_permission/resource/<target>/resource/<resource>`;与 System 用户视角的
187187
`user_resource_permission` 区分。分页使用 `ParamsPage`,直接返回
188188
`ResponsePage<ResourceUserPermission>`;提交 `ResourceUserPermissionPayload[]`。
189-
查询和更新接口内部调用 `getWorkspaceId()` 获取路由工作空间,调用方不传工作空间 ID。
189+
用户及用户组的查询和更新接口均以必填的 `workspaceId` 为首个参数,由调用方从资源或文件夹
190+
接口数据的 `workspace_id` 传入,不读取或回退到路由工作空间。
190191
`ResourceAuthorizationTargetType` 包含资源类型和三个 `_FOLDER` 类型,文件夹类型用于后端
191192
鉴权。包含子资源时传 `include_children: true` 及经过管理权限筛选的 `folder_ids`,
192193
普通资源或仅当前文件夹不传子文件夹 ID。loading、刷新及成功提示由抽屉负责。
@@ -200,15 +201,27 @@ API 枚举与类型统一在 `src/api` 范围内管理,相关规则由本文
200201

201202
System 资源管理的用户授权维护在 `admin/system/resource-management/resource-authorization.ts`,
202203
使用 `/system/workspace/<workspaceId>/resource_management/resource/<target>/resource/<resource>`。
203-
查询与保存签名、分页类型、响应类型及提交类型与 Workspace 用户授权保持一致;工作空间 ID
204-
由接口内部读取,loading 由组件管理。`ResourceAuthorizationDrawer` 内部通过
205-
`isSystemResource()` 选择完整的用户授权 API 对象,作为该抽屉的范围选择例外;用户组仍使用
204+
查询与保存方法以必填的 `workspaceId` 为首个参数,由调用方从资源数据的 `workspace_id` 传入,
205+
不得读取或回退到路由工作空间。其余参数、分页类型、响应类型及提交类型与 Workspace 用户授权一致。
206+
loading 由组件管理。`ResourceAuthorizationDrawer` 内部通过 `isSystemResource()` 选择完整的用户授权
207+
API 对象和工作空间上下文,作为该抽屉的范围选择例外;用户组仍使用
206208
现有 Workspace 接口,不推测 System 用户组路径。
207209

208210
### 关联资源
209211

210212
`admin/workspace/related-resources.ts` 维护关联资源查询:
211213
`getResourceDependencies` 查询当前资源依赖的资源,对应后端 `mapping_resource`;
212214
`getResourceDependents` 查询引用当前资源的资源,对应后端 `resource_mapping`。
213-
前端按关联资源语义命名,后端接口路径保持不变。该文件当前保留旧版请求签名,
214-
尚未完成 v3 请求适配及页面接入。
215+
前端按关联资源语义命名,后端接口路径保持不变。方法接收工作空间 ID、资源类型、资源 ID、`ParamsPage`
216+
和查询参数;工作空间 ID 由目标资源数据的 `workspace_id` 显式传入,不读取路由。返回 `ResponsePage<RelatedResource>`,
217+
不传 loading,不重复解包响应。`RelatedResource` 通过 `@/api/types` 导出,保留
218+
`source_*`、`target_*` 字段。依赖查询按 `target_type` 筛选,被依赖查询按 `source_type`
219+
筛选,类型数组沿用请求层的数组序列化。页面负责按资源范围传入完整 API,未推测 System 接口。
220+
221+
### 触发器维护
222+
223+
`workspace/trigger/trigger.ts` 维护分页、详情、新建、编辑、删除及批量接口。
224+
`putBatchActivateTrigger(ids, isActive)` 提交 `{ id_list, is_active }` 到 `batch_activate`;
225+
`putBatchDeleteTrigger(ids)` 提交 `{ id_list }` 到 `batch_delete`。单项启停通过 `putTrigger`
226+
仅提交 `is_active`。`Trigger` 为分页摘要,`TriggerDetail` 为含任务参数的完整详情;
227+
`TriggerPayload` 用于新建和编辑,ID 在新建前生成以展示事件回调 URL。

‎ui/src/api/admin/system/resource-management/resource-authorization.ts‎

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,32 @@
11
import { get, put } from '../../core/request'
22
import type { ParamsPage, ResponsePage } from '../../core/types'
33
import type { Dict, ResourceAuthorizationTargetType, ResourceUserPermission, ResourceUserPermissionPayload } from '@/api/types'
4-
import { getWorkspaceId } from '@/utils/resource-context'
54

6-
const getPrefix = () => `/system/workspace/${getWorkspaceId()}/resource_management`
5+
const getPrefix = (workspaceId: string) => `/system/workspace/${workspaceId}/resource_management`
76

87
/** 获取 System 资源管理中指定资源或文件夹的用户权限分页列表。 */
9-
const getResourceAuthorization = (targetId: string, resource: ResourceAuthorizationTargetType, page: ParamsPage, query?: Dict<unknown>) => {
8+
const getResourceAuthorization = (
9+
workspaceId: string,
10+
targetId: string,
11+
resource: ResourceAuthorizationTargetType,
12+
page: ParamsPage,
13+
query?: Dict<unknown>,
14+
) => {
1015
return get<ResponsePage<ResourceUserPermission>>(
11-
`${getPrefix()}/resource/${targetId}/resource/${resource}/${page.currentPage}/${page.pageSize}`,
16+
`${getPrefix(workspaceId)}/resource/${targetId}/resource/${resource}/${page.currentPage}/${page.pageSize}`,
1217
query,
1318
)
1419
}
1520

1621
/** 更新 System 资源管理中的用户权限及文件夹生效范围。 */
17-
const putResourceAuthorization = (targetId: string, resource: ResourceAuthorizationTargetType, permissions: ResourceUserPermissionPayload[]) => {
22+
const putResourceAuthorization = (
23+
workspaceId: string,
24+
targetId: string,
25+
resource: ResourceAuthorizationTargetType,
26+
permissions: ResourceUserPermissionPayload[],
27+
) => {
1828
return put<ResourceUserPermissionPayload[], ResourceUserPermissionPayload[]>(
19-
`${getPrefix()}/resource/${targetId}/resource/${resource}`,
29+
`${getPrefix(workspaceId)}/resource/${targetId}/resource/${resource}`,
2030
permissions,
2131
)
2232
}
Lines changed: 15 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,21 @@
1-
import { Result } from '@/request/Result'
2-
import { get, put, post, del } from '@/request/index'
3-
import type { Ref } from 'vue'
4-
import type { pageRequest } from '@/api/type/common'
5-
const prefix = '/workspace'
1+
import { get } from '../core/request'
2+
import type { ParamsPage, ResponsePage } from '../core/types'
3+
import type { Dict, RelatedResource, ResourceType } from '@/api/types'
64

75
/** 获取引用当前资源的资源。 */
8-
const getResourceDependents: (
9-
workspace_id: string,
10-
resource: string,
11-
resource_id: string,
12-
page: pageRequest,
13-
params?: any,
14-
loading?: Ref<boolean>,
15-
) => Promise<Result<any>> = (workspace_id, resource, resource_id, page, params, loading) => {
16-
return get(`${prefix}/${workspace_id}/resource_mapping/${resource}/${resource_id}/${page.current_page}/${page.page_size}`, params, loading)
6+
const getResourceDependents = (workspaceId: string, resource: ResourceType, resourceId: string, page: ParamsPage, query?: Dict<unknown>) => {
7+
return get<ResponsePage<RelatedResource>>(
8+
`/workspace/${workspaceId}/resource_mapping/${resource}/${resourceId}/${page.currentPage}/${page.pageSize}`,
9+
query,
10+
)
1711
}
12+
1813
/** 获取当前资源依赖的资源。 */
19-
const getResourceDependencies: (
20-
workspace_id: string,
21-
resource: string,
22-
resource_id: string,
23-
page: pageRequest,
24-
params?: any,
25-
loading?: Ref<boolean>,
26-
) => Promise<Result<any>> = (workspace_id, resource, resource_id, page, params, loading) => {
27-
return get(`${prefix}/${workspace_id}/mapping_resource/${resource}/${resource_id}/${page.current_page}/${page.page_size}`, params, loading)
14+
const getResourceDependencies = (workspaceId: string, resource: ResourceType, resourceId: string, page: ParamsPage, query?: Dict<unknown>) => {
15+
return get<ResponsePage<RelatedResource>>(
16+
`/workspace/${workspaceId}/mapping_resource/${resource}/${resourceId}/${page.currentPage}/${page.pageSize}`,
17+
query,
18+
)
2819
}
2920

30-
export default {
31-
getResourceDependents,
32-
getResourceDependencies,
33-
}
21+
export default { getResourceDependents, getResourceDependencies }

‎ui/src/api/admin/workspace/resource-authorization.ts‎

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,44 +8,58 @@ import type {
88
ResourceUserPermission,
99
ResourceUserPermissionPayload,
1010
} from '@/api/types'
11-
import { getWorkspaceId } from '@/utils/resource-context'
1211

13-
const getPrefix = () => {
14-
const workspaceId = getWorkspaceId()
15-
return `/workspace/${workspaceId}`
16-
}
12+
const getPrefix = (workspaceId: string) => `/workspace/${workspaceId}`
1713
/** 获取指定资源或文件夹的用户权限分页列表。 */
18-
const getResourceAuthorization = (targetId: string, resource: ResourceAuthorizationTargetType, page: ParamsPage, query?: Dict<unknown>) => {
14+
const getResourceAuthorization = (
15+
workspaceId: string,
16+
targetId: string,
17+
resource: ResourceAuthorizationTargetType,
18+
page: ParamsPage,
19+
query?: Dict<unknown>,
20+
) => {
1921
return get<ResponsePage<ResourceUserPermission>>(
20-
`${getPrefix()}/resource_user_permission/resource/${targetId}/resource/${resource}/${page.currentPage}/${page.pageSize}`,
22+
`${getPrefix(workspaceId)}/resource_user_permission/resource/${targetId}/resource/${resource}/${page.currentPage}/${page.pageSize}`,
2123
query,
2224
)
2325
}
2426

2527
/** 更新资源的用户权限,可同时应用到有管理权限的子文件夹及资源。 */
26-
const putResourceAuthorization = (targetId: string, resource: ResourceAuthorizationTargetType, permissions: ResourceUserPermissionPayload[]) => {
28+
const putResourceAuthorization = (
29+
workspaceId: string,
30+
targetId: string,
31+
resource: ResourceAuthorizationTargetType,
32+
permissions: ResourceUserPermissionPayload[],
33+
) => {
2734
return put<ResourceUserPermissionPayload[], ResourceUserPermissionPayload[]>(
28-
`${getPrefix()}/resource_user_permission/resource/${targetId}/resource/${resource}`,
35+
`${getPrefix(workspaceId)}/resource_user_permission/resource/${targetId}/resource/${resource}`,
2936
permissions,
3037
)
3138
}
3239

3340
/** 获取指定资源或文件夹的用户组权限分页列表。 */
34-
const getResourceUserGroupAuthorization = (targetId: string, resource: ResourceAuthorizationTargetType, page: ParamsPage, query?: Dict<unknown>) => {
41+
const getResourceUserGroupAuthorization = (
42+
workspaceId: string,
43+
targetId: string,
44+
resource: ResourceAuthorizationTargetType,
45+
page: ParamsPage,
46+
query?: Dict<unknown>,
47+
) => {
3548
return get<ResponsePage<ResourceUserGroupPermission>>(
36-
`${getPrefix()}/resource_user_group_permission/resource/${targetId}/resource/${resource}/${page.currentPage}/${page.pageSize}`,
49+
`${getPrefix(workspaceId)}/resource_user_group_permission/resource/${targetId}/resource/${resource}/${page.currentPage}/${page.pageSize}`,
3750
query,
3851
)
3952
}
4053

4154
/** 更新资源的用户组权限,可应用到有管理权限的子文件夹及资源。 */
4255
const putResourceUserGroupAuthorization = (
56+
workspaceId: string,
4357
targetId: string,
4458
resource: ResourceAuthorizationTargetType,
4559
permissions: ResourceUserGroupPermissionPayload[],
4660
) => {
4761
return put<ResourceUserGroupPermissionPayload[], ResourceUserGroupPermissionPayload[]>(
48-
`${getPrefix()}/resource_user_group_permission/resource/${targetId}/resource/${resource}`,
62+
`${getPrefix(workspaceId)}/resource_user_group_permission/resource/${targetId}/resource/${resource}`,
4963
permissions,
5064
)
5165
}
Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,26 @@
1-
import { get } from '../../core/request'
1+
import { get, post, put, del } from '../../core/request'
22
import type { ParamsPage, ResponsePage } from '../../core/types'
3-
import type { Dict, Trigger } from '@/api/types'
3+
import type { Dict, Trigger, TriggerDetail, TriggerPayload } from '@/api/types'
44
import { getWorkspaceId } from '@/utils/resource-context'
55

6+
const getPrefix = () => `/workspace/${getWorkspaceId()}/trigger`
7+
68
/** 获取当前工作空间的触发器分页列表。 */
7-
const getTriggerPage = (page: ParamsPage, query: Dict<unknown> = {}) => {
8-
return get<ResponsePage<Trigger>>(`/workspace/${getWorkspaceId()}/trigger/${page.currentPage}/${page.pageSize}`, query)
9-
}
9+
const getTriggerPage = (page: ParamsPage, query: Dict<unknown> = {}) =>
10+
get<ResponsePage<Trigger>>(`${getPrefix()}/${page.currentPage}/${page.pageSize}`, query)
11+
/** 获取触发器配置和关联任务详情。 */
12+
const getTriggerDetail = (triggerId: string) => get<TriggerDetail>(`${getPrefix()}/${triggerId}`)
13+
/** 创建触发器及关联任务。 */
14+
const postTrigger = (payload: TriggerPayload) => post<TriggerPayload, TriggerPayload>(getPrefix(), payload)
15+
/** 更新触发器配置或启用状态。 */
16+
const putTrigger = (triggerId: string, payload: Partial<TriggerPayload>) =>
17+
put<Partial<TriggerPayload>, TriggerDetail>(`${getPrefix()}/${triggerId}`, payload)
18+
/** 删除触发器及关联记录。 */
19+
const deleteTrigger = (triggerId: string) => del<undefined, boolean>(`${getPrefix()}/${triggerId}`)
20+
/** 批量删除触发器。 */
21+
const putBatchDeleteTrigger = (triggerIds: string[]) => put<{ id_list: string[] }, boolean>(`${getPrefix()}/batch_delete`, { id_list: triggerIds })
22+
/** 批量启用或禁用触发器。 */
23+
const putBatchActivateTrigger = (triggerIds: string[], isActive: boolean) =>
24+
put<{ id_list: string[]; is_active: boolean }, boolean>(`${getPrefix()}/batch_activate`, { id_list: triggerIds, is_active: isActive })
1025

11-
export default { getTriggerPage }
26+
export default { getTriggerPage, getTriggerDetail, postTrigger, putTrigger, deleteTrigger, putBatchDeleteTrigger, putBatchActivateTrigger }

‎ui/src/api/enums/trigger.ts‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,12 @@ export const TRIGGER_TYPE = {
33
SCHEDULED: 'SCHEDULED',
44
EVENT: 'EVENT',
55
} as const
6+
7+
/** 定时触发周期。 */
8+
export const TRIGGER_SCHEDULE_TYPE = { DAILY: 'daily', WEEKLY: 'weekly', MONTHLY: 'monthly', INTERVAL: 'interval', CRON: 'cron' } as const
9+
/** 触发任务参数来源。 */
10+
export const TRIGGER_PARAMETER_SOURCE = { CUSTOM: 'custom', REFERENCE: 'reference' } as const
11+
/** 事件请求参数类型。 */
12+
export const TRIGGER_BODY_TYPE = { STRING: 'string', INT: 'int', DICT: 'dict', ARRAY: 'array', FLOAT: 'float', BOOLEAN: 'boolean' } as const
13+
/** 定时间隔单位。 */
14+
export const TRIGGER_INTERVAL_UNIT = { MINUTES: 'minutes', HOURS: 'hours' } as const

‎ui/src/api/types/index.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,4 @@ export type * from './folder'
1717
export type * from './tool'
1818
export type * from './knowledge'
1919
export type * from './trigger'
20+
export type * from './related-resources'
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
/** 关联资源分页查询返回的资源关系及展示信息。 */
2+
import type { ResourceType } from './resource-authorization'
3+
4+
export interface RelatedResource {
5+
id: string
6+
name: string | null
7+
desc?: string | null
8+
source_id: string
9+
source_type: ResourceType
10+
target_id: string
11+
target_type: ResourceType
12+
type?: string | null
13+
icon?: string | null
14+
username?: string | null
15+
workspace_id?: string | null
16+
workspace_name?: string | null
17+
folder_id?: string | null
18+
}

‎ui/src/api/types/trigger.ts‎

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1-
import type { TRIGGER_TYPE } from '@/api/enums'
1+
import type {
2+
RESOURCE_TYPE,
3+
TRIGGER_SCHEDULE_TYPE,
4+
TRIGGER_PARAMETER_SOURCE,
5+
TRIGGER_BODY_TYPE,
6+
TRIGGER_INTERVAL_UNIT,
7+
TRIGGER_TYPE,
8+
} from '@/api/enums'
29

310
export type TriggerType = (typeof TRIGGER_TYPE)[keyof typeof TRIGGER_TYPE]
411

@@ -21,3 +28,48 @@ export interface Trigger {
2128
create_user: string | null
2229
create_time: string
2330
}
31+
32+
export type TriggerTaskSource = typeof RESOURCE_TYPE.APPLICATION | typeof RESOURCE_TYPE.TOOL
33+
export interface TriggerParameter {
34+
source: (typeof TRIGGER_PARAMETER_SOURCE)[keyof typeof TRIGGER_PARAMETER_SOURCE]
35+
value: string | string[]
36+
}
37+
export type TriggerParameters = Record<string, TriggerParameter | Record<string, TriggerParameter>>
38+
export interface TriggerTaskPayload {
39+
id?: string
40+
source_type: TriggerTaskSource
41+
source_id: string
42+
is_active?: boolean
43+
parameter: TriggerParameters
44+
meta?: Record<string, unknown>
45+
}
46+
export interface TriggerBodyField {
47+
field: string
48+
type: (typeof TRIGGER_BODY_TYPE)[keyof typeof TRIGGER_BODY_TYPE]
49+
desc?: string
50+
required?: boolean
51+
}
52+
export interface TriggerSetting {
53+
schedule_type?: (typeof TRIGGER_SCHEDULE_TYPE)[keyof typeof TRIGGER_SCHEDULE_TYPE]
54+
interval_unit?: (typeof TRIGGER_INTERVAL_UNIT)[keyof typeof TRIGGER_INTERVAL_UNIT]
55+
interval_value?: number
56+
days?: (number | string)[]
57+
time?: string[]
58+
cron_expression?: string
59+
token?: string
60+
body?: TriggerBodyField[]
61+
}
62+
export interface TriggerPayload {
63+
id: string
64+
name: string
65+
desc: string
66+
trigger_type: TriggerType
67+
trigger_setting: TriggerSetting
68+
trigger_task: TriggerTaskPayload[]
69+
is_active?: boolean
70+
meta?: Record<string, unknown>
71+
}
72+
export interface TriggerDetail extends TriggerPayload {
73+
application_task_list?: Partial<import('./application').ApplicationDetail>[]
74+
tool_task_list?: Partial<import('./tool').ToolItem>[]
75+
}
Lines changed: 8 additions & 0 deletions
Loading

0 commit comments

Comments
 (0)