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