This is an automated email from the ASF dual-hosted git repository.
Aias00 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hertzbeat.git
The following commit(s) were added to refs/heads/master by this push:
new 79c48a4bfc fix(ai): remove SOP schedules when deleting conversations
(#4247)
79c48a4bfc is described below
commit 79c48a4bfcf539bd834a0e368873fb16944db9e9
Author: shown <[email protected]>
AuthorDate: Sun Jul 26 14:38:41 2026 +0800
fix(ai): remove SOP schedules when deleting conversations (#4247)
Signed-off-by: yuluo-yx <[email protected]>
Signed-off-by: shown <[email protected]>
Co-authored-by: Duansg <[email protected]>
Co-authored-by: Tomsun28 <[email protected]>
---
.../ai/service/impl/ConversationServiceImpl.java | 6 +++++
.../service/impl/ConversationServiceImplTest.java | 28 ++++++++++++++++++++++
2 files changed, 34 insertions(+)
diff --git
a/hertzbeat-ai/src/main/java/org/apache/hertzbeat/ai/service/impl/ConversationServiceImpl.java
b/hertzbeat-ai/src/main/java/org/apache/hertzbeat/ai/service/impl/ConversationServiceImpl.java
index 1adbe6f78c..c674617dea 100644
---
a/hertzbeat-ai/src/main/java/org/apache/hertzbeat/ai/service/impl/ConversationServiceImpl.java
+++
b/hertzbeat-ai/src/main/java/org/apache/hertzbeat/ai/service/impl/ConversationServiceImpl.java
@@ -23,6 +23,7 @@ import java.util.Optional;
import lombok.extern.slf4j.Slf4j;
import org.apache.hertzbeat.ai.dao.ChatConversationDao;
import org.apache.hertzbeat.ai.dao.ChatMessageDao;
+import org.apache.hertzbeat.ai.dao.SopScheduleDao;
import org.apache.hertzbeat.ai.pojo.dto.ChatRequestContext;
import org.apache.hertzbeat.ai.pojo.dto.ChatResponseChunk;
import org.apache.hertzbeat.ai.pojo.dto.SecurityData;
@@ -57,6 +58,9 @@ public class ConversationServiceImpl implements
ConversationService {
@Autowired
private ChatMessageDao messageDao;
+ @Autowired
+ private SopScheduleDao sopScheduleDao;
+
@Autowired
private ChatClientProviderService chatClientProviderService;
@@ -197,6 +201,8 @@ public class ConversationServiceImpl implements
ConversationService {
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteConversation(Long conversationId) {
+ // Delete associated schedules first to prevent tasks from writing
orphaned messages.
+ sopScheduleDao.deleteByConversationId(conversationId);
List<ChatMessage> messages =
messageDao.findByConversationIdOrderByGmtCreateAsc(conversationId);
if (!messages.isEmpty()) {
messageDao.deleteAll(messages);
diff --git
a/hertzbeat-ai/src/test/java/org/apache/hertzbeat/ai/service/impl/ConversationServiceImplTest.java
b/hertzbeat-ai/src/test/java/org/apache/hertzbeat/ai/service/impl/ConversationServiceImplTest.java
index ce5f5bf3ef..b192073e45 100644
---
a/hertzbeat-ai/src/test/java/org/apache/hertzbeat/ai/service/impl/ConversationServiceImplTest.java
+++
b/hertzbeat-ai/src/test/java/org/apache/hertzbeat/ai/service/impl/ConversationServiceImplTest.java
@@ -20,6 +20,7 @@ package org.apache.hertzbeat.ai.service.impl;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -30,6 +31,7 @@ import java.util.Optional;
import java.util.concurrent.atomic.AtomicLong;
import org.apache.hertzbeat.ai.dao.ChatConversationDao;
import org.apache.hertzbeat.ai.dao.ChatMessageDao;
+import org.apache.hertzbeat.ai.dao.SopScheduleDao;
import org.apache.hertzbeat.ai.pojo.dto.ChatRequestContext;
import org.apache.hertzbeat.ai.pojo.dto.ChatResponseChunk;
import org.apache.hertzbeat.ai.service.ChatClientProviderService;
@@ -40,6 +42,7 @@ import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.ArgumentCaptor;
import org.mockito.InjectMocks;
+import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.http.codec.ServerSentEvent;
@@ -59,6 +62,9 @@ class ConversationServiceImplTest {
@Mock
private ChatMessageDao messageDao;
+ @Mock
+ private SopScheduleDao sopScheduleDao;
+
@Mock
private ChatClientProviderService chatClientProviderService;
@@ -116,4 +122,26 @@ class ConversationServiceImplTest {
assertEquals(history,
contextCaptor.getValue().getConversationHistory());
assertEquals(subject, contextCaptor.getValue().getSubject());
}
+
+ /**
+ * Deleting a conversation must remove its schedules before they can push
more messages.
+ */
+ @Test
+ void
deleteConversationShouldRemoveSchedulesMessagesAndConversationInOrder() {
+ ChatMessage message = ChatMessage.builder()
+ .id(11L)
+ .conversationId(CONVERSATION_ID)
+ .role("user")
+ .content("message to delete")
+ .build();
+
when(messageDao.findByConversationIdOrderByGmtCreateAsc(CONVERSATION_ID))
+ .thenReturn(List.of(message));
+
+ conversationService.deleteConversation(CONVERSATION_ID);
+
+ InOrder deletionOrder = inOrder(sopScheduleDao, messageDao,
conversationDao);
+
deletionOrder.verify(sopScheduleDao).deleteByConversationId(CONVERSATION_ID);
+ deletionOrder.verify(messageDao).deleteAll(List.of(message));
+ deletionOrder.verify(conversationDao).deleteById(CONVERSATION_ID);
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]