Skip to content

Commit 4eff15e

Browse files
authored
Merge pull request #399 from actiontech/feature/issue-1754
Feature/issue 1754
2 parents 1aa95ed + 113a474 commit 4eff15e

File tree

96 files changed

+4578
-1006
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

96 files changed

+4578
-1006
lines changed

packages/base/src/locale/zh-CN/dmsCloudBeaver.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export default {
2828
execResult: '执行结果',
2929
execTime: '执行时间(毫秒)',
3030
rowCount: '结果集返回行数'
31-
}
31+
},
32+
createWhitelist: '添加为审核SQL例外'
3233
}
3334
};

packages/base/src/locale/zh-CN/dmsDataExport.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,8 @@ export default {
172172
number: '序号',
173173
execSql: '执行语句',
174174
sqlType: '语句类型',
175-
auditResult: '审核结果'
175+
auditResult: '审核结果',
176+
createWhitelist: '添加为审核SQL例外'
176177
}
177178
}
178179
}

packages/base/src/locale/zh-CN/dmsMenu.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ export default {
1111
inspectionAndDiagnosis: '巡检与诊断',
1212
SQLWorkbench: 'SQL工作台',
1313
ruleTemplate: '审核规则模板',
14-
whitelist: '白名单',
14+
whitelist: '审核SQL例外',
15+
sqlManagementExcept: '管控SQL例外',
1516
workflowTemplate: '审批流程模板',
1617
sqlAudit: '快捷审核',
1718
pluginAudit: 'IDE审核',

packages/base/src/page/CloudBeaver/List/__snapshots__/index.test.tsx.snap

Lines changed: 261 additions & 7 deletions
Large diffs are not rendered by default.

packages/base/src/page/CloudBeaver/List/column.tsx

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {
22
ActiontechTableColumn,
3-
PageInfoWithoutIndexAndSize
3+
PageInfoWithoutIndexAndSize,
4+
ActiontechTableActionMeta
45
} from '@actiontech/shared/lib/components/ActiontechTable';
56
import { IListCBOperationLogsParams } from '@actiontech/shared/lib/api/base/service/CBOperationLogs/index.d';
67
import { ICBOperationLog } from '@actiontech/shared/lib/api/base/service/common';
@@ -150,3 +151,24 @@ export const CBOperationListColumns = (
150151
}
151152
];
152153
};
154+
155+
export const CBOperationListAction = (
156+
onCreateWhitelist: (record?: ICBOperationLog) => void
157+
): ActiontechTableActionMeta<ICBOperationLog>[] => {
158+
return [
159+
{
160+
key: 'create-exception',
161+
text: t('dmsCloudBeaver.operationList.createWhitelist'),
162+
buttonProps: (record) => {
163+
return {
164+
onClick: (e) => {
165+
e.stopPropagation();
166+
onCreateWhitelist(record);
167+
}
168+
};
169+
},
170+
permissions: (record) =>
171+
record?.operation?.operation_type === OperationOperationTypeEnum.SQL
172+
}
173+
];
174+
};

packages/base/src/page/CloudBeaver/List/index.test.tsx

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { driverMeta } from 'sqle/src/hooks/useDatabaseType/index.test.data';
1717
import { createSpyFailResponse } from '@actiontech/shared/lib/testUtil/mockApi';
1818
import { listCBOperationLogsMockData } from '../../../testUtils/mockApi/cloudBeaver/data';
1919
import { ModalName } from '../../../data/ModalName';
20+
import { ModalName as SqleModalName } from 'sqle/src/data/ModalName';
2021

