0) { $stmt = $db->prepare( "SELECT id, nama_pemilik, no_sertifikat, jenis_hak, luas_m2, keterangan, CAST(geojson AS CHAR) AS geojson, created_at FROM data_parsil WHERE id = ?" ); $stmt->bind_param('i', $id); $stmt->execute(); $row = $stmt->get_result()->fetch_assoc(); if (!$row) sendError('Data tidak ditemukan', 404); $row['geojson'] = json_decode($row['geojson']); $row['luas_m2'] = (float)$row['luas_m2']; sendSuccess($row); } else { $rows = []; $res = $db->query( "SELECT id, nama_pemilik, no_sertifikat, jenis_hak, luas_m2, keterangan, CAST(geojson AS CHAR) AS geojson, created_at FROM data_parsil ORDER BY created_at DESC" ); while ($r = $res->fetch_assoc()) { $r['geojson'] = json_decode($r['geojson']); $r['luas_m2'] = (float)$r['luas_m2']; $rows[] = $r; } sendSuccess($rows); } break; case 'POST': $body = getBody(); foreach (['nama_pemilik','jenis_hak','geojson','luas_m2'] as $f) { if (!isset($body[$f])) sendError("Field '$f' wajib diisi"); } $geo = is_array($body['geojson']) ? $body['geojson'] : json_decode($body['geojson'], true); if (!$geo || $geo['type'] !== 'Polygon') { sendError('GeoJSON harus bertipe Polygon'); } $geoStr = json_encode($geo); $luas = (float)$body['luas_m2']; $stmt = $db->prepare( "INSERT INTO data_parsil (nama_pemilik, no_sertifikat, jenis_hak, luas_m2, keterangan, geojson) VALUES (?, ?, ?, ?, ?, ?)" ); $stmt->bind_param('sssdss', $body['nama_pemilik'], $body['no_sertifikat'], $body['jenis_hak'], $luas, $body['keterangan'], $geoStr ); executeOrFail($stmt, 'Gagal menyimpan data parsil'); sendSuccess(['id' => $db->insert_id], 'Data parsil 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); $luas = (float)$body['luas_m2']; $stmt = $db->prepare( "UPDATE data_parsil SET nama_pemilik=?, no_sertifikat=?, jenis_hak=?, luas_m2=?, keterangan=?, geojson=? WHERE id=?" ); $stmt->bind_param('sssdssi', $body['nama_pemilik'], $body['no_sertifikat'], $body['jenis_hak'], $luas, $body['keterangan'], $geoStr, $id ); executeOrFail($stmt, 'Gagal memperbarui data parsil'); sendSuccess(null, 'Data parsil berhasil diperbarui'); break; case 'DELETE': if ($id <= 0) sendError('ID wajib disertakan'); $stmt = $db->prepare("DELETE FROM data_parsil WHERE id=?"); $stmt->bind_param('i', $id); executeOrFail($stmt, 'Gagal menghapus data parsil'); $stmt->affected_rows > 0 ? sendSuccess(null, 'Data parsil berhasil dihapus') : sendError('Data tidak ditemukan', 404); break; default: sendError('Method tidak diizinkan', 405); }