Fix thread ID matching for email replies

This commit is contained in:
gpt-engineer-app[bot]
2025-10-28 20:29:14 +00:00
parent f57323aed4
commit 375db2e7d8
2 changed files with 65 additions and 13 deletions

View File

@@ -44,8 +44,8 @@ const handler = async (req: Request): Promise<Response> => {
});
// Extract thread ID from headers or inReplyTo
const threadId = headers['X-Thread-ID'] ||
(inReplyTo ? inReplyTo.replace(/<|>/g, '').split('@')[0] : null);
let threadId = headers['X-Thread-ID'] ||
(inReplyTo ? inReplyTo.replace(/<|>/g, '').split('@')[0] : null);
if (!threadId) {
edgeLogger.warn('Email missing thread ID', {
@@ -58,17 +58,68 @@ const handler = async (req: Request): Promise<Response> => {
});
}
// Find submission by thread_id
const { data: submission, error: submissionError } = await supabase
// Extract ticket number from thread_id (handles multiple formats)
// Formats: "TW-100000.uuid", "ticket-TW-100000", "TW-100000"
const ticketMatch = threadId.match(/(?:ticket-)?(TW-\d+)/i);
const ticketNumber = ticketMatch ? ticketMatch[1] : null;
edgeLogger.info('Thread ID extracted', {
requestId: tracking.requestId,
rawThreadId: threadId,
ticketNumber
});
// Find submission by thread_id or ticket_number
let submission = null;
let submissionError = null;
// Strategy 1: Try exact thread_id match
const { data: submissionByThreadId, error: error1 } = await supabase
.from('contact_submissions')
.select('id, email, status')
.select('id, email, status, ticket_number')
.eq('thread_id', threadId)
.single();
.maybeSingle();
if (submissionByThreadId) {
submission = submissionByThreadId;
} else if (ticketNumber) {
// Strategy 2: Try ticket_number match
const { data: submissionByTicket, error: error2 } = await supabase
.from('contact_submissions')
.select('id, email, status, ticket_number, thread_id')
.eq('ticket_number', ticketNumber)
.maybeSingle();
if (submissionByTicket) {
submission = submissionByTicket;
// Update thread_id if it's null or in old format
if (!submissionByTicket.thread_id || submissionByTicket.thread_id !== threadId) {
await supabase
.from('contact_submissions')
.update({ thread_id: threadId })
.eq('id', submissionByTicket.id);
edgeLogger.info('Updated submission thread_id', {
requestId: tracking.requestId,
submissionId: submissionByTicket.id,
oldThreadId: submissionByTicket.thread_id,
newThreadId: threadId
});
}
} else {
submissionError = error2;
}
} else {
submissionError = error1;
}
if (submissionError || !submission) {
edgeLogger.warn('Submission not found for thread ID', {
requestId: tracking.requestId,
threadId
threadId,
ticketNumber,
error: submissionError
});
return new Response(JSON.stringify({ success: false, reason: 'submission_not_found' }), {
status: 200,