2122
jest.mock('react-redux', () => {
2223
return {
@@ -50,7 +51,8 @@ describe('test base/CloudBeaver/List', () => {
5051
database: { driverMeta: driverMeta },
5152
cloudBeaver: {
5253
modalStatus: {}
53-
}
54+
},
55+
whitelist: { modalStatus: {} }
5456
});
5557
});
5658
});
@@ -174,4 +176,22 @@ describe('test base/CloudBeaver/List', () => {
174176
}
175177
});
176178
});
179+
180+
it('render create whitelist', async () => {
181+
superRender(<CBOperationLogsList />);
182+
await act(async () => jest.advanceTimersByTime(3000));
183+
await act(async () => jest.advanceTimersByTime(3000));
184+
expect(screen.queryAllByText('添加为审核SQL例外')[0]).toBeInTheDocument();
185+
fireEvent.click(screen.queryAllByText('添加为审核SQL例外')[0]);
186+
await act(async () => jest.advanceTimersByTime(100));
187+
expect(mockDispatch).toHaveBeenCalledTimes(4);
188+
expect(mockDispatch).toHaveBeenNthCalledWith(3, {
189+
payload: { modalName: SqleModalName.Add_Whitelist, status: true },
190+
type: 'whitelist/updateModalStatus'
191+
});
192+
expect(mockDispatch).toHaveBeenNthCalledWith(4, {
193+
payload: { selectRow: { value: 'SELECT 1;' } },
194+
type: 'whitelist/updateSelectWhitelist'
195+
});
196+
});
177197
});

packages/base/src/page/CloudBeaver/List/index.tsx

