feat: add pitch-deck service to core infrastructure
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>
This commit is contained in:
73
pitch-deck/app/api/financial-model/route.ts
Normal file
73
pitch-deck/app/api/financial-model/route.ts
Normal file
@@ -0,0 +1,73 @@
|
||||
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 })
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user