mirror of https://github.com/buster-so/buster.git
Add duplicate message check in slack-agent-task
- Introduced a new function `checkForDuplicateMessages` in the database queries to verify if a message already exists in the same chat. - Integrated the duplicate check in the `slackAgentTask` to prevent processing of duplicate messages, enhancing task efficiency and logging warnings for duplicates detected.
This commit is contained in:
parent
0e46d64683
commit
8daceae2e3
|
@ -1,4 +1,11 @@
|
|||
import { chats, db, eq, messages, updateMessage } from '@buster/database';
|
||||
import {
|
||||
chats,
|
||||
checkForDuplicateMessages,
|
||||
db,
|
||||
eq,
|
||||
messages,
|
||||
updateMessage,
|
||||
} from '@buster/database';
|
||||
import {
|
||||
SlackMessagingService,
|
||||
addReaction,
|
||||
|
@ -244,6 +251,26 @@ export const slackAgentTask: ReturnType<
|
|||
prompt = `Please fulfill the request from this slack conversation:\n${formattedMessages}`;
|
||||
}
|
||||
|
||||
// Check for duplicate messages before creating
|
||||
const duplicateCheck = await checkForDuplicateMessages({
|
||||
chatId: payload.chatId,
|
||||
requestMessage: prompt,
|
||||
});
|
||||
|
||||
if (duplicateCheck.isDuplicate) {
|
||||
logger.warn('Duplicate message detected, stopping task', {
|
||||
chatId: payload.chatId,
|
||||
duplicateMessageIds: duplicateCheck.duplicateMessageIds,
|
||||
requestMessage: prompt,
|
||||
});
|
||||
|
||||
return {
|
||||
success: false,
|
||||
messageId: '',
|
||||
triggerRunId: '',
|
||||
};
|
||||
}
|
||||
|
||||
// Step 4: Create message
|
||||
const message = await createMessage({
|
||||
chatId: payload.chatId,
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import type { InferSelectModel } from 'drizzle-orm';
|
||||
import { and, desc, eq, isNull } from 'drizzle-orm';
|
||||
import { and, desc, eq, isNull, ne } from 'drizzle-orm';
|
||||
import { db } from '../../connection';
|
||||
import { messages } from '../../schema';
|
||||
|
||||
|
@ -233,3 +233,47 @@ export async function updateMessage(
|
|||
throw new Error(`Failed to update message ${messageId}`);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check for duplicate messages in the same chat
|
||||
* @param options - Options for duplicate checking
|
||||
* @returns Object indicating if duplicate exists and duplicate message IDs
|
||||
*/
|
||||
export async function checkForDuplicateMessages(options: {
|
||||
chatId: string;
|
||||
requestMessage: string;
|
||||
excludeMessageId?: string;
|
||||
}): Promise<{ isDuplicate: boolean; duplicateMessageIds: string[] }> {
|
||||
const { chatId, requestMessage, excludeMessageId } = options;
|
||||
|
||||
try {
|
||||
// Build query conditions
|
||||
const conditions = [
|
||||
eq(messages.chatId, chatId),
|
||||
eq(messages.requestMessage, requestMessage),
|
||||
isNull(messages.deletedAt),
|
||||
];
|
||||
|
||||
// Only add exclusion if messageId provided
|
||||
if (excludeMessageId) {
|
||||
conditions.push(ne(messages.id, excludeMessageId));
|
||||
}
|
||||
|
||||
// Query for messages with same chatId and requestMessage
|
||||
const duplicateMessages = await db
|
||||
.select({
|
||||
id: messages.id,
|
||||
})
|
||||
.from(messages)
|
||||
.where(and(...conditions))
|
||||
.orderBy(desc(messages.createdAt));
|
||||
|
||||
return {
|
||||
isDuplicate: duplicateMessages.length > 0,
|
||||
duplicateMessageIds: duplicateMessages.map((msg) => msg.id),
|
||||
};
|
||||
} catch (error) {
|
||||
console.error('Failed to check for duplicate messages:', error);
|
||||
throw new Error(`Failed to check for duplicate messages in chat ${chatId}`);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue