prepare( "SELECT id, nama_parsil, status_kepemilikan, luas_tanah, geojson, created_at FROM tb_parsil 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']); echo json_encode($row); } else { http_response_code(404); echo json_encode(['status' => 'gagal', 'pesan' => 'Data parsil tidak ditemukan']); } } else { /* Semua data */ $filter = isset($_GET['status']) ? $_GET['status'] : null; if ($filter) { $stmt = $conn->prepare( "SELECT id, nama_parsil, status_kepemilikan, luas_tanah, geojson, created_at FROM tb_parsil WHERE status_kepemilikan = ? ORDER BY created_at DESC" ); $stmt->bind_param('s', $filter); $stmt->execute(); $result = $stmt->get_result(); } else { $result = $conn->query( "SELECT id, nama_parsil, status_kepemilikan, luas_tanah, geojson, created_at FROM tb_parsil 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 parsil baru Body (JSON): { "nama_parsil" : "Kavling A-01", "status_kepemilikan" : "SHM", // SHM|HGB|HGU|HP "luas_tanah" : 1250.5000, // m², dihitung LeafletJS "geojson" : { // GeoJSON Polygon "type": "Polygon", "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_parsil = trim($body['nama_parsil'] ?? ''); $status_kepemilikan = trim($body['status_kepemilikan'] ?? ''); $luas_tanah = (float)($body['luas_tanah'] ?? 0); $geojson_raw = $body['geojson'] ?? null; /* Validasi */ $valid_status = ['SHM', 'HGB', 'HGU', 'HP']; if (!$nama_parsil) { http_response_code(400); echo json_encode(['status' => 'gagal', 'pesan' => 'nama_parsil tidak boleh kosong']); break; } if (!in_array($status_kepemilikan, $valid_status)) { http_response_code(400); echo json_encode(['status' => 'gagal', 'pesan' => 'status_kepemilikan tidak valid. Pilih: SHM, HGB, HGU, atau HP']); break; } if (!$geojson_raw || ($geojson_raw['type'] ?? '') !== 'Polygon') { http_response_code(400); echo json_encode(['status' => 'gagal', 'pesan' => 'geojson harus bertipe Polygon']); break; } $geojson_str = json_encode($geojson_raw); $stmt = $conn->prepare( "INSERT INTO tb_parsil (nama_parsil, status_kepemilikan, luas_tanah, geojson) VALUES (?, ?, ?, ?)" ); $stmt->bind_param('ssds', $nama_parsil, $status_kepemilikan, $luas_tanah, $geojson_str); if ($stmt->execute()) { echo json_encode([ 'status' => 'sukses', 'id' => $conn->insert_id, 'pesan' => 'Data parsil berhasil disimpan' ]); } else { throw new Exception($stmt->error); } break; /* ============================================================ UPDATE — Perbarui atribut dan/atau koordinat parsil Mengirim field yang ingin diubah saja: - Edit atribut : { "nama_parsil": "...", "status_kepemilikan": "..." } - Geser vertex : { "geojson": {...}, "luas_tanah": 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_parsil', $body)) { $v = trim($body['nama_parsil']); if (!$v) { http_response_code(400); echo json_encode(['status'=>'gagal','pesan'=>'nama_parsil tidak boleh kosong']); break; } $setClauses[] = 'nama_parsil = ?'; $paramVals[] = $v; $paramTypes .= 's'; } if (array_key_exists('status_kepemilikan', $body)) { $valid = ['SHM','HGB','HGU','HP']; if (!in_array($body['status_kepemilikan'], $valid)) { http_response_code(400); echo json_encode(['status'=>'gagal','pesan'=>'status_kepemilikan tidak valid']); break; } $setClauses[] = 'status_kepemilikan = ?'; $paramVals[] = $body['status_kepemilikan']; $paramTypes .= 's'; } if (array_key_exists('luas_tanah', $body)) { $setClauses[] = 'luas_tanah = ?'; $paramVals[] = (float)$body['luas_tanah']; $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_parsil SET ' . implode(', ', $setClauses) . ' WHERE id = ?'; $stmt = $conn->prepare($sql); $stmt->bind_param($paramTypes, ...$paramVals); if ($stmt->execute()) { echo json_encode(['status' => 'sukses', 'pesan' => 'Data parsil berhasil diperbarui']); } else { throw new Exception($stmt->error); } break; /* ============================================================ DELETE — Hapus data parsil ============================================================ */ case 'DELETE': if (!$id) { http_response_code(400); echo json_encode(['status' => 'gagal', 'pesan' => 'Parameter id diperlukan']); break; } $stmt = $conn->prepare("DELETE FROM tb_parsil WHERE id = ?"); $stmt->bind_param('i', $id); if ($stmt->execute() && $stmt->affected_rows > 0) { echo json_encode(['status' => 'sukses', 'pesan' => 'Data parsil 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(); }