prepare( "SELECT id, nama_jalan, status_jalan, panjang_jalan, geojson, created_at FROM tb_jalan WHERE id = ?" ); $stmt->bind_param('i', $id); $stmt->execute(); $result = $stmt->get_result(); $row = $result->fetch_assoc(); if ($row) { $row['geojson'] = json_decode($row['geojson']); // parse ke objek echo json_encode($row); } else { http_response_code(404); echo json_encode(['status' => 'gagal', 'pesan' => 'Data jalan tidak ditemukan']); } } else { /* Semua data */ $filter = isset($_GET['status']) ? $_GET['status'] : null; if ($filter) { $stmt = $conn->prepare( "SELECT id, nama_jalan, status_jalan, panjang_jalan, geojson, created_at FROM tb_jalan WHERE status_jalan = ? ORDER BY created_at DESC" ); $stmt->bind_param('s', $filter); $stmt->execute(); $result = $stmt->get_result(); } else { $result = $conn->query( "SELECT id, nama_jalan, status_jalan, panjang_jalan, geojson, created_at FROM tb_jalan ORDER BY created_at DESC" ); } $data = []; while ($row = $result->fetch_assoc()) { $row['geojson'] = json_decode($row['geojson']); $data[] = $row; } echo json_encode($data); } break; /* ============================================================ CREATE — Simpan data jalan baru Body (JSON): { "nama_jalan" : "Jalan Ahmad Yani", "status_jalan" : "Nasional", // Nasional|Provinsi|Kabupaten "panjang_jalan" : 2345.67, // meter, dihitung oleh LeafletJS "geojson" : { // GeoJSON LineString "type": "LineString", "coordinates": [[lng,lat], ...] } } ============================================================ */ case 'POST': $body = json_decode(file_get_contents('php://input'), true); if (!$body) { http_response_code(400); echo json_encode(['status' => 'gagal', 'pesan' => 'Body request tidak valid atau bukan JSON']); break; } $nama_jalan = trim($body['nama_jalan'] ?? ''); $status_jalan = trim($body['status_jalan'] ?? ''); $panjang_jalan = (float)($body['panjang_jalan'] ?? 0); $geojson_raw = $body['geojson'] ?? null; /* Validasi */ $valid_status = ['Nasional', 'Provinsi', 'Kabupaten']; if (!$nama_jalan) { http_response_code(400); echo json_encode(['status' => 'gagal', 'pesan' => 'nama_jalan tidak boleh kosong']); break; } if (!in_array($status_jalan, $valid_status)) { http_response_code(400); echo json_encode(['status' => 'gagal', 'pesan' => 'status_jalan tidak valid. Pilih: Nasional, Provinsi, atau Kabupaten']); break; } if (!$geojson_raw || ($geojson_raw['type'] ?? '') !== 'LineString') { http_response_code(400); echo json_encode(['status' => 'gagal', 'pesan' => 'geojson harus bertipe LineString']); break; } $geojson_str = json_encode($geojson_raw); $stmt = $conn->prepare( "INSERT INTO tb_jalan (nama_jalan, status_jalan, panjang_jalan, geojson) VALUES (?, ?, ?, ?)" ); $stmt->bind_param('ssds', $nama_jalan, $status_jalan, $panjang_jalan, $geojson_str); if ($stmt->execute()) { echo json_encode([ 'status' => 'sukses', 'id' => $conn->insert_id, 'pesan' => 'Data jalan berhasil disimpan' ]); } else { throw new Exception($stmt->error); } break; /* ============================================================ UPDATE — Perbarui atribut dan/atau koordinat jalan Mengirim field yang ingin diubah saja: - Edit atribut : { "nama_jalan": "...", "status_jalan": "..." } - Geser vertex : { "geojson": {...}, "panjang_jalan": 1234.5 } - Keduanya : { semua field } ============================================================ */ case 'PUT': if (!$id) { http_response_code(400); echo json_encode(['status' => 'gagal', 'pesan' => 'Parameter id diperlukan']); break; } $body = json_decode(file_get_contents('php://input'), true); if (!$body) { http_response_code(400); echo json_encode(['status' => 'gagal', 'pesan' => 'Body tidak valid']); break; } /* Bangun query dinamis berdasarkan field yang dikirim */ $setClauses = []; $paramVals = []; $paramTypes = ''; if (array_key_exists('nama_jalan', $body)) { $v = trim($body['nama_jalan']); if (!$v) { http_response_code(400); echo json_encode(['status'=>'gagal','pesan'=>'nama_jalan tidak boleh kosong']); break; } $setClauses[] = 'nama_jalan = ?'; $paramVals[] = $v; $paramTypes .= 's'; } if (array_key_exists('status_jalan', $body)) { $valid = ['Nasional','Provinsi','Kabupaten']; if (!in_array($body['status_jalan'], $valid)) { http_response_code(400); echo json_encode(['status'=>'gagal','pesan'=>'status_jalan tidak valid']); break; } $setClauses[] = 'status_jalan = ?'; $paramVals[] = $body['status_jalan']; $paramTypes .= 's'; } if (array_key_exists('panjang_jalan', $body)) { $setClauses[] = 'panjang_jalan = ?'; $paramVals[] = (float)$body['panjang_jalan']; $paramTypes .= 'd'; } if (array_key_exists('geojson', $body)) { $setClauses[] = 'geojson = ?'; $paramVals[] = json_encode($body['geojson']); $paramTypes .= 's'; } if (empty($setClauses)) { echo json_encode(['status' => 'gagal', 'pesan' => 'Tidak ada field yang dikirim untuk diupdate']); break; } $paramVals[] = $id; $paramTypes .= 'i'; $sql = 'UPDATE tb_jalan SET ' . implode(', ', $setClauses) . ' WHERE id = ?'; $stmt = $conn->prepare($sql); $stmt->bind_param($paramTypes, ...$paramVals); if ($stmt->execute()) { echo json_encode(['status' => 'sukses', 'pesan' => 'Data jalan berhasil diperbarui']); } else { throw new Exception($stmt->error); } break; /* ============================================================ DELETE — Hapus data jalan ============================================================ */ case 'DELETE': if (!$id) { http_response_code(400); echo json_encode(['status' => 'gagal', 'pesan' => 'Parameter id diperlukan']); break; } $stmt = $conn->prepare("DELETE FROM tb_jalan WHERE id = ?"); $stmt->bind_param('i', $id); if ($stmt->execute() && $stmt->affected_rows > 0) { echo json_encode(['status' => 'sukses', 'pesan' => 'Data jalan berhasil dihapus']); } else { http_response_code(404); echo json_encode(['status' => 'gagal', 'pesan' => 'Data tidak ditemukan atau sudah dihapus']); } break; default: http_response_code(405); echo json_encode(['status' => 'gagal', 'pesan' => 'Method tidak didukung']); } } catch (Exception $e) { http_response_code(500); echo json_encode(['status' => 'gagal', 'pesan' => 'Server error: ' . $e->getMessage()]); } finally { if ($conn) $conn->close(); }