diff --git a/server/database.js b/server/database.js index 14db339..532bd0e 100644 --- a/server/database.js +++ b/server/database.js @@ -239,15 +239,33 @@ export function savePath(turtleId, pathName, pathData) { VALUES (?, ?, ?, ?, ?) `); const now = Date.now(); - stmt.run(turtleId, pathName, JSON.stringify(pathData), now, now); + const result = stmt.run(turtleId, pathName, JSON.stringify(pathData), now, now); + return result.lastInsertRowid; } -export function getPaths(turtleId) { - const stmt = db.prepare('SELECT * FROM turtle_paths WHERE turtle_id = ? ORDER BY created_at DESC'); - return stmt.all(turtleId).map(row => ({ - ...row, - path_data: JSON.parse(row.path_data) - })); +export function getPaths(turtleId = null) { + if (turtleId) { + const stmt = db.prepare('SELECT * FROM turtle_paths WHERE turtle_id = ? ORDER BY created_at DESC'); + return stmt.all(turtleId).map(row => ({ + ...row, + path_data: JSON.parse(row.path_data) + })); + } else { + const stmt = db.prepare('SELECT * FROM turtle_paths ORDER BY created_at DESC'); + return stmt.all().map(row => ({ + ...row, + path_data: JSON.parse(row.path_data) + })); + } +} + +export function getPath(pathId) { + const stmt = db.prepare('SELECT * FROM turtle_paths WHERE id = ?'); + const row = stmt.get(pathId); + if (row) { + return { ...row, path_data: JSON.parse(row.path_data) }; + } + return null; } export function deletePath(pathId) { @@ -256,13 +274,13 @@ export function deletePath(pathId) { } // Task Queue -export function createTask(taskType, taskData, priority = 0) { +export function createTask(taskType, taskData, priority = 0, assignedTurtleId = null) { const stmt = db.prepare(` - INSERT INTO task_queue (task_type, task_data, priority, status, created_at, updated_at) - VALUES (?, ?, ?, 'pending', ?, ?) + INSERT INTO task_queue (task_type, task_data, assigned_turtle_id, priority, status, created_at, updated_at) + VALUES (?, ?, ?, ?, 'pending', ?, ?) `); const now = Date.now(); - const result = stmt.run(taskType, JSON.stringify(taskData), priority, now, now); + const result = stmt.run(taskType, JSON.stringify(taskData), assignedTurtleId, priority, now, now); return result.lastInsertRowid; } @@ -292,6 +310,15 @@ export function assignTask(taskId, turtleId) { stmt.run(turtleId, Date.now(), taskId); } +export function updateTaskStatus(taskId, status, result = null) { + const stmt = db.prepare(` + UPDATE task_queue + SET status = ?, task_data = CASE WHEN ? IS NOT NULL THEN json_set(task_data, '$.result', ?) ELSE task_data END, updated_at = ? + WHERE id = ? + `); + stmt.run(status, result, result, Date.now(), taskId); +} + export function completeTask(taskId) { const stmt = db.prepare(` UPDATE task_queue @@ -301,7 +328,19 @@ export function completeTask(taskId) { stmt.run(Date.now(), taskId); } -export function getAllTasks() { +export function deleteTask(taskId) { + const stmt = db.prepare('DELETE FROM task_queue WHERE id = ?'); + return stmt.run(taskId); +} + +export function getAllTasks(status = null) { + if (status) { + const stmt = db.prepare('SELECT * FROM task_queue WHERE status = ? ORDER BY priority DESC, created_at DESC'); + return stmt.all(status).map(row => ({ + ...row, + task_data: JSON.parse(row.task_data) + })); + } const stmt = db.prepare('SELECT * FROM task_queue ORDER BY priority DESC, created_at DESC'); return stmt.all().map(row => ({ ...row, @@ -310,25 +349,40 @@ export function getAllTasks() { } // Mining Areas -export function saveMiningArea(turtleId, bounds) { +export function saveMiningArea(turtleId, bounds, areaName = null, status = 'planned') { const stmt = db.prepare(` INSERT INTO mining_areas (turtle_id, min_x, min_y, min_z, max_x, max_y, max_z, status, created_at, updated_at) - VALUES (?, ?, ?, ?, ?, ?, ?, 'active', ?, ?) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) `); const now = Date.now(); - stmt.run( + const result = stmt.run( turtleId, bounds.minX, bounds.minY, bounds.minZ, bounds.maxX, bounds.maxY, bounds.maxZ, - now, now + status, now, now ); + return result.lastInsertRowid; } -export function getMiningAreas() { - const stmt = db.prepare('SELECT * FROM mining_areas WHERE status = \'active\''); +export function getMiningAreas(statusFilter = null) { + if (statusFilter) { + const stmt = db.prepare('SELECT * FROM mining_areas WHERE status = ? ORDER BY created_at DESC'); + return stmt.all(statusFilter); + } + const stmt = db.prepare('SELECT * FROM mining_areas ORDER BY created_at DESC'); return stmt.all(); } +export function updateMiningAreaStatus(areaId, status) { + const stmt = db.prepare('UPDATE mining_areas SET status = ?, updated_at = ? WHERE id = ?'); + stmt.run(status, Date.now(), areaId); +} + +export function deleteMiningArea(areaId) { + const stmt = db.prepare('DELETE FROM mining_areas WHERE id = ?'); + return stmt.run(areaId); +} + export function closeMiningArea(areaId) { const stmt = db.prepare('UPDATE mining_areas SET status = \'closed\', updated_at = ? WHERE id = ?'); stmt.run(Date.now(), areaId); @@ -373,7 +427,7 @@ export function getMiningStats(turtleId = null, days = 7) { export function getTopMiners(limit = 10) { const stmt = db.prepare(` - SELECT turtle_id, SUM(count) as total_blocks + SELECT turtle_id, SUM(count) as total_blocks, COUNT(DISTINCT block_type) as unique_types FROM mining_stats GROUP BY turtle_id ORDER BY total_blocks DESC