mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-07-23 22:20:13 +08:00
# Conflicts: # frontend/package.json.md5 # frontend/src/App.tsx # frontend/src/components/AIChatPanel.message-boundary.test.tsx # frontend/src/components/AIChatPanel.tsx # frontend/src/components/AISettingsModal.tsx # frontend/src/components/ConnectionModal.tsx # frontend/src/components/DataGrid.ddl.test.tsx # frontend/src/components/DataGrid.layout.test.tsx # frontend/src/components/DataGrid.tsx # frontend/src/components/DataGridColumnTitle.test.tsx # frontend/src/components/DataGridLegacyCellContextMenu.tsx # frontend/src/components/DataGridSecondaryActions.tsx # frontend/src/components/DataGridToolbarFrame.tsx # frontend/src/components/DataSyncModal.tsx # frontend/src/components/DataViewer.tsx # frontend/src/components/DefinitionViewer.tsx # frontend/src/components/DriverManagerModal.tsx # frontend/src/components/QueryEditor.external-sql-save.test.tsx # frontend/src/components/QueryEditor.tsx # frontend/src/components/RedisViewer.tsx # frontend/src/components/Sidebar.locate-toolbar.test.tsx # frontend/src/components/Sidebar.tsx # frontend/src/components/TabManager.hover.test.tsx # frontend/src/components/TabManager.tsx # frontend/src/components/TableDesigner.tsx # frontend/src/components/V2TableContextMenu.tsx # frontend/src/components/ai/AIChatHeader.tsx # frontend/src/components/ai/AIHistoryDrawer.tsx # frontend/src/main.tsx # frontend/src/store.ts # frontend/src/utils/aiComposerNotice.test.ts # frontend/src/utils/aiComposerNotice.ts # frontend/src/utils/connectionModalPresentation.ts # frontend/src/utils/driverImportGuidance.ts # frontend/src/utils/externalSqlTree.test.ts # frontend/src/utils/externalSqlTree.ts # frontend/src/utils/sqlDialect.ts # internal/ai/service/service.go
98 lines
2.7 KiB
TypeScript
98 lines
2.7 KiB
TypeScript
export type SourceDatasetMode = 'table' | 'query';
|
|
|
|
type SyncContent = 'data' | 'schema' | 'both';
|
|
type TargetTableStrategy = 'existing_only' | 'auto_create_if_missing' | 'smart';
|
|
|
|
type BuildDataSyncRequestParams = {
|
|
sourceConfig: any;
|
|
targetConfig: any;
|
|
sourceDatabase?: string;
|
|
targetDatabase?: string;
|
|
selectedTables: string[];
|
|
sourceDatasetMode: SourceDatasetMode;
|
|
sourceQuery: string;
|
|
syncContent: SyncContent;
|
|
syncMode: string;
|
|
autoAddColumns: boolean;
|
|
targetTableStrategy: TargetTableStrategy;
|
|
createIndexes: boolean;
|
|
mongoCollectionName: string;
|
|
jobId?: string;
|
|
tableOptions?: Record<string, any>;
|
|
};
|
|
|
|
type ValidateDataSyncSelectionParams = {
|
|
sourceDatasetMode: SourceDatasetMode;
|
|
selectedTables: string[];
|
|
sourceQuery: string;
|
|
syncContent: SyncContent;
|
|
};
|
|
|
|
export type DataSyncSelectionErrorKey =
|
|
| 'data_sync.validation.source_query_required'
|
|
| 'data_sync.validation.single_target_table_required'
|
|
| 'data_sync.validation.query_mode_data_only'
|
|
| 'data_sync.validation.select_at_least_one_table';
|
|
|
|
export const validateDataSyncSelection = ({
|
|
sourceDatasetMode,
|
|
selectedTables,
|
|
sourceQuery,
|
|
syncContent,
|
|
}: ValidateDataSyncSelectionParams): DataSyncSelectionErrorKey | null => {
|
|
if (sourceDatasetMode === 'query') {
|
|
if (!String(sourceQuery || '').trim()) {
|
|
return 'data_sync.validation.source_query_required';
|
|
}
|
|
if (selectedTables.length !== 1) {
|
|
return 'data_sync.validation.single_target_table_required';
|
|
}
|
|
if (syncContent !== 'data') {
|
|
return 'data_sync.validation.query_mode_data_only';
|
|
}
|
|
return null;
|
|
}
|
|
|
|
if (selectedTables.length === 0) {
|
|
return 'data_sync.validation.select_at_least_one_table';
|
|
}
|
|
return null;
|
|
};
|
|
|
|
export const buildDataSyncRequest = ({
|
|
sourceConfig,
|
|
targetConfig,
|
|
sourceDatabase,
|
|
targetDatabase,
|
|
selectedTables,
|
|
sourceDatasetMode,
|
|
sourceQuery,
|
|
syncContent,
|
|
syncMode,
|
|
autoAddColumns,
|
|
targetTableStrategy,
|
|
createIndexes,
|
|
mongoCollectionName,
|
|
jobId,
|
|
tableOptions,
|
|
}: BuildDataSyncRequestParams) => {
|
|
const isQueryMode = sourceDatasetMode === 'query';
|
|
|
|
return {
|
|
sourceConfig,
|
|
targetConfig,
|
|
sourceDatabase: String(sourceDatabase || '').trim(),
|
|
targetDatabase: String(targetDatabase || '').trim(),
|
|
tables: selectedTables,
|
|
sourceQuery: isQueryMode ? String(sourceQuery || '').trim() : undefined,
|
|
content: isQueryMode ? 'data' : syncContent,
|
|
mode: syncMode,
|
|
autoAddColumns: isQueryMode ? false : autoAddColumns,
|
|
targetTableStrategy: isQueryMode ? 'existing_only' : targetTableStrategy,
|
|
createIndexes: isQueryMode ? false : createIndexes,
|
|
mongoCollectionName: String(mongoCollectionName || '').trim(),
|
|
...(jobId ? { jobId } : {}),
|
|
...(tableOptions ? { tableOptions } : {}),
|
|
};
|
|
};
|