← 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')
}