From 7fb6575f8d33018554ec3df8abbe7e47baf83d75 Mon Sep 17 00:00:00 2001 From: rustmailer Date: Tue, 30 Dec 2025 22:21:53 +0800 Subject: [PATCH] feat: use email 'Date' header for statistics and search filtering #87 --- src/modules/indexer/manager.rs | 16 ++++++++-------- web/src/features/mailbox/components/mail.tsx | 6 +++--- .../mailbox/components/thread-dialog.tsx | 4 ++-- web/src/features/search/thread-dialog.tsx | 4 ++-- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/modules/indexer/manager.rs b/src/modules/indexer/manager.rs index 3c25c2c..6f7e8a5 100644 --- a/src/modules/indexer/manager.rs +++ b/src/modules/indexer/manager.rs @@ -34,8 +34,8 @@ use crate::{ indexer::{ envelope::Envelope, fields::{ - F_ACCOUNT_ID, F_FROM, F_HAS_ATTACHMENT, F_INTERNAL_DATE, F_MAILBOX_ID, F_SIZE, - F_TAGS, F_THREAD_ID, F_UID, + F_ACCOUNT_ID, F_DATE, F_FROM, F_HAS_ATTACHMENT, F_MAILBOX_ID, F_SIZE, F_TAGS, + F_THREAD_ID, F_UID, }, schema::SchemaTools, }, @@ -335,13 +335,13 @@ impl EnvelopeIndexManager { } let start_bound = if let Some(from) = filter.since { - Bound::Included(Term::from_field_i64(f.f_internal_date, from)) + Bound::Included(Term::from_field_i64(f.f_date, from)) } else { Bound::Unbounded }; let end_bound = if let Some(to) = filter.before { - Bound::Included(Term::from_field_i64(f.f_internal_date, to)) + Bound::Included(Term::from_field_i64(f.f_date, to)) } else { Bound::Unbounded }; @@ -658,7 +658,7 @@ impl EnvelopeIndexManager { &query, &TopDocs::with_limit(page_size as usize) .and_offset(offset as usize) - .order_by_fast_field(F_INTERNAL_DATE, order), + .order_by_fast_field(F_DATE, order), ) .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; let mut result = Vec::new(); @@ -721,7 +721,7 @@ impl EnvelopeIndexManager { query.as_ref(), &TopDocs::with_limit(page_size as usize) .and_offset(offset as usize) - .order_by_fast_field(F_INTERNAL_DATE, order), + .order_by_fast_field(F_DATE, order), ) .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; let mut result = Vec::new(); @@ -786,7 +786,7 @@ impl EnvelopeIndexManager { query.as_ref(), &TopDocs::with_limit(page_size as usize) .and_offset(offset as usize) - .order_by_fast_field(F_INTERNAL_DATE, order), + .order_by_fast_field(F_DATE, order), ) .map_err(|e| raise_error!(format!("{:#?}", e), ErrorCode::InternalError))?; let mut result = Vec::new(); @@ -1006,7 +1006,7 @@ impl EnvelopeIndexManager { }, "recent_30d_histogram": { "histogram": { - "field": F_INTERNAL_DATE, + "field": F_DATE, "interval": 86400000, "hard_bounds": { "min": week_ago_ms, diff --git a/web/src/features/mailbox/components/mail.tsx b/web/src/features/mailbox/components/mail.tsx index 7b0cc2d..90266b3 100644 --- a/web/src/features/mailbox/components/mail.tsx +++ b/web/src/features/mailbox/components/mail.tsx @@ -104,7 +104,7 @@ function CustomLabel({ alignItems: 'center', }} > - + {children} @@ -354,8 +354,8 @@ export function Mail({ { - const dateA = a.internal_date; - const dateB = b.internal_date; + const dateA = a.date; + const dateB = b.date; return dateB - dateA; })} /> diff --git a/web/src/features/mailbox/components/thread-dialog.tsx b/web/src/features/mailbox/components/thread-dialog.tsx index a29caa4..ecdde5f 100644 --- a/web/src/features/mailbox/components/thread-dialog.tsx +++ b/web/src/features/mailbox/components/thread-dialog.tsx @@ -116,11 +116,11 @@ export function MailThreadDialog({ open, onOpenChange }: MailThreadDialogProps) )} {allMessages - .sort((a, b) => a.internal_date - b.internal_date) + .sort((a, b) => a.date - b.date) .map((msg) => { const isExpanded = expandedIds.has(msg.id); const preview = msg.text?.slice(0, 120) + (msg.text?.length > 120 ? '...' : ''); - const date = new Date(msg.internal_date); + const date = new Date(msg.date); const formattedDate = isNaN(date.getTime()) ? t('mailbox.thread.invalidDate') : format(date, 'yyyy-MM-dd HH:mm:ss'); diff --git a/web/src/features/search/thread-dialog.tsx b/web/src/features/search/thread-dialog.tsx index b31cae8..8ca72f3 100644 --- a/web/src/features/search/thread-dialog.tsx +++ b/web/src/features/search/thread-dialog.tsx @@ -113,13 +113,13 @@ export function MailThreadDialog({ open, onOpenChange }: MailThreadDialogProps) )} {allMessages - .sort((a, b) => a.internal_date - b.internal_date) + .sort((a, b) => a.date - b.date) .map((msg) => { const isExpanded = expandedIds.has(msg.id); const preview = msg.text?.slice(0, 120) + (msg.text?.length > 120 ? '...' : ''); - const date = new Date(msg.internal_date); + const date = new Date(msg.date); const formattedDate = isNaN(date.getTime()) ? t('search.thread.invalidDate') : format(date, 'yyyy-MM-dd HH:mm:ss');