Lines changed: 76 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ import {
1717
import { ICBOperationLog } from '@actiontech/shared/lib/api/base/service/common';
1818
import {
1919
CBOperationListFilterParamType,
20-
CBOperationListColumns
20+
CBOperationListColumns,
21+
CBOperationListAction
2122
} from './column';
2223
import { IListCBOperationLogsParams } from '@actiontech/shared/lib/api/base/service/CBOperationLogs/index.d';
2324
import CBOperationLogs from '@actiontech/shared/lib/api/base/service/CBOperationLogs';
@@ -35,6 +36,8 @@ import {
3536
import { ModalName } from '../../../data/ModalName';
3637
import { CloudBeaverOperationLogsListStyleWrapper } from '../style';
3738
import { useTranslation } from 'react-i18next';
39+
import CreateWhitelistModal from 'sqle/src/page/Whitelist/Drawer/AddWhitelist';
40+
import useWhitelistRedux from 'sqle/src/page/Whitelist/hooks/useWhitelistRedux';
3841

3942
const CBOperationLogsList: React.FC<{ enableSqlQuery?: boolean }> = () => {
4043
const { t } = useTranslation();
@@ -59,6 +62,12 @@ const CBOperationLogsList: React.FC<{ enableSqlQuery?: boolean }> = () => {
5962
const { requestErrorMessage, handleTableRequestError } =
6063
useTableRequestError();
6164

65+
const {
66+
openCreateWhitelistModal,
67+
updateSelectWhitelistRecord,
68+
actionPermission
69+
} = useWhitelistRedux();
70+
6271
const {
6372
tableFilterInfo,
6473
updateTableFilterInfo,
@@ -161,6 +170,13 @@ const CBOperationLogsList: React.FC<{ enableSqlQuery?: boolean }> = () => {
161170
const { filterButtonMeta, filterContainerMeta, updateAllSelectedFilterItem } =
162171
useTableFilterContainer(columns, updateTableFilterInfo);
163172

173+
const onCreateWhitelist = (record?: ICBOperationLog) => {
174+
openCreateWhitelistModal();
175+
updateSelectWhitelistRecord({
176+
value: record?.operation?.operation_detail
177+
});
178+
};
179+
164180
useEffect(() => {
165181
updateDbServiceList({
166182
project_uid: projectID
@@ -170,59 +186,67 @@ const CBOperationLogsList: React.FC<{ enableSqlQuery?: boolean }> = () => {
170186
}, [projectID, updateDbServiceList, updateMemberTips, updateCBOperationList]);
171187

172188
return (
173-
<CloudBeaverOperationLogsListStyleWrapper>
174-
{contextHolder}
175-
<Spin spinning={loading}>
176-
<OperationStatistics
177-
total={data?.otherData?.exec_sql_total}
178-
succeedRate={data?.otherData?.exec_success_rate}
179-
interceptedTotal={data?.otherData?.audit_intercepted_sql_count}
180-
failedTotal={data?.otherData?.exec_failed_sql_count}
181-
/>
182-
<TableToolbar
183-
refreshButton={{ refresh }}
184-
actions={[
185-
{
186-
key: 'modifyPassword',
187-
text: t('dmsCloudBeaver.operationList.exportButton'),
188-
buttonProps: {
189-
onClick: onExport,
190-
loading: exporting
189+
<>
190+
<CloudBeaverOperationLogsListStyleWrapper>
191+
{contextHolder}
192+
<Spin spinning={loading}>
193+
<OperationStatistics
194+
total={data?.otherData?.exec_sql_total}
195+
succeedRate={data?.otherData?.exec_success_rate}
196+
interceptedTotal={data?.otherData?.audit_intercepted_sql_count}
197+
failedTotal={data?.otherData?.exec_failed_sql_count}
198+
/>
199+
<TableToolbar
200+
refreshButton={{ refresh }}
201+
actions={[
202+
{
203+
key: 'modifyPassword',
204+
text: t('dmsCloudBeaver.operationList.exportButton'),
205+
buttonProps: {
206+
onClick: onExport,
207+
loading: exporting
208+
}
191209
}
210+
]}
211+
filterButton={{
212+
filterButtonMeta,
213+
updateAllSelectedFilterItem
214+
}}
215+
setting={tableSetting}
216+
searchInput={{
217+
onChange: setSearchKeyword,
218+
onSearch: () => {
219+
refreshBySearchKeyword();
220+
}
221+
}}
222+
/>
223+
<TableFilterContainer
224+
filterContainerMeta={filterContainerMeta}
225+
updateTableFilterInfo={updateTableFilterInfo}
226+
disabled={loading}
227+
filterCustomProps={filterCustomProps}
228+
/>
229+
<ActiontechTable
230+
rowKey="uid"
231+
setting={tableSetting}
232+
dataSource={data?.list ?? []}
233+
pagination={{
234+
total: data?.total || 0
235+
}}
236+
columns={columns}
237+
onChange={tableChange}
238+
errorMessage={requestErrorMessage}
239+
actions={
240+
actionPermission
241+
? CBOperationListAction(onCreateWhitelist)
242+
: undefined
192243
}
193-
]}
194-
filterButton={{
195-
filterButtonMeta,
196-
updateAllSelectedFilterItem
197-
}}
198-
setting={tableSetting}
199-
searchInput={{
200-
onChange: setSearchKeyword,
201-
onSearch: () => {
202-
refreshBySearchKeyword();
203-
}
204-
}}
205-
/>
206-
<TableFilterContainer
207-
filterContainerMeta={filterContainerMeta}
208-
updateTableFilterInfo={updateTableFilterInfo}
209-
disabled={loading}
210-
filterCustomProps={filterCustomProps}
211-
/>
212-
<ActiontechTable
213-
rowKey="uid"
214-
setting={tableSetting}
215-
dataSource={data?.list ?? []}
216-
pagination={{
217-
total: data?.total || 0
218-
}}
219-
columns={columns}
220-
onChange={tableChange}
221-
errorMessage={requestErrorMessage}
222-
/>
223-
<CBSqlOperationAuditDetailDrawer />
224-
</Spin>
225-
</CloudBeaverOperationLogsListStyleWrapper>
244+
/>
245+
<CBSqlOperationAuditDetailDrawer />
246+
</Spin>
247+
</CloudBeaverOperationLogsListStyleWrapper>
248+
<CreateWhitelistModal onCreated={refresh} />
249+
</>
226250
);
227251
};
228252
export default CBOperationLogsList;

0 commit comments

Comments
 (0)