From 6f327b48c30fd16f2dfb64bd15372018b3fe175f Mon Sep 17 00:00:00 2001 From: actiontech-zihan Date: Tue, 27 Oct 2026 19:00:17 +0800 Subject: [PATCH 1/2] feat: add audit whitelist export API client and params Expose getAuditWhitelistExportsV1 and build export params by reusing list filters while omitting pagination. Co-authored-by: Cursor --- .../sqle/service/audit_whitelist/index.d.ts | 32 ++++++++ .../api/sqle/service/audit_whitelist/index.ts | 19 ++++- .../buildAuditWhitelistListParams.test.ts | 74 +++++++++++++++++++ .../List/buildAuditWhitelistListParams.ts | 31 +++++++- .../testUtils/mockApi/auditWhiteList/index.ts | 7 ++ 5 files changed, 161 insertions(+), 2 deletions(-) create mode 100644 packages/sqle/src/page/Whitelist/List/buildAuditWhitelistListParams.test.ts diff --git a/packages/shared/lib/api/sqle/service/audit_whitelist/index.d.ts b/packages/shared/lib/api/sqle/service/audit_whitelist/index.d.ts index e199957bd..0d871ba14 100644 --- a/packages/shared/lib/api/sqle/service/audit_whitelist/index.d.ts +++ b/packages/shared/lib/api/sqle/service/audit_whitelist/index.d.ts @@ -78,3 +78,35 @@ export interface IUpdateAuditWhitelistByIdV1Params } export interface IUpdateAuditWhitelistByIdV1Return extends IBaseRes {} + +export interface IGetAuditWhitelistExportsV1Params { + project_name: string; + + filter_type?: getAuditWhitelistV1FilterTypeEnum; + + fuzzy_search_content?: string; + + filter_db_type?: string; + + filter_rule_scope_mode?: getAuditWhitelistV1FilterRuleScopeModeEnum; + + filter_rule_name?: string; + + filter_audit_task_type?: string; + + filter_audit_task_id?: string; + + filter_sql_source?: getAuditWhitelistV1FilterSqlSourceEnum; + + filter_created_by?: string; + + filter_created_at_from?: string; + + filter_created_at_to?: string; +} + +export interface IGetAuditWhitelistExportsV1Return { + code?: number; + + message?: string; +} diff --git a/packages/shared/lib/api/sqle/service/audit_whitelist/index.ts b/packages/shared/lib/api/sqle/service/audit_whitelist/index.ts index ebd23b61c..b60a395ac 100644 --- a/packages/shared/lib/api/sqle/service/audit_whitelist/index.ts +++ b/packages/shared/lib/api/sqle/service/audit_whitelist/index.ts @@ -16,7 +16,9 @@ import { IDeleteAuditWhitelistByIdV1Params, IDeleteAuditWhitelistByIdV1Return, IUpdateAuditWhitelistByIdV1Params, - IUpdateAuditWhitelistByIdV1Return + IUpdateAuditWhitelistByIdV1Return, + IGetAuditWhitelistExportsV1Params, + IGetAuditWhitelistExportsV1Return } from './index.d'; class AuditWhitelistService extends ServiceBase { @@ -103,6 +105,21 @@ class AuditWhitelistService extends ServiceBase { options ); } + + public getAuditWhitelistExportsV1( + params: IGetAuditWhitelistExportsV1Params, + options?: AxiosRequestConfig + ) { + const paramsData = this.cloneDeep(params); + const project_name = paramsData.project_name; + delete paramsData.project_name; + + return this.get( + `/v1/projects/${project_name}/audit_whitelist/exports`, + paramsData, + options + ); + } } export default new AuditWhitelistService(); diff --git a/packages/sqle/src/page/Whitelist/List/buildAuditWhitelistListParams.test.ts b/packages/sqle/src/page/Whitelist/List/buildAuditWhitelistListParams.test.ts new file mode 100644 index 000000000..3134882dc --- /dev/null +++ b/packages/sqle/src/page/Whitelist/List/buildAuditWhitelistListParams.test.ts @@ -0,0 +1,74 @@ +import { + AuditWhitelistListFilterValues, + buildAuditWhitelistExportParams, + buildAuditWhitelistListParams +} from './buildAuditWhitelistListParams'; +import { getAuditWhitelistV1FilterSqlSourceEnum } from '@actiontech/shared/lib/api/sqle/service/audit_whitelist/index.enum'; + +describe('buildAuditWhitelistListParams / export', () => { + const filters: AuditWhitelistListFilterValues = { + filter_type: 'sql', + filter_db_type_value: 'MySQL', + filter_sql_source_value: + getAuditWhitelistV1FilterSqlSourceEnum.sql_audit_record, + filter_rule_scope_mode: 'specific', + filter_rule_name: 'rule_a', + filter_audit_task_type: 'sql_audit_record', + filter_audit_task_id: 'task-1', + filter_created_by: 'admin', + filter_created_at_from: '2026-01-01 00:00:00', + filter_created_at_to: '2026-01-31 23:59:59' + }; + + it('should map list filters with pagination', () => { + expect( + buildAuditWhitelistListParams({ + projectName: 'demo', + pageIndex: 2, + pageSize: 20, + globalSearchKeyword: ' select ', + filters + }) + ).toEqual({ + project_name: 'demo', + page_index: '2', + page_size: '20', + fuzzy_search_content: 'select', + filter_type: 'sql', + filter_db_type: 'MySQL', + filter_sql_source: 'sql_audit_record', + filter_rule_scope_mode: 'specific', + filter_rule_name: 'rule_a', + filter_audit_task_type: 'sql_audit_record', + filter_audit_task_id: 'task-1', + filter_created_by: 'admin', + filter_created_at_from: '2026-01-01 00:00:00', + filter_created_at_to: '2026-01-31 23:59:59' + }); + }); + + it('should build export params with same filters and without pagination', () => { + const exportParams = buildAuditWhitelistExportParams({ + projectName: 'demo', + globalSearchKeyword: ' select ', + filters + }); + + expect(exportParams).toEqual({ + project_name: 'demo', + fuzzy_search_content: 'select', + filter_type: 'sql', + filter_db_type: 'MySQL', + filter_sql_source: 'sql_audit_record', + filter_rule_scope_mode: 'specific', + filter_rule_name: 'rule_a', + filter_audit_task_type: 'sql_audit_record', + filter_audit_task_id: 'task-1', + filter_created_by: 'admin', + filter_created_at_from: '2026-01-01 00:00:00', + filter_created_at_to: '2026-01-31 23:59:59' + }); + expect(exportParams).not.toHaveProperty('page_index'); + expect(exportParams).not.toHaveProperty('page_size'); + }); +}); diff --git a/packages/sqle/src/page/Whitelist/List/buildAuditWhitelistListParams.ts b/packages/sqle/src/page/Whitelist/List/buildAuditWhitelistListParams.ts index 1a545ef7e..e88e413c3 100644 --- a/packages/sqle/src/page/Whitelist/List/buildAuditWhitelistListParams.ts +++ b/packages/sqle/src/page/Whitelist/List/buildAuditWhitelistListParams.ts @@ -1,4 +1,7 @@ -import { IGetAuditWhitelistV1Params } from '@actiontech/shared/lib/api/sqle/service/audit_whitelist/index.d'; +import { + IGetAuditWhitelistExportsV1Params, + IGetAuditWhitelistV1Params +} from '@actiontech/shared/lib/api/sqle/service/audit_whitelist/index.d'; import { getAuditWhitelistV1FilterRuleScopeModeEnum, getAuditWhitelistV1FilterSqlSourceEnum @@ -25,6 +28,12 @@ type BuildAuditWhitelistListParamsOptions = { filters: AuditWhitelistListFilterValues; }; +type BuildAuditWhitelistExportParamsOptions = { + projectName: string; + globalSearchKeyword?: string; + filters: AuditWhitelistListFilterValues; +}; + const trimValue = (value?: string) => value?.trim() || undefined; export const buildAuditWhitelistListParams = ({ @@ -89,3 +98,23 @@ export const buildAuditWhitelistListParams = ({ return params; }; + +export const buildAuditWhitelistExportParams = ({ + projectName, + globalSearchKeyword, + filters +}: BuildAuditWhitelistExportParamsOptions): IGetAuditWhitelistExportsV1Params => { + const listParams = buildAuditWhitelistListParams({ + projectName, + pageIndex: 0, + pageSize: 0, + globalSearchKeyword, + filters + }); + const { + page_index: _pageIndex, + page_size: _pageSize, + ...exportParams + } = listParams; + return exportParams; +}; diff --git a/packages/sqle/src/testUtils/mockApi/auditWhiteList/index.ts b/packages/sqle/src/testUtils/mockApi/auditWhiteList/index.ts index 8a09962c1..d28abf7f6 100644 --- a/packages/sqle/src/testUtils/mockApi/auditWhiteList/index.ts +++ b/packages/sqle/src/testUtils/mockApi/auditWhiteList/index.ts @@ -11,6 +11,13 @@ class AuditWhiteList implements MockSpyApy { this.getAuditWhitelistById(); this.deleteAuthWhitelist(); this.addAuthWhitelist(); + this.exportAuditWhitelist(); + } + + public exportAuditWhitelist() { + const spy = jest.spyOn(AuditWhitelistService, 'getAuditWhitelistExportsV1'); + spy.mockImplementation(() => createSpySuccessResponse({})); + return spy; } public getAuditWhitelistById() { From 2bf0b648188a35f6be3e19f5e1498a7818a7578e Mon Sep 17 00:00:00 2001 From: actiontech-zihan Date: Tue, 27 Oct 2026 19:00:17 +0800 Subject: [PATCH 2/2] feat: add whitelist list export entry and i18n Add PageHeader export action with loading/anti-double-click, hide when no project or list forbidden, and locale strings. Co-authored-by: Cursor --- packages/sqle/src/locale/en-US/whitelist.ts | 3 + packages/sqle/src/locale/zh-CN/whitelist.ts | 3 + .../List/__snapshots__/index.test.tsx.snap | 23 +++++ .../src/page/Whitelist/List/index.test.tsx | 97 ++++++++++++++++++- .../sqle/src/page/Whitelist/List/index.tsx | 54 ++++++++++- .../__snapshots__/index.test.tsx.snap | 23 +++++ 6 files changed, 201 insertions(+), 2 deletions(-) diff --git a/packages/sqle/src/locale/en-US/whitelist.ts b/packages/sqle/src/locale/en-US/whitelist.ts index 00277ff0a..c8abd47ef 100644 --- a/packages/sqle/src/locale/en-US/whitelist.ts +++ b/packages/sqle/src/locale/en-US/whitelist.ts @@ -23,6 +23,9 @@ export default { operate: { addWhitelist: 'Add audit whitelist', + export: 'Export', + exporting: 'Exporting audit whitelist…', + exportSuccess: 'Audit whitelist exported successfully', deleting: 'Deleting audit whitelist item...', deleteSuccess: 'Successfully deleted audit whitelist item', diff --git a/packages/sqle/src/locale/zh-CN/whitelist.ts b/packages/sqle/src/locale/zh-CN/whitelist.ts index 53da656ab..6c2572699 100644 --- a/packages/sqle/src/locale/zh-CN/whitelist.ts +++ b/packages/sqle/src/locale/zh-CN/whitelist.ts @@ -24,6 +24,9 @@ export default { operate: { addWhitelist: '添加审核SQL例外', + export: '导出', + exporting: '正在导出审核SQL例外…', + exportSuccess: '审核SQL例外导出成功', deleting: '正在删除审核SQL例外语句...', deleteSuccess: '删除审核SQL例外语句成功', diff --git a/packages/sqle/src/page/Whitelist/List/__snapshots__/index.test.tsx.snap b/packages/sqle/src/page/Whitelist/List/__snapshots__/index.test.tsx.snap index 73c122a5c..f5182aee6 100644 --- a/packages/sqle/src/page/Whitelist/List/__snapshots__/index.test.tsx.snap +++ b/packages/sqle/src/page/Whitelist/List/__snapshots__/index.test.tsx.snap @@ -49,6 +49,29 @@ exports[`slqe/Whitelist/WhitelistList should render whitelist list 1`] = `
+