['required' => true, 'type' => 'enum', 'values' => ['point', 'worship', 'poor_house', 'jalan', 'parsil']], 'nama' => ['type' => 'string', 'maxLength' => 200], 'alamat' => ['type' => 'string', 'maxLength' => 255], 'latitude' => ['type' => 'double'], 'longitude' => ['type' => 'double'], ]; // Validate $errors = validateInput($data, $rules); if (!empty($errors)) { sendError('Validation failed', 400, $errors); } // Sanitize $data = sanitizeInput($data, $conn); // Build INSERT query $fields = []; $values = []; $allowed_fields = [ 'tipe', 'nama', 'jenis', 'alamat', 'kontak', 'no_wa', 'kegiatan', 'kapasitas', 'radius_meter', 'nama_kepala_keluarga', 'jumlah_anggota', 'kondisi_rumah', 'sumber_penghasilan', 'kebutuhan_prioritas', 'status_bantuan', 'latitude', 'longitude', 'status', 'panjang', 'luas', 'geom' ]; foreach ($allowed_fields as $field) { if (isset($data[$field]) && $data[$field] !== null && $data[$field] !== '') { $fields[] = $field; if ($field === 'geom') { // GeoJSON should be stored as-is if (is_array($data[$field])) { $geom_json = json_encode($data[$field]); } else { $geom_json = $data[$field]; } $values[] = "'" . $conn->real_escape_string($geom_json) . "'"; } else if (is_numeric($data[$field]) && $field !== 'nama_kepala_keluarga') { $values[] = $data[$field]; } else { $values[] = "'" . $data[$field] . "'"; } } } // Add default values $fields[] = 'created_at'; $values[] = "NOW()"; if (!isset($data['status'])) { $fields[] = 'status'; $values[] = "'aktif'"; } $sql = "INSERT INTO data_unified (" . implode(',', $fields) . ") VALUES (" . implode(',', $values) . ")"; try { if ($conn->query($sql) === TRUE) { $id = $conn->insert_id; // Log activity logActivity($conn, 'INSERT', [ 'table' => 'data_unified', 'id' => $id, 'tipe' => $data['tipe'] ]); sendResponse(true, 'Data saved successfully', ['id' => $id], 200); } else { sendError('Failed to save data: ' . $conn->error, 500); } } catch (Exception $e) { sendError('Server error: ' . $e->getMessage(), 500); } finally { $conn->close(); } ?>