fixes
This commit is contained in:
@@ -13,6 +13,28 @@ const CONCURRENT_S3_OPERATIONS = 10;
|
||||
const BATCH_INSERT_SIZE = 100;
|
||||
const CONCURRENT_EMAIL_PARSING = 5;
|
||||
|
||||
// Globale Helper function für sichere Date-Konvertierung
|
||||
function parseDate(dateInput: string | Date | undefined | null): Date | null {
|
||||
if (!dateInput) return null;
|
||||
|
||||
try {
|
||||
const date = dateInput instanceof Date ? dateInput : new Date(dateInput);
|
||||
// Prüfe ob das Datum gültig ist
|
||||
if (isNaN(date.getTime())) {
|
||||
return null;
|
||||
}
|
||||
// Prüfe ob das Datum in einem vernünftigen Bereich liegt (1970-2100)
|
||||
const year = date.getFullYear();
|
||||
if (year < 1970 || year > 2100) {
|
||||
return null;
|
||||
}
|
||||
return date;
|
||||
} catch (error) {
|
||||
console.error('Error parsing date:', dateInput, error);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
export async function syncAllDomains() {
|
||||
console.log('Starting optimized syncAllDomains...');
|
||||
const startTime = Date.now();
|
||||
@@ -28,8 +50,17 @@ export async function syncAllDomains() {
|
||||
domainBuckets.map(bucketObj =>
|
||||
bucketLimit(async () => {
|
||||
const bucket = bucketObj.Name!;
|
||||
const domainName = bucket.replace('-emails', '').replace(/-/g, '.');
|
||||
console.log(`Processing bucket: ${bucket}`);
|
||||
|
||||
// Korrekte Domain-Konvertierung: Nur den letzten '-' vor '-emails' zu '.' machen
|
||||
// Beispiel: bayarea-cc-com-emails -> bayarea-cc-com -> bayarea-cc.com
|
||||
let domainName = bucket.replace('-emails', ''); // Entferne '-emails'
|
||||
const lastDashIndex = domainName.lastIndexOf('-'); // Finde letzten Bindestrich
|
||||
if (lastDashIndex !== -1) {
|
||||
// Ersetze nur den letzten Bindestrich durch einen Punkt
|
||||
domainName = domainName.substring(0, lastDashIndex) + '.' + domainName.substring(lastDashIndex + 1);
|
||||
}
|
||||
|
||||
console.log(`Processing bucket: ${bucket} -> Domain: ${domainName}`);
|
||||
|
||||
const [domain] = await db
|
||||
.insert(domains)
|
||||
@@ -114,7 +145,7 @@ async function syncEmailsForDomainOptimized(domainId: number, bucket: string, s3
|
||||
const metadata = head.Metadata || {};
|
||||
|
||||
const processed = metadata[process.env.PROCESSED_META_KEY!] === process.env.PROCESSED_META_VALUE!;
|
||||
const processedAt = metadata['processed_at'] ? new Date(metadata['processed_at']) : null;
|
||||
const processedAt = parseDate(metadata['processed_at']);
|
||||
const processedBy = metadata['processed_by'] || null;
|
||||
const queuedTo = metadata['queued_to'] || null;
|
||||
const status = metadata['status'] || null;
|
||||
@@ -167,6 +198,25 @@ async function syncEmailsForDomainOptimized(domainId: number, bucket: string, s3
|
||||
const cc = extractAddresses(parsed.cc);
|
||||
const bcc = extractAddresses(parsed.bcc);
|
||||
|
||||
// Versuche verschiedene Datum-Quellen in Reihenfolge der Präferenz
|
||||
let emailDate: Date | null = null;
|
||||
|
||||
// 1. Versuche parsed.date
|
||||
if (parsed.date) {
|
||||
emailDate = parseDate(parsed.date);
|
||||
}
|
||||
|
||||
// 2. Falls parsed.date ungültig, versuche S3 LastModified
|
||||
if (!emailDate && headResponse.LastModified) {
|
||||
emailDate = parseDate(headResponse.LastModified);
|
||||
}
|
||||
|
||||
// 3. Falls beides ungültig, verwende aktuelles Datum als Fallback
|
||||
if (!emailDate) {
|
||||
console.warn(`No valid date found for ${key}, using current date`);
|
||||
emailDate = new Date();
|
||||
}
|
||||
|
||||
return {
|
||||
domainId,
|
||||
s3Key: key,
|
||||
@@ -178,9 +228,8 @@ async function syncEmailsForDomainOptimized(domainId: number, bucket: string, s3
|
||||
html: parsed.html || parsed.textAsHtml,
|
||||
raw: raw.toString('utf-8'),
|
||||
processed: metadata[process.env.PROCESSED_META_KEY!] === process.env.PROCESSED_META_VALUE!,
|
||||
date: parsed.date || headResponse.LastModified,
|
||||
// Neue Metadaten
|
||||
processedAt: metadata['processed_at'] ? new Date(metadata['processed_at']) : null,
|
||||
date: emailDate,
|
||||
processedAt: parseDate(metadata['processed_at']),
|
||||
processedBy: metadata['processed_by'] || null,
|
||||
queuedTo: metadata['queued_to'] || null,
|
||||
status: metadata['status'] || null,
|
||||
|
||||
Reference in New Issue
Block a user