Migrated pitch-deck from breakpilot-pwa to breakpilot-core. Container: bp-core-pitch-deck on port 3012. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
74 lines
2.3 KiB
TypeScript
74 lines
2.3 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server'
|
|
import pool from '@/lib/db'
|
|
|
|
export const dynamic = 'force-dynamic'
|
|
|
|
// GET: Load all scenarios with their assumptions
|
|
export async function GET() {
|
|
try {
|
|
const client = await pool.connect()
|
|
try {
|
|
const scenarios = await client.query(
|
|
'SELECT * FROM pitch_fm_scenarios ORDER BY is_default DESC, name'
|
|
)
|
|
|
|
const assumptions = await client.query(
|
|
'SELECT * FROM pitch_fm_assumptions ORDER BY sort_order'
|
|
)
|
|
|
|
const result = scenarios.rows.map(s => ({
|
|
...s,
|
|
assumptions: assumptions.rows
|
|
.filter(a => a.scenario_id === s.id)
|
|
.map(a => ({
|
|
...a,
|
|
value: typeof a.value === 'string' ? JSON.parse(a.value) : a.value,
|
|
})),
|
|
}))
|
|
|
|
return NextResponse.json(result)
|
|
} finally {
|
|
client.release()
|
|
}
|
|
} catch (error) {
|
|
console.error('Financial model load error:', error)
|
|
return NextResponse.json({ error: 'Failed to load scenarios' }, { status: 500 })
|
|
}
|
|
}
|
|
|
|
// POST: Create a new scenario
|
|
export async function POST(request: NextRequest) {
|
|
try {
|
|
const body = await request.json()
|
|
const { name, description, color, copyFrom } = body
|
|
|
|
if (!name) {
|
|
return NextResponse.json({ error: 'Name is required' }, { status: 400 })
|
|
}
|
|
|
|
const client = await pool.connect()
|
|
try {
|
|
const scenario = await client.query(
|
|
'INSERT INTO pitch_fm_scenarios (name, description, color) VALUES ($1, $2, $3) RETURNING *',
|
|
[name, description || '', color || '#6366f1']
|
|
)
|
|
|
|
// If copyFrom is set, copy assumptions from another scenario
|
|
if (copyFrom) {
|
|
await client.query(`
|
|
INSERT INTO pitch_fm_assumptions (scenario_id, key, label_de, label_en, value, value_type, unit, min_value, max_value, step_size, category, sort_order)
|
|
SELECT $1, key, label_de, label_en, value, value_type, unit, min_value, max_value, step_size, category, sort_order
|
|
FROM pitch_fm_assumptions WHERE scenario_id = $2
|
|
`, [scenario.rows[0].id, copyFrom])
|
|
}
|
|
|
|
return NextResponse.json(scenario.rows[0])
|
|
} finally {
|
|
client.release()
|
|
}
|
|
} catch (error) {
|
|
console.error('Create scenario error:', error)
|
|
return NextResponse.json({ error: 'Failed to create scenario' }, { status: 500 })
|
|
}
|
|
}
|