mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-07-19 11:51:50 +08:00
✨ feat(connection): 支持生产连接多项保护策略
- 新增数据编辑、结构编辑、脚本执行和数据导入四类连接级保护配置 - 升级生产连接保护弹窗为多选卡片,并修复选项对齐与勾选态显示 - 按保护类型收口 QueryEditor、DataGrid、表设计、导入与同步目标入口 - 后端统一拦截 SQL 或 Mongo 写操作、结果编辑、结构变更和导入写入 - AI 本地工具与 RPC 执行链路透传连接保护配置并复用后端守卫 - 补充多语言文案、定向测试与需求追踪记录
This commit is contained in:
@@ -1,8 +1,14 @@
|
||||
import type { ConnectionConfig } from '../types';
|
||||
import { isConnectionForcedReadOnly } from './connectionReadOnly';
|
||||
import {
|
||||
isConnectionDataEditRestricted,
|
||||
isConnectionStructureEditRestricted,
|
||||
} from './connectionReadOnly';
|
||||
import { normalizeOceanBaseProtocol } from './oceanBaseProtocol';
|
||||
|
||||
type ConnectionLike = Pick<ConnectionConfig, 'type' | 'driver' | 'oceanBaseProtocol' | 'readOnly'> | null | undefined;
|
||||
type ConnectionLike = Pick<
|
||||
ConnectionConfig,
|
||||
'type' | 'driver' | 'oceanBaseProtocol' | 'readOnly' | 'protection'
|
||||
> | null | undefined;
|
||||
|
||||
const normalizeDataSourceToken = (raw: string): string => {
|
||||
const normalized = String(raw || '').trim().toLowerCase();
|
||||
@@ -142,6 +148,7 @@ const COPY_INSERT_TYPES = new Set([
|
||||
|
||||
const QUERY_EDITOR_DISABLED_TYPES = new Set(['redis']);
|
||||
const FORCE_READ_ONLY_QUERY_TYPES = new Set(['tdengine', 'iotdb', 'clickhouse', 'rocketmq', 'mqtt', 'kafka', 'rabbitmq']);
|
||||
const FORCE_READ_ONLY_STRUCTURE_DESIGNER_TYPES = new Set(['elasticsearch', 'mongodb', 'redis', 'iotdb']);
|
||||
const MESSAGE_PUBLISH_TYPES = new Set(['rocketmq', 'mqtt', 'kafka', 'rabbitmq']);
|
||||
const MANUAL_TOTAL_COUNT_TYPES = new Set(['duckdb', 'oracle', 'rocketmq', 'mqtt']);
|
||||
const APPROXIMATE_TABLE_COUNT_TYPES = new Set(['duckdb', 'oracle']);
|
||||
@@ -157,6 +164,7 @@ export type DataSourceCapabilities = {
|
||||
supportsDropDatabase: boolean;
|
||||
supportsMessagePublish: boolean;
|
||||
forceReadOnlyQueryResult: boolean;
|
||||
forceReadOnlyStructureDesigner: boolean;
|
||||
preferManualTotalCount: boolean;
|
||||
supportsApproximateTableCount: boolean;
|
||||
supportsApproximateTotalPages: boolean;
|
||||
@@ -209,17 +217,20 @@ const DROP_DATABASE_TYPES = new Set([
|
||||
|
||||
export const getDataSourceCapabilities = (config: ConnectionLike): DataSourceCapabilities => {
|
||||
const type = resolveDataSourceType(config);
|
||||
const forcedReadOnly = isConnectionForcedReadOnly(config);
|
||||
const dataEditRestricted = isConnectionDataEditRestricted(config);
|
||||
const structureEditRestricted = isConnectionStructureEditRestricted(config);
|
||||
return {
|
||||
type,
|
||||
supportsQueryEditor: !QUERY_EDITOR_DISABLED_TYPES.has(type),
|
||||
supportsSqlQueryExport: SQL_QUERY_EXPORT_TYPES.has(type),
|
||||
supportsCopyInsert: COPY_INSERT_TYPES.has(type),
|
||||
supportsCreateDatabase: !forcedReadOnly && CREATE_DATABASE_TYPES.has(type),
|
||||
supportsRenameDatabase: !forcedReadOnly && RENAME_DATABASE_TYPES.has(type),
|
||||
supportsDropDatabase: !forcedReadOnly && DROP_DATABASE_TYPES.has(type),
|
||||
supportsMessagePublish: !forcedReadOnly && MESSAGE_PUBLISH_TYPES.has(type),
|
||||
forceReadOnlyQueryResult: forcedReadOnly || FORCE_READ_ONLY_QUERY_TYPES.has(type),
|
||||
supportsCreateDatabase: !structureEditRestricted && CREATE_DATABASE_TYPES.has(type),
|
||||
supportsRenameDatabase: !structureEditRestricted && RENAME_DATABASE_TYPES.has(type),
|
||||
supportsDropDatabase: !structureEditRestricted && DROP_DATABASE_TYPES.has(type),
|
||||
supportsMessagePublish: !dataEditRestricted && MESSAGE_PUBLISH_TYPES.has(type),
|
||||
forceReadOnlyQueryResult: dataEditRestricted || FORCE_READ_ONLY_QUERY_TYPES.has(type),
|
||||
forceReadOnlyStructureDesigner:
|
||||
structureEditRestricted || FORCE_READ_ONLY_STRUCTURE_DESIGNER_TYPES.has(type),
|
||||
preferManualTotalCount: MANUAL_TOTAL_COUNT_TYPES.has(type),
|
||||
supportsApproximateTableCount: APPROXIMATE_TABLE_COUNT_TYPES.has(type),
|
||||
supportsApproximateTotalPages: APPROXIMATE_TOTAL_PAGE_TYPES.has(type),
|
||||
|
||||
Reference in New Issue
Block a user