0) { $stmt = $db->prepare( "SELECT id, nama_jalan, status_jalan, panjang_meter, keterangan, CAST(geojson AS CHAR) AS geojson, created_at FROM data_jalan WHERE id = ?" ); $stmt->bind_param('i', $id); $stmt->execute(); $row = $stmt->get_result()->fetch_assoc(); if (!$row) sendError('Data tidak ditemukan', 404); // Parse geojson string menjadi object $row['geojson'] = json_decode($row['geojson']); $row['panjang_meter'] = (float)$row['panjang_meter']; sendSuccess($row); } else { $rows = []; $res = $db->query( "SELECT id, nama_jalan, status_jalan, panjang_meter, keterangan, CAST(geojson AS CHAR) AS geojson, created_at FROM data_jalan ORDER BY created_at DESC" ); while ($r = $res->fetch_assoc()) { $r['geojson'] = json_decode($r['geojson']); $r['panjang_meter'] = (float)$r['panjang_meter']; $rows[] = $r; } sendSuccess($rows); } break; case 'POST': $body = getBody(); foreach (['nama_jalan','status_jalan','geojson','panjang_meter'] as $f) { if (!isset($body[$f])) sendError("Field '$f' wajib diisi"); } // Validasi GeoJSON LineString $geo = is_array($body['geojson']) ? $body['geojson'] : json_decode($body['geojson'], true); if (!$geo || $geo['type'] !== 'LineString') { sendError('GeoJSON harus bertipe LineString'); } $geoStr = json_encode($geo); $panjang = (float)$body['panjang_meter']; $stmt = $db->prepare( "INSERT INTO data_jalan (nama_jalan, status_jalan, panjang_meter, keterangan, geojson) VALUES (?, ?, ?, ?, ?)" ); $stmt->bind_param('ssdss', $body['nama_jalan'], $body['status_jalan'], $panjang, $body['keterangan'], $geoStr ); executeOrFail($stmt, 'Gagal menyimpan data jalan'); sendSuccess(['id' => $db->insert_id], 'Data jalan berhasil disimpan', 201); break; case 'PUT': if ($id <= 0) sendError('ID wajib disertakan'); $body = getBody(); $geo = is_array($body['geojson']) ? $body['geojson'] : json_decode($body['geojson'], true); $geoStr = json_encode($geo); $panjang = (float)$body['panjang_meter']; $stmt = $db->prepare( "UPDATE data_jalan SET nama_jalan=?, status_jalan=?, panjang_meter=?, keterangan=?, geojson=? WHERE id=?" ); $stmt->bind_param('ssdssi', $body['nama_jalan'], $body['status_jalan'], $panjang, $body['keterangan'], $geoStr, $id ); executeOrFail($stmt, 'Gagal memperbarui data jalan'); sendSuccess(null, 'Data jalan berhasil diperbarui'); break; case 'DELETE': if ($id <= 0) sendError('ID wajib disertakan'); $stmt = $db->prepare("DELETE FROM data_jalan WHERE id=?"); $stmt->bind_param('i', $id); executeOrFail($stmt, 'Gagal menghapus data jalan'); $stmt->affected_rows > 0 ? sendSuccess(null, 'Data jalan berhasil dihapus') : sendError('Data tidak ditemukan', 404); break; default: sendError('Method tidak diizinkan', 405); }