This is an automated email from the ASF dual-hosted git repository.

wuzhiguo pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/bigtop-manager.git


The following commit(s) were added to refs/heads/main by this push:
     new 59e833b  BIGTOP-4237: Change the JSON field of the LLM table to string 
(#81)
59e833b is described below

commit 59e833b590d1428025875c57bad1cd98fcb48b30
Author: haopeng <[email protected]>
AuthorDate: Tue Oct 8 14:35:44 2024 +0800

    BIGTOP-4237: Change the JSON field of the LLM table to string (#81)
---
 .../assistant/store/PersistentChatMemoryStore.java |   2 +-
 .../manager/dao/handler/JsonTypeHandler.java       |  72 --------
 .../bigtop/manager/dao/po/AuthPlatformPO.java      |   5 +-
 .../apache/bigtop/manager/dao/po/ChatThreadPO.java |   5 +-
 .../apache/bigtop/manager/dao/po/PlatformPO.java   |   5 +-
 .../manager/dao/repository/AuthPlatformDao.java    |   4 -
 .../bigtop/manager/dao/repository/BaseDao.java     |  20 ++-
 .../manager/dao/repository/ChatThreadDao.java      |   4 -
 .../bigtop/manager/dao/repository/PlatformDao.java |   4 +-
 .../bigtop/manager/dao/sql/BaseSqlProvider.java    |  26 ---
 .../apache/bigtop/manager/dao/sql/SQLBuilder.java  | 194 ---------------------
 .../resources/mapper/mysql/AuthPlatformMapper.xml  |  18 +-
 .../resources/mapper/mysql/ChatThreadMapper.xml    |  19 --
 .../main/resources/mapper/mysql/PlatformMapper.xml |   9 -
 .../main/resources/mapper/mysql/ServiceMapper.xml  |   2 +-
 .../mapper/postgresql/AuthPlatformMapper.xml       |  15 +-
 .../mapper/postgresql/ChatThreadMapper.xml         |  13 --
 .../resources/mapper/postgresql/PlatformMapper.xml |   9 -
 .../resources/mapper/postgresql/ServiceMapper.xml  |   2 +-
 .../model/converter/AuthPlatformConverter.java     |  10 +-
 .../model/converter/ChatThreadConverter.java       |  11 +-
 .../server/model/converter/ConverterTool.java      |  11 ++
 .../server/model/converter/PlatformConverter.java  |   8 +-
 .../manager/server/model/dto/ChatThreadDTO.java    |  19 +-
 .../server/service/impl/ChatbotServiceImpl.java    |  81 +++++----
 .../src/main/resources/ddl/MySQL-DDL-CREATE.sql    |   6 +-
 .../main/resources/ddl/PostgreSQL-DDL-CREATE.sql   |   6 +-
 27 files changed, 129 insertions(+), 451 deletions(-)

diff --git 
a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/store/PersistentChatMemoryStore.java
 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/store/PersistentChatMemoryStore.java
index a112b7b..4c3ee25 100644
--- 
a/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/store/PersistentChatMemoryStore.java
+++ 
b/bigtop-manager-ai/bigtop-manager-ai-assistant/src/main/java/org/apache/bigtop/manager/ai/assistant/store/PersistentChatMemoryStore.java
@@ -71,7 +71,7 @@ public class PersistentChatMemoryStore implements 
ChatMemoryStore {
         } else {
             return null;
         }
-        ChatThreadPO chatThreadPO = chatThreadDao.findByThreadId(chatThreadId);
+        ChatThreadPO chatThreadPO = chatThreadDao.findById(chatThreadId);
         chatMessagePO.setUserId(chatThreadPO.getUserId());
         chatMessagePO.setThreadId(chatThreadId);
         return chatMessagePO;
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/handler/JsonTypeHandler.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/handler/JsonTypeHandler.java
deleted file mode 100644
index 4879753..0000000
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/handler/JsonTypeHandler.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.bigtop.manager.dao.handler;
-
-import org.apache.ibatis.type.BaseTypeHandler;
-import org.apache.ibatis.type.JdbcType;
-
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Map;
-
-public class JsonTypeHandler extends BaseTypeHandler<Map<String, String>> {
-
-    private static final ObjectMapper objectMapper = new ObjectMapper();
-
-    @Override
-    public void setNonNullParameter(PreparedStatement ps, int i, Map<String, 
String> parameter, JdbcType jdbcType)
-            throws SQLException {
-        ps.setString(i, convertMapToJson(parameter));
-    }
-
-    @Override
-    public Map<String, String> getNullableResult(ResultSet rs, String 
columnName) throws SQLException {
-        return convertJsonToMap(rs.getString(columnName));
-    }
-
-    @Override
-    public Map<String, String> getNullableResult(ResultSet rs, int 
columnIndex) throws SQLException {
-        return convertJsonToMap(rs.getString(columnIndex));
-    }
-
-    @Override
-    public Map<String, String> getNullableResult(java.sql.CallableStatement 
cs, int columnIndex) throws SQLException {
-        return convertJsonToMap(cs.getString(columnIndex));
-    }
-
-    private String convertMapToJson(Map<String, String> map) {
-        try {
-            return objectMapper.writeValueAsString(map);
-        } catch (Exception e) {
-            throw new RuntimeException("Error converting map to JSON string", 
e);
-        }
-    }
-
-    private Map<String, String> convertJsonToMap(String json) {
-        try {
-            return objectMapper.readValue(json, new TypeReference<Map<String, 
String>>() {});
-        } catch (Exception e) {
-            throw new RuntimeException("Error converting JSON string to map", 
e);
-        }
-    }
-}
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/AuthPlatformPO.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/AuthPlatformPO.java
index 9fbc5b5..8f22e4a 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/AuthPlatformPO.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/AuthPlatformPO.java
@@ -25,7 +25,6 @@ import jakarta.persistence.Column;
 import jakarta.persistence.Id;
 import jakarta.persistence.Table;
 import java.io.Serializable;
-import java.util.Map;
 
 @Data
 @EqualsAndHashCode(callSuper = true)
@@ -36,8 +35,8 @@ public class AuthPlatformPO extends BasePO implements 
Serializable {
     @Column(name = "id")
     private Long id;
 
-    @Column(name = "credentials", columnDefinition = "json", nullable = false)
-    private Map<String, String> credentials;
+    @Column(name = "credentials", nullable = false)
+    private String credentials;
 
     @Column(name = "platform_id", nullable = false)
     private Long platformId;
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ChatThreadPO.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ChatThreadPO.java
index 28e52ea..11ebef6 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ChatThreadPO.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/ChatThreadPO.java
@@ -25,7 +25,6 @@ import jakarta.persistence.Column;
 import jakarta.persistence.Id;
 import jakarta.persistence.Table;
 import java.io.Serializable;
-import java.util.Map;
 
 @Data
 @EqualsAndHashCode(callSuper = true)
@@ -38,8 +37,8 @@ public class ChatThreadPO extends BasePO implements 
Serializable {
     @Column(name = "model", nullable = false, length = 255)
     private String model;
 
-    @Column(name = "thread_info", columnDefinition = "json")
-    private Map<String, String> threadInfo;
+    @Column(name = "thread_info")
+    private String threadInfo;
 
     @Column(name = "user_id", nullable = false)
     private Long userId;
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/PlatformPO.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/PlatformPO.java
index 0180c51..df68a30 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/PlatformPO.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/po/PlatformPO.java
@@ -25,7 +25,6 @@ import jakarta.persistence.Column;
 import jakarta.persistence.Id;
 import jakarta.persistence.Table;
 import java.io.Serializable;
-import java.util.Map;
 
 @Data
 @EqualsAndHashCode(callSuper = true)
@@ -39,8 +38,8 @@ public class PlatformPO extends BasePO implements 
Serializable {
     @Column(name = "name", nullable = false, length = 255)
     private String name;
 
-    @Column(name = "credential", columnDefinition = "json", nullable = false)
-    private Map<String, String> credential;
+    @Column(name = "credential", nullable = false)
+    private String credential;
 
     @Column(name = "support_models", length = 255)
     private String supportModels;
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/AuthPlatformDao.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/AuthPlatformDao.java
index b3500e7..a7e0589 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/AuthPlatformDao.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/AuthPlatformDao.java
@@ -23,9 +23,5 @@ import org.apache.bigtop.manager.dao.po.AuthPlatformPO;
 import org.apache.ibatis.annotations.Param;
 
 public interface AuthPlatformDao extends BaseDao<AuthPlatformPO> {
-    AuthPlatformPO findByAuthId(@Param("authId") Long authId);
-
     AuthPlatformPO findByPlatformId(@Param("platformId") Long platformId);
-
-    void saveWithCredentials(AuthPlatformPO authPlatformPO);
 }
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/BaseDao.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/BaseDao.java
index 686ece1..62b6c7c 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/BaseDao.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/BaseDao.java
@@ -27,6 +27,8 @@ import org.apache.ibatis.annotations.Options;
 import org.apache.ibatis.annotations.SelectProvider;
 import org.apache.ibatis.annotations.UpdateProvider;
 
+import org.springframework.transaction.annotation.Transactional;
+
 import java.io.Serializable;
 import java.util.Collection;
 import java.util.List;
@@ -63,14 +65,24 @@ public interface BaseDao<Entity> {
     /**
      * Partially update the entities by primary key.
      */
-    @UpdateProvider(type = BaseSqlProvider.class, method = 
"partialUpdateByIds")
-    int partialUpdateByIds(List<Entity> entities);
+    @Transactional
+    default int partialUpdateByIds(List<Entity> entities) {
+        for (Entity entity : entities) {
+            partialUpdateById(entity);
+        }
+        return entities.size();
+    }
 
     /**
      * Fully update the entities by primary key.
      */
-    @UpdateProvider(type = BaseSqlProvider.class, method = "updateByIds")
-    int updateByIds(List<Entity> entities);
+    @Transactional
+    default int updateByIds(List<Entity> entities) {
+        for (Entity entity : entities) {
+            updateById(entity);
+        }
+        return entities.size();
+    }
 
     /**
      * Query the entity by primary key.
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/ChatThreadDao.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/ChatThreadDao.java
index f8abe55..389e5b3 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/ChatThreadDao.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/ChatThreadDao.java
@@ -27,11 +27,7 @@ import java.util.List;
 public interface ChatThreadDao extends BaseDao<ChatThreadPO> {
     List<ChatThreadPO> findAllByUserId(@Param("userId") Long userId);
 
-    ChatThreadPO findByThreadId(@Param("id") Long id);
-
     List<ChatThreadPO> findAllByAuthIdAndUserId(@Param("authId") Long authId, 
@Param("userId") Long userId);
 
-    void saveWithThreadInfo(ChatThreadPO chatThreadPO);
-
     List<ChatThreadPO> findAllByAuthId(@Param("authId") Long authId);
 }
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/PlatformDao.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/PlatformDao.java
index e2d3c97..ea68335 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/PlatformDao.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/PlatformDao.java
@@ -20,6 +20,4 @@ package org.apache.bigtop.manager.dao.repository;
 
 import org.apache.bigtop.manager.dao.po.PlatformPO;
 
-public interface PlatformDao extends BaseDao<PlatformPO> {
-    PlatformPO findByPlatformId(Long id);
-}
+public interface PlatformDao extends BaseDao<PlatformPO> {}
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/BaseSqlProvider.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/BaseSqlProvider.java
index d2f9296..c76eef0 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/BaseSqlProvider.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/BaseSqlProvider.java
@@ -71,19 +71,6 @@ public class BaseSqlProvider {
         return SQLBuilder.update(tableMetaData, entity, databaseId, true);
     }
 
-    public <Entity> String partialUpdateByIds(List<Entity> entities, 
ProviderContext context) {
-        Assert.notNull(entities, "entities must not be null");
-        Assert.notEmpty(entities, "entities list must not be empty");
-
-        String databaseId = context.getDatabaseId();
-
-        Class<?> entityClass = entities.get(0).getClass();
-
-        TableMetaData tableMetaData = TableMetaData.forClass(entityClass);
-
-        return SQLBuilder.updateList(tableMetaData, entities, databaseId, 
true);
-    }
-
     public <Entity> String updateById(Entity entity, ProviderContext context) {
         Assert.notNull(entity, "entity must not null");
 
@@ -95,19 +82,6 @@ public class BaseSqlProvider {
         return SQLBuilder.update(tableMetaData, entity, databaseId, false);
     }
 
-    public <Entity> String updateByIds(List<Entity> entities, ProviderContext 
context) {
-        Assert.notNull(entities, "entities must not be null");
-        Assert.notEmpty(entities, "entities list must not be empty");
-
-        String databaseId = context.getDatabaseId();
-
-        Class<?> entityClass = entities.get(0).getClass();
-
-        TableMetaData tableMetaData = TableMetaData.forClass(entityClass);
-
-        return SQLBuilder.updateList(tableMetaData, entities, databaseId, 
false);
-    }
-
     public String selectById(Serializable id, ProviderContext context) {
         String databaseId = context.getDatabaseId();
 
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/SQLBuilder.java
 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/SQLBuilder.java
index 4b56c73..5b06e37 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/SQLBuilder.java
+++ 
b/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/sql/SQLBuilder.java
@@ -41,7 +41,6 @@ import java.io.Serializable;
 import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -273,192 +272,6 @@ public class SQLBuilder {
         return sql.toString();
     }
 
-    public static <Entity> String updateList(
-            TableMetaData tableMetaData, List<Entity> entities, String 
databaseId, boolean partial) {
-        if (entities == null || entities.isEmpty()) {
-            throw new IllegalArgumentException("Entities list must not be null 
or empty");
-        }
-
-        Class<?> entityClass = entities.get(0).getClass();
-        Map<String, String> fieldColumnMap = tableMetaData.getFieldColumnMap();
-
-        StringBuilder sqlBuilder = new StringBuilder();
-        switch (DBType.toType(databaseId)) {
-            case MYSQL: {
-                sqlBuilder
-                        .append("UPDATE ")
-                        .append(keywordsFormat(tableMetaData.getTableName(), 
DBType.MYSQL))
-                        .append(" SET ");
-                Map<String, StringBuilder> setClauses = new LinkedHashMap<>();
-                String primaryKey = keywordsFormat("id", DBType.MYSQL);
-                for (Map.Entry<String, String> entry : 
fieldColumnMap.entrySet()) {
-                    // Ignore primary key
-                    if (Objects.equals(entry.getKey(), 
tableMetaData.getPkProperty())) {
-                        primaryKey = keywordsFormat(entry.getValue(), 
DBType.MYSQL);
-                        continue;
-                    }
-                    Field field = ReflectionUtils.findField(entityClass, 
entry.getKey());
-                    if (field == null || checkBaseField(field)) {
-                        continue;
-                    }
-                    StringBuilder caseClause = new StringBuilder();
-                    caseClause
-                            .append(keywordsFormat(entry.getValue(), 
DBType.MYSQL))
-                            .append(" = CASE ");
-                    for (Entity entity : entities) {
-                        PropertyDescriptor ps = 
BeanUtils.getPropertyDescriptor(entityClass, entry.getKey());
-                        if (ps == null || ps.getReadMethod() == null) {
-                            continue;
-                        }
-                        Object value = 
ReflectionUtils.invokeMethod(ps.getReadMethod(), entity);
-                        PropertyDescriptor pkPs =
-                                BeanUtils.getPropertyDescriptor(entityClass, 
tableMetaData.getPkProperty());
-                        if (pkPs == null || pkPs.getReadMethod() == null) {
-                            continue;
-                        }
-                        Object pkValue = 
ReflectionUtils.invokeMethod(pkPs.getReadMethod(), entity);
-
-                        if (!ObjectUtils.isEmpty(value)) {
-                            caseClause
-                                    .append("WHEN ")
-                                    .append(primaryKey)
-                                    .append(" = '")
-                                    .append(pkValue)
-                                    .append("' THEN '")
-                                    
.append(escapeSingleQuote(value.toString()))
-                                    .append("' ");
-                        } else if (!partial) {
-                            Column column = field.getAnnotation(Column.class);
-                            if (column != null && !column.nullable() && value 
== null) {
-                                continue;
-                            }
-                            caseClause
-                                    .append("WHEN ")
-                                    .append(primaryKey)
-                                    .append(" = '")
-                                    .append(pkValue)
-                                    .append("' THEN NULL ");
-                        }
-                    }
-                    if (caseClause.toString().endsWith("CASE ")) {
-                        caseClause.append("WHEN TRUE THEN ");
-                    } else {
-                        caseClause.append("ELSE ");
-                    }
-                    caseClause
-                            .append(keywordsFormat(entry.getValue(), 
DBType.MYSQL))
-                            .append(" ");
-                    caseClause.append("END");
-                    setClauses.put(entry.getValue(), caseClause);
-                }
-                sqlBuilder.append(String.join(", ", setClauses.values()));
-
-                sqlBuilder.append(" WHERE ").append(primaryKey).append(" IN 
(");
-                String pkValues = entities.stream()
-                        .map(entity -> {
-                            PropertyDescriptor pkPs =
-                                    
BeanUtils.getPropertyDescriptor(entityClass, tableMetaData.getPkProperty());
-                            Object pkValue = 
ReflectionUtils.invokeMethod(pkPs.getReadMethod(), entity);
-                            return "'" + pkValue.toString() + "'";
-                        })
-                        .collect(Collectors.joining(", "));
-
-                sqlBuilder.append(pkValues).append(")");
-                break;
-            }
-            case POSTGRESQL: {
-                sqlBuilder
-                        .append("UPDATE ")
-                        .append("\"")
-                        .append(tableMetaData.getTableName())
-                        .append("\"")
-                        .append(" SET ");
-                Map<String, StringBuilder> setClauses = new LinkedHashMap<>();
-                String primaryKey = keywordsFormat("id", DBType.POSTGRESQL);
-                for (Map.Entry<String, String> entry : 
fieldColumnMap.entrySet()) {
-                    // Ignore primary key
-                    if (Objects.equals(entry.getKey(), 
tableMetaData.getPkProperty())) {
-                        primaryKey = keywordsFormat(entry.getValue(), 
DBType.POSTGRESQL);
-                        continue;
-                    }
-                    Field field = ReflectionUtils.findField(entityClass, 
entry.getKey());
-                    if (field == null || checkBaseField(field)) {
-                        continue;
-                    }
-                    StringBuilder caseClause = new StringBuilder();
-                    caseClause
-                            .append(keywordsFormat(entry.getValue(), 
DBType.POSTGRESQL))
-                            .append(" = CASE ");
-
-                    for (Entity entity : entities) {
-                        PropertyDescriptor ps = 
BeanUtils.getPropertyDescriptor(entityClass, entry.getKey());
-                        if (ps == null || ps.getReadMethod() == null) {
-                            continue;
-                        }
-                        Object value = 
ReflectionUtils.invokeMethod(ps.getReadMethod(), entity);
-                        PropertyDescriptor pkPs =
-                                BeanUtils.getPropertyDescriptor(entityClass, 
tableMetaData.getPkProperty());
-                        if (pkPs == null || pkPs.getReadMethod() == null) {
-                            continue;
-                        }
-                        Object pkValue = 
ReflectionUtils.invokeMethod(pkPs.getReadMethod(), entity);
-
-                        if (!ObjectUtils.isEmpty(value)) {
-                            caseClause
-                                    .append("WHEN ")
-                                    .append(primaryKey)
-                                    .append(" = '")
-                                    .append(pkValue)
-                                    .append("' THEN '")
-                                    
.append(escapeSingleQuote(value.toString()))
-                                    .append("' ");
-                        } else if (!partial) {
-                            Column column = field.getAnnotation(Column.class);
-                            if (column != null && !column.nullable() && value 
== null) {
-                                continue;
-                            }
-                            caseClause
-                                    .append("WHEN ")
-                                    .append(primaryKey)
-                                    .append(" = '")
-                                    .append(pkValue)
-                                    .append("' THEN NULL ");
-                        }
-                    }
-                    if (caseClause.toString().endsWith("CASE ")) {
-                        caseClause.append("WHEN TRUE THEN ");
-                    } else {
-                        caseClause.append("ELSE ");
-                    }
-                    caseClause
-                            .append(keywordsFormat(entry.getValue(), 
DBType.POSTGRESQL))
-                            .append(" ");
-                    caseClause.append("END");
-                    setClauses.put(entry.getValue(), caseClause);
-                }
-                sqlBuilder.append(String.join(", ", setClauses.values()));
-
-                sqlBuilder.append(" WHERE ").append(primaryKey).append(" IN 
(");
-                String pkValues = entities.stream()
-                        .map(entity -> {
-                            PropertyDescriptor pkPs =
-                                    
BeanUtils.getPropertyDescriptor(entityClass, tableMetaData.getPkProperty());
-                            Object pkValue = 
ReflectionUtils.invokeMethod(pkPs.getReadMethod(), entity);
-                            return "'" + pkValue.toString() + "'";
-                        })
-                        .collect(Collectors.joining(", "));
-
-                sqlBuilder.append(pkValues).append(")");
-                break;
-            }
-            default: {
-                log.error("Unsupported data source");
-            }
-        }
-
-        return sqlBuilder.toString();
-    }
-
     public static String selectById(TableMetaData tableMetaData, String 
databaseId, Serializable id) {
 
         SQL sql = new SQL();
@@ -643,13 +456,6 @@ public class SQLBuilder {
         return "#{" + property + "}";
     }
 
-    private static String escapeSingleQuote(String input) {
-        if (input != null) {
-            return input.replace("'", "''");
-        }
-        return null;
-    }
-
     private static boolean checkBaseField(Field field) {
         return field.isAnnotationPresent(CreateBy.class)
                 || field.isAnnotationPresent(CreateTime.class)
diff --git 
a/bigtop-manager-dao/src/main/resources/mapper/mysql/AuthPlatformMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/mysql/AuthPlatformMapper.xml
index d8b978e..f4da188 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/mysql/AuthPlatformMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/AuthPlatformMapper.xml
@@ -26,24 +26,8 @@
         id, credentials, platfotrm_id
     </sql>
 
-    <resultMap id="AuthPlatformResultMap" 
type="org.apache.bigtop.manager.dao.po.AuthPlatformPO">
-        <result property="credentials" column="credentials" 
typeHandler="org.apache.bigtop.manager.dao.handler.JsonTypeHandler"/>
-    </resultMap>
-
-    <select id="findByAuthId" resultMap="AuthPlatformResultMap">
-        SELECT * FROM llm_auth_platform WHERE id = #{authId} AND is_deleted = 0
-    </select>
-
-    <select id="findByPlatformId" resultMap="AuthPlatformResultMap">
+    <select id="findByPlatformId" 
resultType="org.apache.bigtop.manager.dao.po.AuthPlatformPO">
         SELECT * FROM llm_auth_platform WHERE platform_id = #{platformId} AND 
is_deleted = 0
     </select>
 
-    <insert id="saveWithCredentials" 
parameterType="org.apache.bigtop.manager.dao.po.AuthPlatformPO" 
useGeneratedKeys="true" keyProperty="id">
-        INSERT INTO llm_auth_platform (platform_id, credentials)
-        VALUES (#{platformId}, #{credentials, 
typeHandler=org.apache.bigtop.manager.dao.handler.JsonTypeHandler})
-        ON DUPLICATE KEY UPDATE
-        platform_id = VALUES(platform_id),
-        credentials = VALUES(credentials)
-    </insert>
-
 </mapper>
\ No newline at end of file
diff --git 
a/bigtop-manager-dao/src/main/resources/mapper/mysql/ChatThreadMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/mysql/ChatThreadMapper.xml
index 0622a6a..396d08b 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/mysql/ChatThreadMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/ChatThreadMapper.xml
@@ -25,10 +25,6 @@
         id, user_id, auth_id, platform_id, model
     </sql>
 
-    <resultMap id="ChatThreadResultMap" 
type="org.apache.bigtop.manager.dao.po.ChatThreadPO">
-        <result property="threadInfo" column="thread_info" 
typeHandler="org.apache.bigtop.manager.dao.handler.JsonTypeHandler"/>
-    </resultMap>
-
     <select id="findAllByUserId" 
resultType="org.apache.bigtop.manager.dao.po.ChatThreadPO">
         SELECT *
         FROM llm_chat_thread
@@ -42,21 +38,6 @@
         WHERE auth_id = #{authId} AND user_id = #{userId} AND is_deleted = 0
     </select>
 
-    <select id="findByThreadId" resultMap="ChatThreadResultMap">
-        SELECT * FROM llm_chat_thread WHERE id = #{id} AND is_deleted = 0
-    </select>
-
-    <insert id="saveWithThreadInfo" 
parameterType="org.apache.bigtop.manager.dao.po.ChatThreadPO" 
useGeneratedKeys="true" keyProperty="id">
-        INSERT INTO llm_chat_thread (auth_id, platform_id, user_id, model, 
thread_info)
-        VALUES (#{authId}, #{platformId}, #{userId}, #{model}, #{threadInfo, 
typeHandler=org.apache.bigtop.manager.dao.handler.JsonTypeHandler})
-            ON DUPLICATE KEY UPDATE
-            auth_id = VALUES(auth_id),
-            platform_id = VALUES(platform_id),
-            user_id = VALUES(user_id),
-            model = VALUES(model),
-            thread_info = VALUES(thread_info)
-    </insert>
-
     <select id="findAllByAuthId" 
resultType="org.apache.bigtop.manager.dao.po.ChatThreadPO">
         SELECT *
         FROM llm_chat_thread
diff --git 
a/bigtop-manager-dao/src/main/resources/mapper/mysql/PlatformMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/mysql/PlatformMapper.xml
index e4ca903..5a41a57 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/mysql/PlatformMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/PlatformMapper.xml
@@ -26,13 +26,4 @@
         id, name, credential, support_models
     </sql>
 
-    <!-- Define the resultMap with the custom typeHandler for the credential 
column -->
-    <resultMap id="PlatformResultMap" 
type="org.apache.bigtop.manager.dao.po.PlatformPO">
-        <result property="credential" column="credential" 
typeHandler="org.apache.bigtop.manager.dao.handler.JsonTypeHandler"/>
-    </resultMap>
-
-    <select id="findByPlatformId" resultMap="PlatformResultMap">
-        SELECT * FROM llm_platform WHERE id = #{id}
-    </select>
-
 </mapper>
\ No newline at end of file
diff --git 
a/bigtop-manager-dao/src/main/resources/mapper/mysql/ServiceMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/mysql/ServiceMapper.xml
index 5a40565..9b38c83 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/mysql/ServiceMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/mysql/ServiceMapper.xml
@@ -122,7 +122,7 @@
                 cluster_id = #{clusterId}
             </if>
             <if test="serviceNames != null and serviceNames.size() > 0">
-                and service_name = in
+                and service_name in
                 <foreach collection="serviceNames" item="serviceName" 
index="index" open="(" close=")" separator=", ">
                     #{serviceName}
                 </foreach>
diff --git 
a/bigtop-manager-dao/src/main/resources/mapper/postgresql/AuthPlatformMapper.xml
 
b/bigtop-manager-dao/src/main/resources/mapper/postgresql/AuthPlatformMapper.xml
index 4ead82d..dcfaedc 100644
--- 
a/bigtop-manager-dao/src/main/resources/mapper/postgresql/AuthPlatformMapper.xml
+++ 
b/bigtop-manager-dao/src/main/resources/mapper/postgresql/AuthPlatformMapper.xml
@@ -26,21 +26,8 @@
         id, credentials, platfotrm_id
     </sql>
 
-    <resultMap id="AuthPlatformResultMap" 
type="org.apache.bigtop.manager.dao.po.AuthPlatformPO">
-        <result property="credentials" column="credentials" 
typeHandler="org.apache.bigtop.manager.dao.handler.JsonTypeHandler"/>
-    </resultMap>
-
-    <select id="findByAuthId" resultMap="AuthPlatformResultMap">
-        SELECT * FROM llm_auth_platform WHERE id = #{authId} AND is_deleted = 
false
-    </select>
-
-    <select id="findByPlatformId" resultMap="AuthPlatformResultMap">
+    <select id="findByPlatformId" 
resultType="org.apache.bigtop.manager.dao.po.AuthPlatformPO">
         SELECT * FROM llm_auth_platform WHERE platform_id = #{platformId} AND 
is_deleted = false
     </select>
 
-    <insert id="saveWithCredentials" 
parameterType="org.apache.bigtop.manager.dao.po.AuthPlatformPO" 
useGeneratedKeys="true" keyProperty="id">
-        INSERT INTO llm_auth_platform (platform_id, credentials)
-        VALUES (#{platformId}, #{credentials, 
typeHandler=org.apache.bigtop.manager.dao.handler.JsonTypeHandler}::json)
-    </insert>
-
 </mapper>
\ No newline at end of file
diff --git 
a/bigtop-manager-dao/src/main/resources/mapper/postgresql/ChatThreadMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/postgresql/ChatThreadMapper.xml
index 2aa96da..21bb809 100644
--- 
a/bigtop-manager-dao/src/main/resources/mapper/postgresql/ChatThreadMapper.xml
+++ 
b/bigtop-manager-dao/src/main/resources/mapper/postgresql/ChatThreadMapper.xml
@@ -25,10 +25,6 @@
         id, user_id, auth_id, platform_id, model
     </sql>
 
-    <resultMap id="ChatThreadResultMap" 
type="org.apache.bigtop.manager.dao.po.ChatThreadPO">
-        <result property="threadInfo" column="thread_info" 
typeHandler="org.apache.bigtop.manager.dao.handler.JsonTypeHandler"/>
-    </resultMap>
-
     <select id="findAllByUserId" 
resultType="org.apache.bigtop.manager.dao.po.ChatThreadPO">
         SELECT *
         FROM llm_chat_thread
@@ -42,15 +38,6 @@
         WHERE auth_id = #{authId} AND user_id = #{userId} AND is_deleted = 
false
     </select>
 
-    <select id="findByThreadId" resultMap="ChatThreadResultMap">
-        SELECT * FROM llm_chat_thread WHERE id = #{id} AND is_deleted = false
-    </select>
-
-    <insert id="saveWithThreadInfo" 
parameterType="org.apache.bigtop.manager.dao.po.ChatThreadPO" 
useGeneratedKeys="true" keyProperty="id">
-        INSERT INTO llm_chat_thread (auth_id, platform_id, user_id, model, 
thread_info)
-        VALUES (#{authId}, #{platformId}, #{userId}, #{model}, #{threadInfo, 
typeHandler=org.apache.bigtop.manager.dao.handler.JsonTypeHandler}::json)
-    </insert>
-
     <select id="findAllByAuthId" 
resultType="org.apache.bigtop.manager.dao.po.ChatThreadPO">
         SELECT *
         FROM llm_chat_thread
diff --git 
a/bigtop-manager-dao/src/main/resources/mapper/postgresql/PlatformMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/postgresql/PlatformMapper.xml
index 885ae6d..cd63096 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/postgresql/PlatformMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/postgresql/PlatformMapper.xml
@@ -26,13 +26,4 @@
         "id", "name", "credential", "support_models"
     </sql>
 
-    <!-- Define the resultMap with the custom typeHandler for the credential 
column -->
-    <resultMap id="PlatformResultMap" 
type="org.apache.bigtop.manager.dao.po.PlatformPO">
-        <result property="credential" column="credential" 
typeHandler="org.apache.bigtop.manager.dao.handler.JsonTypeHandler"/>
-    </resultMap>
-
-    <select id="findByPlatformId" resultMap="PlatformResultMap">
-        SELECT * FROM llm_platform WHERE id = #{id}
-    </select>
-
 </mapper>
\ No newline at end of file
diff --git 
a/bigtop-manager-dao/src/main/resources/mapper/postgresql/ServiceMapper.xml 
b/bigtop-manager-dao/src/main/resources/mapper/postgresql/ServiceMapper.xml
index 5a40565..9b38c83 100644
--- a/bigtop-manager-dao/src/main/resources/mapper/postgresql/ServiceMapper.xml
+++ b/bigtop-manager-dao/src/main/resources/mapper/postgresql/ServiceMapper.xml
@@ -122,7 +122,7 @@
                 cluster_id = #{clusterId}
             </if>
             <if test="serviceNames != null and serviceNames.size() > 0">
-                and service_name = in
+                and service_name in
                 <foreach collection="serviceNames" item="serviceName" 
index="index" open="(" close=")" separator=", ">
                     #{serviceName}
                 </foreach>
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/AuthPlatformConverter.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/AuthPlatformConverter.java
index a6ea344..7fb9ff4 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/AuthPlatformConverter.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/AuthPlatformConverter.java
@@ -37,7 +37,9 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
-@Mapper(config = MapStructSharedConfig.class)
+@Mapper(
+        uses = {ConverterTool.class},
+        config = MapStructSharedConfig.class)
 public interface AuthPlatformConverter {
     AuthPlatformConverter INSTANCE = 
Mappers.getMapper(AuthPlatformConverter.class);
 
@@ -59,4 +61,10 @@ public interface AuthPlatformConverter {
     default void afterMapping(@MappingTarget AuthPlatformDTO authPlatformDTO, 
AuthPlatformReq authPlatformReq) {
         
authPlatformDTO.setAuthCredentials(mapAuthCredentials(authPlatformReq.getAuthCredentials()));
     }
+
+    @Mapping(source = "authCredentials", target = "credentials", 
qualifiedByName = "map2String")
+    AuthPlatformPO fromDTO2PO(AuthPlatformDTO authPlatformDTO);
+
+    @Mapping(source = "credentials", target = "authCredentials", 
qualifiedByName = "jsonString2Map")
+    AuthPlatformDTO fromPO2DTO(AuthPlatformPO authPlatformPO);
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ChatThreadConverter.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ChatThreadConverter.java
index 6931da2..5da0b64 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ChatThreadConverter.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ChatThreadConverter.java
@@ -20,16 +20,25 @@ package org.apache.bigtop.manager.server.model.converter;
 
 import org.apache.bigtop.manager.dao.po.ChatThreadPO;
 import org.apache.bigtop.manager.server.config.MapStructSharedConfig;
+import org.apache.bigtop.manager.server.model.dto.ChatThreadDTO;
 import org.apache.bigtop.manager.server.model.vo.ChatThreadVO;
 
 import org.mapstruct.Mapper;
 import org.mapstruct.Mapping;
 import org.mapstruct.factory.Mappers;
 
-@Mapper(config = MapStructSharedConfig.class)
+@Mapper(
+        uses = {ConverterTool.class},
+        config = MapStructSharedConfig.class)
 public interface ChatThreadConverter {
     ChatThreadConverter INSTANCE = 
Mappers.getMapper(ChatThreadConverter.class);
 
     @Mapping(source = "id", target = "threadId")
     ChatThreadVO fromPO2VO(ChatThreadPO platformAuthorizedPO);
+
+    @Mapping(source = "threadInfo", target = "threadInfo", qualifiedByName = 
"map2String")
+    ChatThreadPO fromDTO2PO(ChatThreadDTO chatThreadDTO);
+
+    @Mapping(source = "threadInfo", target = "threadInfo", qualifiedByName = 
"jsonString2Map")
+    ChatThreadDTO fromPO2DTO(ChatThreadPO chatThreadPO);
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ConverterTool.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ConverterTool.java
index 087fd50..714af19 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ConverterTool.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/ConverterTool.java
@@ -27,6 +27,7 @@ import org.mapstruct.Named;
 import com.fasterxml.jackson.core.type.TypeReference;
 
 import java.util.List;
+import java.util.Map;
 
 public class ConverterTool {
 
@@ -49,4 +50,14 @@ public class ConverterTool {
     public List<PropertyVO> json2PropertyVOList(String json) {
         return JsonUtils.readFromString(json, new TypeReference<>() {});
     }
+
+    @Named("map2String")
+    public String map2String(Map<String, String> map) {
+        return JsonUtils.writeAsString(map);
+    }
+
+    @Named("jsonString2Map")
+    public Map<String, String> jsonString2Map(String json) {
+        return JsonUtils.readFromString(json, new TypeReference<>() {});
+    }
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformConverter.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformConverter.java
index 0ee4285..f872b51 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformConverter.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/converter/PlatformConverter.java
@@ -27,6 +27,7 @@ import org.apache.bigtop.manager.server.model.vo.PlatformVO;
 
 import org.mapstruct.AfterMapping;
 import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
 import org.mapstruct.MappingTarget;
 import org.mapstruct.factory.Mappers;
 
@@ -34,7 +35,9 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
-@Mapper(config = MapStructSharedConfig.class)
+@Mapper(
+        uses = {ConverterTool.class},
+        config = MapStructSharedConfig.class)
 public interface PlatformConverter {
     PlatformConverter INSTANCE = Mappers.getMapper(PlatformConverter.class);
 
@@ -56,4 +59,7 @@ public interface PlatformConverter {
     default void afterMapping(@MappingTarget PlatformDTO platformDTO, 
PlatformReq platformReq) {
         
platformDTO.setAuthCredentials(mapAuthCredentials(platformReq.getAuthCredentials()));
     }
+
+    @Mapping(source = "credential", target = "authCredentials", 
qualifiedByName = "jsonString2Map")
+    PlatformDTO fromPO2DTO(PlatformPO platformPO);
 }
diff --git 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/PlatformDao.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/ChatThreadDTO.java
similarity index 72%
copy from 
bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/PlatformDao.java
copy to 
bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/ChatThreadDTO.java
index e2d3c97..dfb8943 100644
--- 
a/bigtop-manager-dao/src/main/java/org/apache/bigtop/manager/dao/repository/PlatformDao.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/model/dto/ChatThreadDTO.java
@@ -16,10 +16,21 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.bigtop.manager.dao.repository;
+package org.apache.bigtop.manager.server.model.dto;
 
-import org.apache.bigtop.manager.dao.po.PlatformPO;
+import lombok.Data;
 
-public interface PlatformDao extends BaseDao<PlatformPO> {
-    PlatformPO findByPlatformId(Long id);
+import java.util.Map;
+
+@Data
+public class ChatThreadDTO {
+    private Long id;
+
+    private Long platformId;
+
+    private Long authId;
+
+    private Map<String, String> authCredentials;
+
+    private Map<String, String> threadInfo;
 }
diff --git 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ChatbotServiceImpl.java
 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ChatbotServiceImpl.java
index ee8ea0d..7cbbbc1 100644
--- 
a/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ChatbotServiceImpl.java
+++ 
b/bigtop-manager-server/src/main/java/org/apache/bigtop/manager/server/service/impl/ChatbotServiceImpl.java
@@ -41,6 +41,8 @@ import 
org.apache.bigtop.manager.server.model.converter.ChatMessageConverter;
 import org.apache.bigtop.manager.server.model.converter.ChatThreadConverter;
 import org.apache.bigtop.manager.server.model.converter.PlatformConverter;
 import org.apache.bigtop.manager.server.model.dto.AuthPlatformDTO;
+import org.apache.bigtop.manager.server.model.dto.ChatThreadDTO;
+import org.apache.bigtop.manager.server.model.dto.PlatformDTO;
 import org.apache.bigtop.manager.server.model.vo.AuthPlatformVO;
 import org.apache.bigtop.manager.server.model.vo.ChatMessageVO;
 import org.apache.bigtop.manager.server.model.vo.ChatThreadVO;
@@ -130,14 +132,15 @@ public class ChatbotServiceImpl implements ChatbotService 
{
 
     @Override
     public List<PlatformAuthCredentialVO> platformsAuthCredentials(Long 
platformId) {
-        PlatformPO platformPO = platformDao.findByPlatformId(platformId);
+        PlatformPO platformPO = platformDao.findById(platformId);
         if (platformPO == null) {
             throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_FOUND);
         }
         List<PlatformAuthCredentialVO> platformAuthCredentialVOs = new 
ArrayList<>();
-        for (String key : platformPO.getCredential().keySet()) {
-            PlatformAuthCredentialVO platformAuthCredentialVO =
-                    new PlatformAuthCredentialVO(key, 
platformPO.getCredential().get(key));
+        PlatformDTO platformDTO = 
PlatformConverter.INSTANCE.fromPO2DTO(platformPO);
+        for (String key : platformDTO.getAuthCredentials().keySet()) {
+            PlatformAuthCredentialVO platformAuthCredentialVO = new 
PlatformAuthCredentialVO(
+                    key, platformDTO.getAuthCredentials().get(key));
             platformAuthCredentialVOs.add(platformAuthCredentialVO);
         }
         return platformAuthCredentialVOs;
@@ -161,11 +164,12 @@ public class ChatbotServiceImpl implements ChatbotService 
{
 
     @Override
     public AuthPlatformVO addAuthorizedPlatform(AuthPlatformDTO 
authPlatformDTO) {
-        PlatformPO platformPO = 
platformDao.findByPlatformId(authPlatformDTO.getPlatformId());
+        PlatformPO platformPO = 
platformDao.findById(authPlatformDTO.getPlatformId());
         if (platformPO == null) {
             throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_FOUND);
         }
-        Map<String, String> credentialSet = getStringMap(authPlatformDTO, 
platformPO);
+        Map<String, String> credentialSet =
+                getStringMap(authPlatformDTO, 
PlatformConverter.INSTANCE.fromPO2DTO(platformPO));
         List<String> models = 
List.of(platformPO.getSupportModels().split(","));
         if (models.isEmpty()) {
             throw new ApiException(ApiExceptionEnum.MODEL_NOT_SUPPORTED);
@@ -175,22 +179,20 @@ public class ChatbotServiceImpl implements ChatbotService 
{
             throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_FOUND);
         }
 
-        AuthPlatformPO authPlatformPO = new AuthPlatformPO();
-        authPlatformPO.setCredentials(credentialSet);
-        authPlatformPO.setPlatformId(platformPO.getId());
-
-        authPlatformDao.saveWithCredentials(authPlatformPO);
+        authPlatformDTO.setAuthCredentials(credentialSet);
+        AuthPlatformPO authPlatformPO = 
AuthPlatformConverter.INSTANCE.fromDTO2PO(authPlatformDTO);
+        authPlatformDao.save(authPlatformPO);
         AuthPlatformVO authPlatformVO = 
AuthPlatformConverter.INSTANCE.fromPO2VO(authPlatformPO, platformPO);
         authPlatformVO.setSupportModels(platformPO.getSupportModels());
         authPlatformVO.setPlatformName(platformPO.getName());
         return authPlatformVO;
     }
 
-    private static @NotNull Map<String, String> getStringMap(AuthPlatformDTO 
authPlatformDTO, PlatformPO platformPO) {
-        if (platformPO == null) {
+    private static @NotNull Map<String, String> getStringMap(AuthPlatformDTO 
authPlatformDTO, PlatformDTO platformDTO) {
+        if (platformDTO == null) {
             throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_FOUND);
         }
-        Map<String, String> credentialNeed = platformPO.getCredential();
+        Map<String, String> credentialNeed = platformDTO.getAuthCredentials();
         Map<String, String> credentialGet = 
authPlatformDTO.getAuthCredentials();
         Map<String, String> credentialSet = new HashMap<>();
         for (String key : credentialNeed.keySet()) {
@@ -204,8 +206,8 @@ public class ChatbotServiceImpl implements ChatbotService {
 
     @Override
     public boolean deleteAuthorizedPlatform(Long authId) {
-        AuthPlatformPO authPlatformPO = authPlatformDao.findByAuthId(authId);
-        if (authPlatformPO == null) {
+        AuthPlatformPO authPlatformPO = authPlatformDao.findById(authId);
+        if (authPlatformPO == null || authPlatformPO.getIsDeleted()) {
             throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_AUTHORIZED);
         }
 
@@ -228,34 +230,36 @@ public class ChatbotServiceImpl implements ChatbotService 
{
 
     @Override
     public ChatThreadVO createChatThreads(Long authId, String model) {
-        AuthPlatformPO authPlatformPO = authPlatformDao.findByAuthId(authId);
-        if (authPlatformPO == null) {
+        AuthPlatformPO authPlatformPO = authPlatformDao.findById(authId);
+        if (authPlatformPO == null || authPlatformPO.getIsDeleted()) {
             throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_AUTHORIZED);
         }
+        AuthPlatformDTO authPlatformDTO = 
AuthPlatformConverter.INSTANCE.fromPO2DTO(authPlatformPO);
         Long userId = SessionUserHolder.getUserId();
-        PlatformPO platformPO = 
platformDao.findByPlatformId(authPlatformPO.getPlatformId());
+        PlatformPO platformPO = 
platformDao.findById(authPlatformPO.getPlatformId());
         List<String> supportModels = 
List.of(platformPO.getSupportModels().split(","));
         if (!supportModels.contains(model)) {
             throw new ApiException(ApiExceptionEnum.MODEL_NOT_SUPPORTED);
         }
-        ChatThreadPO chatThreadPO = new ChatThreadPO();
-        chatThreadPO.setUserId(userId);
-        chatThreadPO.setModel(model);
-        chatThreadPO.setAuthId(authPlatformPO.getId());
-        chatThreadPO.setPlatformId(authPlatformPO.getPlatformId());
+        ChatThreadDTO chatThreadDTO = new ChatThreadDTO();
+        chatThreadDTO.setPlatformId(platformPO.getId());
+        chatThreadDTO.setAuthId(authPlatformPO.getId());
 
-        AIAssistant aiAssistant = buildAIAssistant(
-                platformPO.getName(), chatThreadPO.getModel(), 
authPlatformPO.getCredentials(), null, null);
+        AIAssistant aiAssistant =
+                buildAIAssistant(platformPO.getName(), model, 
authPlatformDTO.getAuthCredentials(), null, null);
         Map<String, String> threadInfo = aiAssistant.createThread();
-        chatThreadPO.setThreadInfo(threadInfo);
-        chatThreadDao.saveWithThreadInfo(chatThreadPO);
+        chatThreadDTO.setThreadInfo(threadInfo);
+        ChatThreadPO chatThreadPO = 
ChatThreadConverter.INSTANCE.fromDTO2PO(chatThreadDTO);
+        chatThreadPO.setUserId(userId);
+        chatThreadPO.setModel(model);
+        chatThreadDao.save(chatThreadPO);
         return ChatThreadConverter.INSTANCE.fromPO2VO(chatThreadPO);
     }
 
     @Override
     public boolean deleteChatThreads(Long authId, Long threadId) {
         ChatThreadPO chatThreadPO = chatThreadDao.findById(threadId);
-        if (chatThreadPO == null) {
+        if (chatThreadPO == null || chatThreadPO.getIsDeleted()) {
             throw new ApiException(ApiExceptionEnum.CHAT_THREAD_NOT_FOUND);
         }
 
@@ -286,23 +290,24 @@ public class ChatbotServiceImpl implements ChatbotService 
{
 
     @Override
     public SseEmitter talk(Long authId, Long threadId, String message) {
-        ChatThreadPO chatThreadPO = chatThreadDao.findByThreadId(threadId);
+        ChatThreadPO chatThreadPO = chatThreadDao.findById(threadId);
         Long userId = SessionUserHolder.getUserId();
-        if (!Objects.equals(userId, chatThreadPO.getUserId())) {
+        if (!Objects.equals(userId, chatThreadPO.getUserId()) || 
chatThreadPO.getIsDeleted()) {
             throw new ApiException(ApiExceptionEnum.CHAT_THREAD_NOT_FOUND);
         }
-        AuthPlatformPO authPlatformPO = authPlatformDao.findByAuthId(authId);
-        if (authPlatformPO == null) {
+        AuthPlatformPO authPlatformPO = authPlatformDao.findById(authId);
+        if (authPlatformPO == null || authPlatformPO.getIsDeleted()) {
             throw new ApiException(ApiExceptionEnum.PLATFORM_NOT_AUTHORIZED);
         }
-
+        AuthPlatformDTO authPlatformDTO = 
AuthPlatformConverter.INSTANCE.fromPO2DTO(authPlatformPO);
+        ChatThreadDTO chatThreadDTO = 
ChatThreadConverter.INSTANCE.fromPO2DTO(chatThreadPO);
         PlatformPO platformPO = 
platformDao.findById(authPlatformPO.getPlatformId());
         AIAssistant aiAssistant = buildAIAssistant(
                 platformPO.getName(),
                 chatThreadPO.getModel(),
-                authPlatformPO.getCredentials(),
+                authPlatformDTO.getAuthCredentials(),
                 chatThreadPO.getId(),
-                chatThreadPO.getThreadInfo());
+                chatThreadDTO.getThreadInfo());
         Flux<String> stringFlux = aiAssistant.streamAsk(message);
 
         SseEmitter emitter = new SseEmitter();
@@ -324,8 +329,8 @@ public class ChatbotServiceImpl implements ChatbotService {
     @Override
     public List<ChatMessageVO> history(Long authId, Long threadId) {
         List<ChatMessageVO> chatMessages = new ArrayList<>();
-        ChatThreadPO chatThreadPO = chatThreadDao.findByThreadId(threadId);
-        if (chatThreadPO == null) {
+        ChatThreadPO chatThreadPO = chatThreadDao.findById(threadId);
+        if (chatThreadPO == null || chatThreadPO.getIsDeleted()) {
             throw new ApiException(ApiExceptionEnum.CHAT_THREAD_NOT_FOUND);
         }
         Long userId = SessionUserHolder.getUserId();
diff --git a/bigtop-manager-server/src/main/resources/ddl/MySQL-DDL-CREATE.sql 
b/bigtop-manager-server/src/main/resources/ddl/MySQL-DDL-CREATE.sql
index 8a0bf67..1937ae4 100644
--- a/bigtop-manager-server/src/main/resources/ddl/MySQL-DDL-CREATE.sql
+++ b/bigtop-manager-server/src/main/resources/ddl/MySQL-DDL-CREATE.sql
@@ -314,7 +314,7 @@ CREATE TABLE `llm_platform`
 (
     `id`             BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
     `name`           VARCHAR(255)        NOT NULL,
-    `credential`     JSON                DEFAULT NULL,
+    `credential`     TEXT                DEFAULT NULL,
     `support_models` VARCHAR(255)        DEFAULT NULL,
     `create_time`    DATETIME            DEFAULT CURRENT_TIMESTAMP,
     `update_time`    DATETIME            DEFAULT CURRENT_TIMESTAMP ON UPDATE 
CURRENT_TIMESTAMP,
@@ -327,7 +327,7 @@ CREATE TABLE `llm_auth_platform`
 (
     `id`          BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
     `platform_id` BIGINT(20) UNSIGNED NOT NULL,
-    `credentials` JSON                NOT NULL,
+    `credentials` TEXT                NOT NULL,
     `is_deleted`  TINYINT(1)          DEFAULT 0 NULL,
     `create_time` DATETIME            DEFAULT CURRENT_TIMESTAMP,
     `update_time` DATETIME            DEFAULT CURRENT_TIMESTAMP ON UPDATE 
CURRENT_TIMESTAMP,
@@ -345,7 +345,7 @@ CREATE TABLE `llm_chat_thread`
     `user_id`     BIGINT(20) UNSIGNED NOT NULL,
     `model`       VARCHAR(255)        NOT NULL,
     `is_deleted`  TINYINT(1)          DEFAULT 0 NULL,
-    `thread_info` JSON                DEFAULT NULL,
+    `thread_info` TEXT                DEFAULT NULL,
     `create_time` DATETIME            DEFAULT CURRENT_TIMESTAMP,
     `update_time` DATETIME            DEFAULT CURRENT_TIMESTAMP ON UPDATE 
CURRENT_TIMESTAMP,
     `create_by`   BIGINT              DEFAULT NULL,
diff --git 
a/bigtop-manager-server/src/main/resources/ddl/PostgreSQL-DDL-CREATE.sql 
b/bigtop-manager-server/src/main/resources/ddl/PostgreSQL-DDL-CREATE.sql
index 61099d7..2493c85 100644
--- a/bigtop-manager-server/src/main/resources/ddl/PostgreSQL-DDL-CREATE.sql
+++ b/bigtop-manager-server/src/main/resources/ddl/PostgreSQL-DDL-CREATE.sql
@@ -324,7 +324,7 @@ CREATE TABLE llm_platform
 (
     id             BIGINT CHECK (id > 0) NOT NULL GENERATED ALWAYS AS IDENTITY,
     name           VARCHAR(255)          NOT NULL,
-    credential     JSON         DEFAULT NULL,
+    credential     TEXT         DEFAULT NULL,
     support_models VARCHAR(255) DEFAULT NULL,
     create_time    TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP,
     update_time    TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP /* ON UPDATE 
CURRENT_TIMESTAMP */,
@@ -337,7 +337,7 @@ CREATE TABLE llm_auth_platform
 (
     id          BIGINT CHECK (id > 0)          NOT NULL GENERATED ALWAYS AS 
IDENTITY,
     platform_id BIGINT CHECK (platform_id > 0) NOT NULL,
-    credentials JSON                           NOT NULL,
+    credentials TEXT                           NOT NULL,
     is_deleted  BOOLEAN      DEFAULT FALSE,
     create_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP,
     update_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP /* ON UPDATE 
CURRENT_TIMESTAMP */,
@@ -355,7 +355,7 @@ CREATE TABLE llm_chat_thread
     platform_id BIGINT CHECK (platform_id > 0) NOT NULL,
     user_id     BIGINT CHECK (user_id > 0)     NOT NULL,
     model       VARCHAR(255)                   NOT NULL,
-    thread_info JSON         DEFAULT NULL,
+    thread_info TEXT         DEFAULT NULL,
     is_deleted  BOOLEAN      DEFAULT FALSE,
     create_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP,
     update_time TIMESTAMP(0) DEFAULT CURRENT_TIMESTAMP /* ON UPDATE 
CURRENT_TIMESTAMP */,

Reply via email to