← back to Dear Bubbe Nextjs

app/api/stats/route.ts

138 lines

import { NextRequest, NextResponse } from 'next/server'
import fs from 'fs'
import path from 'path'

// Stats tracking for Dear Bubbe features
interface Stats {
  totalConversations: number
  blogPostsCreated: number
  socialPostsGenerated: number
  emailCampaignsDrafted: number
  lastActivity: string
  uptime: number
  tasksCompleted: number
  errorsToday: number
  qnaReadiness: number
  responseTime: number
}

const STATS_FILE = path.join(process.cwd(), 'data', 'bubbe-stats.json')

// Ensure data directory exists
function ensureDataDir() {
  const dataDir = path.dirname(STATS_FILE)
  if (!fs.existsSync(dataDir)) {
    fs.mkdirSync(dataDir, { recursive: true })
  }
}

// Load stats from file
function loadStats(): Stats {
  ensureDataDir()
  
  const defaultStats: Stats = {
    totalConversations: 0,
    blogPostsCreated: 0,
    socialPostsGenerated: 0,
    emailCampaignsDrafted: 0,
    lastActivity: new Date().toISOString(),
    uptime: process.uptime(),
    tasksCompleted: 0,
    errorsToday: 0,
    qnaReadiness: 100,
    responseTime: 0
  }

  try {
    if (fs.existsSync(STATS_FILE)) {
      const data = JSON.parse(fs.readFileSync(STATS_FILE, 'utf-8'))
      return { ...defaultStats, ...data }
    }
  } catch (error) {
    console.error('[STATS] Error loading stats:', error)
  }
  
  return defaultStats
}

// Save stats to file
function saveStats(stats: Stats) {
  ensureDataDir()
  try {
    fs.writeFileSync(STATS_FILE, JSON.stringify(stats, null, 2))
  } catch (error) {
    console.error('[STATS] Error saving stats:', error)
  }
}

// Update specific stat
export function updateStat(key: keyof Stats, increment: number = 1) {
  const stats = loadStats()
  if (typeof stats[key] === 'number') {
    (stats[key] as number) += increment
  }
  stats.lastActivity = new Date().toISOString()
  stats.uptime = process.uptime()
  saveStats(stats)
}

export async function GET(request: NextRequest) {
  try {
    const stats = loadStats()
    
    // Update uptime and response time
    stats.uptime = process.uptime()
    stats.responseTime = Date.now() % 100 // Simulate response time
    stats.lastActivity = new Date().toISOString()
    
    return NextResponse.json(stats)
  } catch (error) {
    console.error('[STATS] Error in GET:', error)
    return NextResponse.json({ error: 'Failed to load stats' }, { status: 500 })
  }
}

export async function POST(request: NextRequest) {
  try {
    const body = await request.json()
    const { action, increment = 1 } = body

    if (!action) {
      return NextResponse.json({ error: 'Action is required' }, { status: 400 })
    }

    const stats = loadStats()

    switch (action) {
      case 'conversation':
        stats.totalConversations += increment
        break
      case 'blog':
        stats.blogPostsCreated += increment
        break
      case 'social':
        stats.socialPostsGenerated += increment
        break
      case 'email':
        stats.emailCampaignsDrafted += increment
        break
      case 'task':
        stats.tasksCompleted += increment
        break
      case 'error':
        stats.errorsToday += increment
        break
      default:
        return NextResponse.json({ error: 'Invalid action' }, { status: 400 })
    }

    stats.lastActivity = new Date().toISOString()
    stats.uptime = process.uptime()
    saveStats(stats)

    return NextResponse.json({ success: true, stats })
  } catch (error) {
    console.error('[STATS] Error in POST:', error)
    return NextResponse.json({ error: 'Failed to update stats' }, { status: 500 })
  }
}