fix: remove backend placeholders

This commit is contained in:
2026-03-12 21:10:00 +01:00
parent 0578b26241
commit b71d32da5e
5 changed files with 4 additions and 100 deletions

View File

@@ -36,7 +36,7 @@ cd frontend && npm install && npm run dev
# → http://localhost:3000
```
**Frontend + backend** (so the app can show “Backend API: N todos”):
**Frontend + backend** (for AI agent and health):
```bash
# Terminal 1 backend
@@ -45,7 +45,7 @@ cd backend && npm install && npm run dev
# Terminal 2 frontend
cd frontend && npm install && npm run dev
# → http://localhost:3000 (Vite proxies /api/todos to backend)
# → http://localhost:3000 (Vite proxies /api/* and /health to backend)
```
---
@@ -89,16 +89,9 @@ For self-hosting (e.g. Tailscale/HTTPS): set `CORS_ORIGIN` to your frontend URL;
| Method | Path | Description |
|--------|------|-------------|
| GET | `/api/todos` | List all todos. |
| GET | `/api/todos/:id` | Get one todo. |
| POST | `/api/todos` | Create (`{ "title": "...", "completed": false }`). |
| PUT | `/api/todos/:id` | Update. |
| DELETE | `/api/todos/:id` | Delete. |
| GET | `/health` | Health check (e.g. for Docker). |
| POST | `/api/agent` | Run AI agent; body `{ "prompt", "context?", "contextNodes?" }``{ "markdown" }`. |
Data is in-memory (resets on restart). Add a JSON file or DB later if needed.
---
## Agent node (local LLM or OpenAI)

View File

@@ -2,7 +2,7 @@
"name": "zui-backend",
"version": "1.0.0",
"private": true,
"description": "Minimal Express API for Zui (todos CRUD, no DB)",
"description": "Minimal Express API for Zui (agent, health; no DB)",
"main": "src/index.js",
"scripts": {
"start": "node src/index.js",

View File

@@ -1,5 +1,5 @@
/**
* Minimal Express API: /api/todos CRUD (in-memory).
* Minimal Express API: /api/agent, /health.
* No DB, no auth. CORS allowed for frontend. Production-ready env (PORT, CORS_ORIGIN).
*/
@@ -14,72 +14,6 @@ const app = express()
app.use(cors({ origin: CORS_ORIGIN }))
app.use(express.json())
// In-memory store (replace with JSON file or DB later)
let todos = [
{ id: '1', title: 'Sample todo', completed: false },
{ id: '2', title: 'Another item', completed: true },
]
let nextId = 3
/** GET /api/todos — list all */
app.get('/api/todos', (req, res) => {
try {
res.json(todos)
} catch (err) {
res.status(500).json({ error: err.message })
}
})
/** GET /api/todos/:id — get one */
app.get('/api/todos/:id', (req, res) => {
try {
const todo = todos.find((t) => t.id === req.params.id)
if (!todo) return res.status(404).json({ error: 'Not found' })
res.json(todo)
} catch (err) {
res.status(500).json({ error: err.message })
}
})
/** POST /api/todos — create */
app.post('/api/todos', (req, res) => {
try {
const { title, completed } = req.body ?? {}
const id = String(nextId++)
const todo = { id, title: title ?? '', completed: Boolean(completed) }
todos.push(todo)
res.status(201).json(todo)
} catch (err) {
res.status(500).json({ error: err.message })
}
})
/** PUT /api/todos/:id — update */
app.put('/api/todos/:id', (req, res) => {
try {
const idx = todos.findIndex((t) => t.id === req.params.id)
if (idx === -1) return res.status(404).json({ error: 'Not found' })
const { title, completed } = req.body ?? {}
if (title !== undefined) todos[idx].title = title
if (completed !== undefined) todos[idx].completed = Boolean(completed)
res.json(todos[idx])
} catch (err) {
res.status(500).json({ error: err.message })
}
})
/** DELETE /api/todos/:id — delete */
app.delete('/api/todos/:id', (req, res) => {
try {
const idx = todos.findIndex((t) => t.id === req.params.id)
if (idx === -1) return res.status(404).json({ error: 'Not found' })
const removed = todos.splice(idx, 1)[0]
res.json(removed)
} catch (err) {
res.status(500).json({ error: err.message })
}
})
/** Build OpenAI client and full prompt from request body. Returns { openai, modelId, fullPrompt } or { error }. */
function buildAgentRequest(body) {
const { prompt, context, contextNodes, connection: conn, reasoning } = body ?? {}

View File

@@ -194,16 +194,6 @@ export function CanvasPage({ projectId }: CanvasPageProps) {
graphRef.current.nodes = nodes
graphRef.current.edges = edges
const [apiTodosCount, setApiTodosCount] = React.useState<number | null>(null)
React.useEffect(() => {
fetch('/api/todos')
.then((r) => r.json())
.then((data: unknown) => {
if (Array.isArray(data)) setApiTodosCount(data.length)
})
.catch(() => setApiTodosCount(-1))
}, [])
const pendingChangesRef = useRef<NodeChange<Node>[]>([])
const rafRef = useRef<number | null>(null)
const onNodesChange = useCallback(
@@ -644,11 +634,6 @@ export function CanvasPage({ projectId }: CanvasPageProps) {
canCopy={selectedNodes.length === 1}
onFitView={() => flowActionsRef.current?.fitView?.()}
/>
{apiTodosCount !== null && (
<div className="shrink-0 px-3 py-1 text-xs text-muted-foreground border-b border-border/50">
Backend API: {apiTodosCount >= 0 ? `${apiTodosCount} todos` : 'unavailable'}
</div>
)}
<div className="flex-1 min-h-0 relative flex flex-col">
<div className="flex-1 min-h-0 flex flex-col">
<GraphContext.Provider value={graphContextValue}>

View File

@@ -8,14 +8,6 @@ export default defineConfig({
server: {
proxy: {
// Backend API (dev): proxy to avoid CORS
'/api/todos': {
target: 'http://localhost:8080',
changeOrigin: true,
},
'/api/todos/': {
target: 'http://localhost:8080',
changeOrigin: true,
},
'/health': {
target: 'http://localhost:8080',
changeOrigin: true,