'Not found']); } } catch (Exception $e) { http_response_code(500); echo json_encode(['error' => $e->getMessage()]); } function handleTeams($method, $id, $db) { switch ($method) { case 'GET': if ($id) { $stmt = $db->prepare("SELECT * FROM teams WHERE id = ?"); $stmt->execute([$id]); echo json_encode($stmt->fetch(PDO::FETCH_ASSOC)); } else { echo json_encode($db->query("SELECT * FROM teams ORDER BY name")->fetchAll(PDO::FETCH_ASSOC)); } break; case 'POST': $data = json_decode(file_get_contents('php://input'), true); $stmt = $db->prepare("INSERT INTO teams (name, color) VALUES (?, ?)"); $stmt->execute([$data['name'], $data['color'] ?? '#0d6efd']); echo json_encode(['id' => $db->lastInsertId()]); break; } } function handleEvents($method, $id, $db) { switch ($method) { case 'GET': if ($id) { $stmt = $db->prepare(" SELECT e.*, t.name AS team_name, t.color AS team_color FROM events e JOIN teams t ON e.team_id = t.id WHERE e.id = ? "); $stmt->execute([$id]); $event = $stmt->fetch(PDO::FETCH_ASSOC); if ($event) { $cstmt = $db->prepare("SELECT * FROM comments WHERE event_id = ? ORDER BY created_at ASC"); $cstmt->execute([$id]); $event['comments'] = $cstmt->fetchAll(PDO::FETCH_ASSOC); } echo json_encode($event); } else { $teamFilter = $_GET['team_id'] ?? null; $sql = " SELECT e.*, t.name AS team_name, t.color AS team_color FROM events e JOIN teams t ON e.team_id = t.id "; $params = []; if ($teamFilter) { $sql .= " WHERE e.team_id = ?"; $params[] = $teamFilter; } $sql .= " ORDER BY e.occurred_at DESC"; $stmt = $db->prepare($sql); $stmt->execute($params); echo json_encode($stmt->fetchAll(PDO::FETCH_ASSOC)); } break; case 'POST': $data = json_decode(file_get_contents('php://input'), true); $stmt = $db->prepare(" INSERT INTO events (team_id, title, description, severity, event_type, occurred_at) VALUES (?, ?, ?, ?, ?, ?) "); $stmt->execute([ $data['team_id'], $data['title'], $data['description'] ?? '', $data['severity'] ?? 'info', $data['event_type'] ?? 'general', $data['occurred_at'] ?? date('Y-m-d H:i:s') ]); echo json_encode(['id' => $db->lastInsertId()]); break; case 'DELETE': if ($id) { $stmt = $db->prepare("DELETE FROM events WHERE id = ?"); $stmt->execute([$id]); echo json_encode(['deleted' => true]); } break; } } function handleComments($method, $id, $db) { switch ($method) { case 'GET': $eventId = $_GET['event_id'] ?? null; if ($eventId) { $stmt = $db->prepare("SELECT * FROM comments WHERE event_id = ? ORDER BY created_at ASC"); $stmt->execute([$eventId]); echo json_encode($stmt->fetchAll(PDO::FETCH_ASSOC)); } break; case 'POST': $data = json_decode(file_get_contents('php://input'), true); $stmt = $db->prepare("INSERT INTO comments (event_id, author, body) VALUES (?, ?, ?)"); $stmt->execute([$data['event_id'], $data['author'], $data['body']]); echo json_encode(['id' => $db->lastInsertId()]); break; } } function handleNodes($method, $id, $db) { switch ($method) { case 'GET': echo json_encode($db->query("SELECT * FROM network_nodes ORDER BY group_name, label")->fetchAll(PDO::FETCH_ASSOC)); break; case 'POST': $data = json_decode(file_get_contents('php://input'), true); $stmt = $db->prepare(" INSERT INTO network_nodes (label, ip_address, node_type, status, group_name, pos_x, pos_y) VALUES (?, ?, ?, ?, ?, ?, ?) "); $stmt->execute([ $data['label'], $data['ip_address'] ?? '', $data['node_type'] ?? 'host', $data['status'] ?? 'unknown', $data['group_name'] ?? 'default', $data['pos_x'] ?? 0, $data['pos_y'] ?? 0 ]); echo json_encode(['id' => $db->lastInsertId()]); break; case 'PUT': if ($id) { $data = json_decode(file_get_contents('php://input'), true); $fields = []; $params = []; foreach (['label','ip_address','node_type','status','group_name','pos_x','pos_y'] as $f) { if (isset($data[$f])) { $fields[] = "$f = ?"; $params[] = $data[$f]; } } if ($fields) { $params[] = $id; $stmt = $db->prepare("UPDATE network_nodes SET " . implode(', ', $fields) . " WHERE id = ?"); $stmt->execute($params); } echo json_encode(['updated' => true]); } break; case 'DELETE': if ($id) { $db->prepare("DELETE FROM network_nodes WHERE id = ?")->execute([$id]); echo json_encode(['deleted' => true]); } break; } } function handleLinks($method, $id, $db) { switch ($method) { case 'GET': echo json_encode($db->query(" SELECT l.*, s.label AS source_label, t.label AS target_label FROM network_links l JOIN network_nodes s ON l.source_id = s.id JOIN network_nodes t ON l.target_id = t.id ")->fetchAll(PDO::FETCH_ASSOC)); break; case 'POST': $data = json_decode(file_get_contents('php://input'), true); $stmt = $db->prepare(" INSERT INTO network_links (source_id, target_id, link_type, label) VALUES (?, ?, ?, ?) "); $stmt->execute([ $data['source_id'], $data['target_id'], $data['link_type'] ?? 'direct', $data['label'] ?? '' ]); echo json_encode(['id' => $db->lastInsertId()]); break; case 'DELETE': if ($id) { $db->prepare("DELETE FROM network_links WHERE id = ?")->execute([$id]); echo json_encode(['deleted' => true]); } break; } }