diff --git a/server/server.js b/server/server.js index 0ee4631..9bf1381 100644 --- a/server/server.js +++ b/server/server.js @@ -625,16 +625,45 @@ app.post('/api/tasks/:taskId/complete', (req, res) => { // ========== MINING AREA ENDPOINTS ========== -// Save a mining area claim +// Helper to format mining area for API response +function formatMiningArea(area) { + return { + areaID: area.id, + turtleID: area.turtle_id, + startX: area.min_x, + startY: area.min_y, + startZ: area.min_z, + endX: area.max_x, + endY: area.max_y, + endZ: area.max_z, + status: area.status, + createdAt: area.created_at, + updatedAt: area.updated_at + }; +} + +// Save a mining area app.post('/api/mining-areas', (req, res) => { try { - const { turtleId, bounds } = req.body; - db.saveMiningArea(turtleId, bounds); + const { turtleId, turtleID, bounds, startX, startY, startZ, endX, endY, endZ, areaName, status } = req.body; + const tid = turtleId || turtleID; + + // Support both {turtleId, bounds} and flat {startX,startY,...} formats + const areaBounds = bounds || { + minX: Math.min(Number(startX), Number(endX)), + minY: Math.min(Number(startY), Number(endY)), + minZ: Math.min(Number(startZ), Number(endZ)), + maxX: Math.max(Number(startX), Number(endX)), + maxY: Math.max(Number(startY), Number(endY)), + maxZ: Math.max(Number(startZ), Number(endZ)) + }; + + db.saveMiningArea(tid, areaBounds, areaName || null, status || 'planned'); const areas = db.getMiningAreas(); broadcastToClients({ type: 'mining_areas_updated', - areas + areas: areas.map(formatMiningArea) }); res.json({ success: true }); @@ -643,17 +672,54 @@ app.post('/api/mining-areas', (req, res) => { } }); -// Get all active mining areas +// Get all mining areas app.get('/api/mining-areas', (req, res) => { try { const areas = db.getMiningAreas(); - res.json({ areas }); + res.json(areas.map(formatMiningArea)); } catch (error) { res.status(500).json({ error: error.message }); } }); -// Close a mining area +// Update mining area status +app.put('/api/mining-areas/:areaId', (req, res) => { + try { + const areaId = parseInt(req.params.areaId); + const { status } = req.body; + db.updateMiningAreaStatus(areaId, status); + + const areas = db.getMiningAreas(); + broadcastToClients({ + type: 'mining_areas_updated', + areas: areas.map(formatMiningArea) + }); + + res.json({ success: true }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +// Delete a mining area +app.delete('/api/mining-areas/:areaId', (req, res) => { + try { + const areaId = parseInt(req.params.areaId); + db.deleteMiningArea(areaId); + + const areas = db.getMiningAreas(); + broadcastToClients({ + type: 'mining_areas_updated', + areas: areas.map(formatMiningArea) + }); + + res.json({ success: true }); + } catch (error) { + res.status(500).json({ error: error.message }); + } +}); + +// Close a mining area (legacy endpoint) app.post('/api/mining-areas/:areaId/close', (req, res) => { try { const areaId = parseInt(req.params.areaId); @@ -662,7 +728,7 @@ app.post('/api/mining-areas/:areaId/close', (req, res) => { const areas = db.getMiningAreas(); broadcastToClients({ type: 'mining_areas_updated', - areas + areas: areas.map(formatMiningArea) }); res.json({ success: true });