← back to Dear Bubbe Nextjs
archived/tests/view-emails.js
154 lines
#!/usr/bin/env node
/**
* Email Viewer Utility
* View and manage saved email records
*/
const fs = require('fs')
const path = require('path')
const emailsDir = path.join(__dirname, 'data', 'emails')
function listEmails() {
console.log('\n📧 DEAR BUBBE EMAIL VIEWER')
console.log('=' .repeat(50))
if (!fs.existsSync(emailsDir)) {
console.log('❌ No emails directory found')
return
}
const files = fs.readdirSync(emailsDir).filter(f => f.endsWith('.json'))
if (files.length === 0) {
console.log('📭 No emails found')
return
}
console.log(`\n📬 Found ${files.length} email(s):\n`)
files.forEach((file, index) => {
try {
const content = fs.readFileSync(path.join(emailsDir, file), 'utf-8')
const email = JSON.parse(content)
console.log(`${index + 1}. ${email.type.toUpperCase()} EMAIL`)
console.log(` 📨 To: ${email.to}`)
console.log(` 📅 Sent: ${new Date(email.sentAt).toLocaleString()}`)
console.log(` 🔑 ID: ${email.id}`)
console.log(` 📄 Subject: ${email.subject}`)
console.log(` 📊 HTML Size: ${(email.html.length / 1024).toFixed(2)} KB`)
console.log(` 📁 File: ${file}`)
console.log('-'.repeat(50))
} catch (error) {
console.error(`❌ Error reading ${file}:`, error.message)
}
})
// Show latest email details if requested
const args = process.argv.slice(2)
if (args.includes('--show-latest') || args.includes('-s')) {
showLatestEmail(files)
}
if (args.includes('--help') || args.includes('-h')) {
showHelp()
}
}
function showLatestEmail(files) {
if (files.length === 0) return
// Sort files by timestamp in filename (newest first)
const sortedFiles = files.sort((a, b) => b.localeCompare(a))
const latestFile = sortedFiles[0]
console.log('\n📧 LATEST EMAIL CONTENT')
console.log('='.repeat(50))
try {
const content = fs.readFileSync(path.join(emailsDir, latestFile), 'utf-8')
const email = JSON.parse(content)
console.log('\n📋 PLAIN TEXT VERSION:\n')
console.log(email.text)
// Save HTML to temp file for viewing
const tempHtmlFile = path.join(emailsDir, 'latest-email.html')
fs.writeFileSync(tempHtmlFile, email.html)
console.log(`\n💾 HTML version saved to: ${tempHtmlFile}`)
console.log(' Open in browser to view formatted email')
} catch (error) {
console.error('❌ Error showing latest email:', error.message)
}
}
function showHelp() {
console.log('\n📖 USAGE:')
console.log(' node view-emails.js - List all emails')
console.log(' node view-emails.js -s - Show latest email content')
console.log(' node view-emails.js --help - Show this help')
}
function showStats() {
console.log('\n📊 EMAIL STATISTICS')
console.log('='.repeat(50))
const files = fs.readdirSync(emailsDir).filter(f => f.endsWith('.json'))
let totalSize = 0
let emailsByType = {}
let emailsByRecipient = {}
files.forEach(file => {
try {
const filePath = path.join(emailsDir, file)
const stats = fs.statSync(filePath)
totalSize += stats.size
const content = fs.readFileSync(filePath, 'utf-8')
const email = JSON.parse(content)
// Count by type
emailsByType[email.type] = (emailsByType[email.type] || 0) + 1
// Count by recipient
emailsByRecipient[email.to] = (emailsByRecipient[email.to] || 0) + 1
} catch (error) {
// Skip invalid files
}
})
console.log(`\n📈 Total emails: ${files.length}`)
console.log(`💾 Total storage: ${(totalSize / 1024).toFixed(2)} KB`)
console.log('\n📧 Emails by type:')
Object.entries(emailsByType).forEach(([type, count]) => {
console.log(` ${type}: ${count}`)
})
console.log('\n👤 Top recipients:')
Object.entries(emailsByRecipient)
.sort((a, b) => b[1] - a[1])
.slice(0, 5)
.forEach(([recipient, count]) => {
console.log(` ${recipient}: ${count} email(s)`)
})
}
// Main execution
const args = process.argv.slice(2)
if (args.includes('--stats')) {
showStats()
} else {
listEmails()
}
if (args.length === 0) {
console.log('\n💡 Tip: Use --help to see available options')
}