mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-20 12:11:17 -05:00
Fix thread ID matching for email replies
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user