Implements save/restore system that captures HTML base, injected CSS, executed scripts, and floating Vue windows with their full definitions. Adds 4 MCP tools, backend CRUD API, Pinia store, and script logger.
50 lines
1.3 KiB
TypeScript
50 lines
1.3 KiB
TypeScript
import { db } from '../db'
|
|
import { jsonResponse, errorResponse } from '../utils/cors'
|
|
|
|
export async function handleSnapshots(req: Request) {
|
|
if (req.method === 'GET') {
|
|
const rows = db.query(
|
|
'SELECT id, name, thumbnail, created_at FROM canvas_snapshots ORDER BY created_at DESC'
|
|
).all()
|
|
return jsonResponse(rows)
|
|
}
|
|
|
|
if (req.method === 'POST') {
|
|
const body = await req.json()
|
|
const id = body.id || `snap-${Date.now()}`
|
|
const stmt = db.prepare(
|
|
'INSERT OR REPLACE INTO canvas_snapshots (id, name, data, thumbnail, created_at) VALUES (?, ?, ?, ?, ?)'
|
|
)
|
|
stmt.run(
|
|
id,
|
|
body.name,
|
|
typeof body.data === 'string' ? body.data : JSON.stringify(body.data),
|
|
body.thumbnail || null,
|
|
body.created_at || Date.now()
|
|
)
|
|
return jsonResponse({ success: true, id })
|
|
}
|
|
|
|
return null
|
|
}
|
|
|
|
export async function handleSnapshotById(req: Request, id: string) {
|
|
if (req.method === 'GET') {
|
|
const row = db.query('SELECT * FROM canvas_snapshots WHERE id = ?').get(id) as any
|
|
if (!row) {
|
|
return errorResponse('Snapshot not found', 404)
|
|
}
|
|
return jsonResponse({
|
|
...row,
|
|
data: JSON.parse(row.data)
|
|
})
|
|
}
|
|
|
|
if (req.method === 'DELETE') {
|
|
db.run('DELETE FROM canvas_snapshots WHERE id = ?', [id])
|
|
return jsonResponse({ success: true })
|
|
}
|
|
|
|
return null
|
|
}
|