diff --git a/backend/apps/datasource/api/datasource.py b/backend/apps/datasource/api/datasource.py index 900248a5..fa7dc047 100644 --- a/backend/apps/datasource/api/datasource.py +++ b/backend/apps/datasource/api/datasource.py @@ -12,7 +12,8 @@ from common.core.config import settings from common.core.deps import SessionDep, CurrentUser, Trans from common.utils.utils import SQLBotLogUtil from ..crud.datasource import get_datasource_list, check_status, create_ds, update_ds, delete_ds, getTables, getFields, \ - execSql, update_table_and_fields, getTablesByDs, chooseTables, preview, updateTable, updateField, get_ds, fieldEnum + execSql, update_table_and_fields, getTablesByDs, chooseTables, preview, updateTable, updateField, get_ds, fieldEnum, \ + check_status_by_id from ..crud.field import get_fields_by_table_id from ..crud.table import get_tables_by_ds_id from ..models.datasource import CoreDatasource, CreateDatasource, TableObj, CoreTable, CoreField @@ -46,6 +47,14 @@ async def check(session: SessionDep, trans: Trans, ds: CoreDatasource): return await asyncio.to_thread(inner) +@router.get("/check/{ds_id}") +async def check_by_id(session: SessionDep, trans: Trans, ds_id: int): + def inner(): + return check_status_by_id(session, trans, ds_id, True) + + return await asyncio.to_thread(inner) + + @router.post("/add", response_model=CoreDatasource) async def add(session: SessionDep, trans: Trans, user: CurrentUser, ds: CreateDatasource): def inner(): diff --git a/backend/apps/datasource/crud/datasource.py b/backend/apps/datasource/crud/datasource.py index 8488c070..3d6dc735 100644 --- a/backend/apps/datasource/crud/datasource.py +++ b/backend/apps/datasource/crud/datasource.py @@ -3,7 +3,7 @@ import json from typing import List, Optional from fastapi import HTTPException -from sqlalchemy import and_, text, func +from sqlalchemy import and_, text from sqlmodel import select from apps.datasource.crud.permission import get_column_permission_fields, get_row_permission_filters, is_normal_user @@ -35,6 +35,15 @@ def get_ds(session: SessionDep, id: int): return datasource +def check_status_by_id(session: SessionDep, trans: Trans, ds_id: int, is_raise: bool = False): + ds = session.get(CoreDatasource, ds_id) + if ds is None: + if is_raise: + raise HTTPException(status_code=500, detail=trans('i18n_ds_invalid')) + return False + return check_status(session, trans, ds, is_raise) + + def check_status(session: SessionDep, trans: Trans, ds: CoreDatasource, is_raise: bool = False): conn = get_engine(ds, 10) try: diff --git a/frontend/src/api/datasource.ts b/frontend/src/api/datasource.ts index 7739df2e..493421ec 100644 --- a/frontend/src/api/datasource.ts +++ b/frontend/src/api/datasource.ts @@ -2,6 +2,7 @@ import { request } from '@/utils/request' export const datasourceApi = { check: (data: any) => request.post('/datasource/check', data), + check_by_id: (id: any) => request.get(`/datasource/check/${id}`), add: (data: any) => request.post('/datasource/add', data), list: () => request.get('/datasource/list'), update: (data: any) => request.post('/datasource/update', data), diff --git a/frontend/src/views/chat/ChatCreator.vue b/frontend/src/views/chat/ChatCreator.vue index 727c4555..f53ea62e 100644 --- a/frontend/src/views/chat/ChatCreator.vue +++ b/frontend/src/views/chat/ChatCreator.vue @@ -68,7 +68,12 @@ function selectDsInDialog(ds: any) { function confirmSelectDs() { if (innerDs.value) { - createChat(innerDs.value) + //check first + datasourceApi.check_by_id(innerDs.value).then((res: any) => { + if (res) { + createChat(innerDs.value) + } + }) } } diff --git a/frontend/src/views/ds/Card.vue b/frontend/src/views/ds/Card.vue index 26f1600d..06929dad 100644 --- a/frontend/src/views/ds/Card.vue +++ b/frontend/src/views/ds/Card.vue @@ -4,9 +4,13 @@ import icon_more_outlined from '@/assets/svg/icon_more_outlined.svg' import icon_form_outlined from '@/assets/svg/icon_form_outlined.svg' import icon_chat_outlined from '@/assets/svg/icon_chat_outlined.svg' import { ref, unref, computed } from 'vue' -import { ClickOutside as vClickOutside } from 'element-plus-secondary' +import { ClickOutside as vClickOutside, ElMessage } from 'element-plus-secondary' import { dsTypeWithImg } from './js/ds-type' import edit from '@/assets/svg/icon_edit_outlined.svg' +import { datasourceApi } from '@/api/datasource.ts' +import { encrypted } from '@/views/ds/js/aes.ts' +import { useI18n } from 'vue-i18n' +const { t } = useI18n() const props = withDefaults( defineProps<{ @@ -39,7 +43,12 @@ const handleDel = () => { } const handleQuestion = () => { - emits('question', props.id) + //check first + datasourceApi.check_by_id(props.id).then((res: any) => { + if (res) { + emits('question', props.id) + } + }) } const dataTableDetail = () => {