From d7433b8bcc8379beb1bbe2b57ca67dea0534a6ed Mon Sep 17 00:00:00 2001 From: MayaTheShy Date: Fri, 20 Feb 2026 01:29:03 -0500 Subject: [PATCH] feat: Enhance path and task management APIs; add detailed responses and optional filters --- server/server.js | 116 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 106 insertions(+), 10 deletions(-) diff --git a/server/server.js b/server/server.js index 75bfabb..0ee4631 100644 --- a/server/server.js +++ b/server/server.js @@ -421,19 +421,66 @@ app.post('/api/turtle/:id/command', (req, res) => { app.post('/api/paths', (req, res) => { try { const { turtleId, pathName, pathData } = req.body; - db.savePath(turtleId, pathName, pathData); - res.json({ success: true, message: 'Path saved' }); + const pathId = db.savePath(turtleId, pathName, pathData || []); + res.json({ success: true, pathId, message: 'Path saved' }); } catch (error) { res.status(500).json({ error: error.message }); } }); -// Get all paths for a turtle -app.get('/api/paths/:turtleId', (req, res) => { +// Get all paths (optionally filtered by turtleId) +app.get('/api/paths', (req, res) => { + try { + const paths = db.getPaths(); + res.json(paths.map(p => ({ + pathId: p.id, + turtleId: p.turtle_id, + name: p.path_name, + pathData: p.path_data, + waypointCount: Array.isArray(p.path_data) ? p.path_data.length : 0, + createdAt: p.created_at, + updatedAt: p.updated_at + }))); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +// Get paths for a specific turtle +app.get('/api/paths/turtle/:turtleId', (req, res) => { try { const turtleId = parseInt(req.params.turtleId); const paths = db.getPaths(turtleId); - res.json({ paths }); + res.json(paths.map(p => ({ + pathId: p.id, + turtleId: p.turtle_id, + name: p.path_name, + pathData: p.path_data, + waypointCount: Array.isArray(p.path_data) ? p.path_data.length : 0, + createdAt: p.created_at, + updatedAt: p.updated_at + }))); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +// Get a specific path with full details +app.get('/api/paths/:pathId', (req, res) => { + try { + const pathId = parseInt(req.params.pathId); + const path = db.getPath(pathId); + if (!path) { + return res.status(404).json({ error: 'Path not found' }); + } + res.json({ + pathId: path.id, + turtleId: path.turtle_id, + name: path.path_name, + waypoints: path.path_data, + createdAt: path.created_at, + updatedAt: path.updated_at + }); } catch (error) { res.status(500).json({ error: error.message }); } @@ -455,8 +502,9 @@ app.delete('/api/paths/:pathId', (req, res) => { // Create a new task app.post('/api/tasks', (req, res) => { try { - const { taskType, taskData, priority } = req.body; - const taskId = db.createTask(taskType, taskData, priority || 0); + const { taskType, priority, assignedTurtleId, parameters } = req.body; + const taskData = parameters || {}; + const taskId = db.createTask(taskType, taskData, priority || 0, assignedTurtleId || null); broadcastToClients({ type: 'task_created', @@ -471,11 +519,23 @@ app.post('/api/tasks', (req, res) => { } }); -// Get all tasks +// Get all tasks (with optional status filter) app.get('/api/tasks', (req, res) => { try { - const tasks = db.getAllTasks(); - res.json({ tasks }); + const status = req.query.status || null; + const rawTasks = db.getAllTasks(status); + const tasks = rawTasks.map(t => ({ + taskId: t.id, + taskType: t.task_type, + priority: t.priority, + status: t.status, + assignedTurtleId: t.assigned_turtle_id, + parameters: t.task_data, + result: t.task_data?.result || null, + createdAt: t.created_at, + updatedAt: t.updated_at + })); + res.json(tasks); } catch (error) { res.status(500).json({ error: error.message }); } @@ -491,6 +551,42 @@ app.get('/api/tasks/next', (req, res) => { } }); +// Update task status +app.put('/api/tasks/:taskId', (req, res) => { + try { + const taskId = parseInt(req.params.taskId); + const { status, result } = req.body; + db.updateTaskStatus(taskId, status, result); + + broadcastToClients({ + type: 'task_updated', + taskId, + status + }); + + res.json({ success: true }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +// Delete a task +app.delete('/api/tasks/:taskId', (req, res) => { + try { + const taskId = parseInt(req.params.taskId); + db.deleteTask(taskId); + + broadcastToClients({ + type: 'task_deleted', + taskId + }); + + res.json({ success: true }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + // Assign task to turtle app.post('/api/tasks/:taskId/assign', (req, res) => { try {