HEX
Server: Apache
System: Linux uws7-179.cafe24.com 3.10.0-1160.119.1p.el7.x86_64 #1 SMP Thu Sep 11 14:15:01 KST 2025 x86_64
User: medikors (1589)
PHP: 7.3.1p1
Disabled: mysql_pconnect
Upload Files
File: /medikors/www/wp-content/plugins/userfeedback-lite/includes/admin/class-userfeedback-surveys.php
<?php

/**
 * Surveys Controller class.
 *
 * Handles API calls related to Surveys
 *
 * @since 1.0.0
 *
 * @package UserFeedback
 * @author  David Paternina
 */
class UserFeedback_Surveys {

	public function __construct() {
		add_action( 'rest_api_init', array( $this, 'register_routes' ) );
		add_action( 'in_admin_footer', [ $this, 'promote_userfeedback' ] );
	}

	/**
	 * Registers REST routes
	 *
	 * @return void
	 */
	public function register_routes() {

		register_rest_route(
			'userfeedback/v1',
			'/surveys',
			array(
				'methods'             => 'GET',
				'callback'            => array( $this, 'get_surveys' ),
				'permission_callback' => array( $this, 'create_edit_surveys_permission_check' ),
			)
		);

		register_rest_route(
			'userfeedback/v1',
			'/surveys/(?P<id>\w+)',
			array(
				'methods'             => 'GET',
				'callback'            => array( $this, 'get_survey' ),
				'permission_callback' => array( $this, 'create_edit_surveys_permission_check' ),
			)
		);

		register_rest_route(
			'userfeedback/v1',
			'/surveys',
			array(
				'methods'             => 'POST',
				'callback'            => array( $this, 'save_survey' ),
				'permission_callback' => array( $this, 'create_edit_surveys_permission_check' ),
			)
		);

		register_rest_route(
			'userfeedback/v1',
			'/surveys/restore',
			array(
				'methods'             => 'POST',
				'callback'            => array( $this, 'restore_surveys' ),
				'permission_callback' => array( $this, 'delete_surveys_permission_check' ),
			)
		);

		register_rest_route(
			'userfeedback/v1',
			'/surveys/draft',
			array(
				'methods'             => 'POST',
				'callback'            => array( $this, 'draft_surveys' ),
				'permission_callback' => array( $this, 'create_edit_surveys_permission_check' ),
			)
		);

		register_rest_route(
			'userfeedback/v1',
			'/surveys/trash',
			array(
				'methods'             => 'POST',
				'callback'            => array( $this, 'trash_surveys' ),
				'permission_callback' => array( $this, 'delete_surveys_permission_check' ),
			)
		);

		register_rest_route(
			'userfeedback/v1',
			'/surveys/publish',
			array(
				'methods'             => 'POST',
				'callback'            => array( $this, 'publish_surveys' ),
				'permission_callback' => array( $this, 'create_edit_surveys_permission_check' ),
			)
		);

		register_rest_route(
			'userfeedback/v1',
			'/surveys',
			array(
				'methods'             => 'DELETE',
				'callback'            => array( $this, 'delete_surveys' ),
				'permission_callback' => array( $this, 'delete_surveys_permission_check' ),
			)
		);

		register_rest_route(
			'userfeedback/v1',
			'/surveys/(?P<id>\w+)/duplicate',
			array(
				'methods'             => 'POST',
				'callback'            => array( $this, 'duplicate_survey' ),
				'permission_callback' => array( $this, 'create_edit_surveys_permission_check' ),
			)
		);

		register_rest_route(
			'userfeedback/v1',
			'/survey-templates',
			array(
				'methods'             => 'GET',
				'callback'            => array( $this, 'get_available_survey_templates' ),
				'permission_callback' => array( $this, 'create_edit_surveys_permission_check' ),
			)
		);
	}

	/**
	 * Permissions Check
	 *
	 * @return bool
	 */
	public function create_edit_surveys_permission_check() {
		return current_user_can( 'userfeedback_create_edit_surveys' );
	}

	/**
	 * Permissions Check
	 *
	 * @return bool
	 */
	public function delete_surveys_permission_check() {
		return current_user_can( 'userfeedback_delete_surveys' );
	}

	/**
	 * Get Surveys
	 *
	 * @return WP_REST_Response
	 */
	public function get_surveys( WP_REST_Request $request ) {
		$has_pagination = false;

		$query = UserFeedback_Survey::where(
			array(
				array( 'status', '!=', 'trash' ), // Get only published and drafts by default
			)
		)->with_count( array( 'responses' ) );

		if ( $request->has_param( 'filter' ) ) {
			$filters = $request->get_param( 'filter' );

			foreach ( $filters as $attr => $value ) {
				if ( $value === 'all' ) {
					break;
				}

				if ( $attr === 'status' && $value === 'publish' ) {
					$query->add_where(
						array(
							'status'     => 'publish',
							'publish_at' => null,
						),
						true
					)->or_where(
						array(
							'status' => 'publish',
							array( 'publish_at', '<=', current_time( 'mysql', true ) ),
						)
					);
				} elseif ( $attr === 'status' && $value === 'scheduled' ) {
					$query->add_where(
						array(
							'status' => 'publish',
							array( 'publish_at', 'is not', null ),
							array( 'publish_at', '>', current_time( 'mysql', true ) ),
						),
						true
					);
				} else {
					$query->add_where(
						array(
							$attr => $value,
						),
						true
					);
				}
			}
		}

		if ( $request->has_param( 'orderby' ) ) {
			$field = $request->get_param( 'orderby' );
			$order = $request->get_param( 'order' );
			$order = $order ?: 'desc';

			$query->sort( $field, $order );
		} else {
			$query->sort( 'id', 'desc' );
		}

		if ( $request->has_param( 'select' ) ) {
			$query->select( $request->get_param( 'select' ) );
		}

        if ( $request->has_param( 'page' ) ) {
            $has_pagination = true;
            $query->paginate(
				$request->has_param( 'per_page' ) ? $request->get_param('per_page') : 10,
                $request->get_param( 'page' )
            );
        }

		$surveys = $query->get();

		if ( ! $has_pagination ) {
			return new WP_REST_Response( $surveys );
		}

		// Data for quick filters
		$count_by_status_result = UserFeedback_Survey::query()
			->select( array( 'status', 'count' ) )
			->select_raw( 'if (publish_at is null or publish_at <= now(), false, true) as scheduled' )
			->group_by( 'status, scheduled' )
			->get();

		$allTotal = 0;

		foreach ( $count_by_status_result as $item ) {
			if ( $item->status !== 'trash' ) {
				$allTotal += $item->count;
			}

			if ( $item->status === 'publish' && $item->scheduled ) {
				$item->status = 'scheduled';
			}

			unset( $item->scheduled );
		}

		array_unshift(
			$count_by_status_result,
			array(
				'status' => 'all',
				'count'  => $allTotal,
			)
		);

		$surveys['status_filters'] = $count_by_status_result;

		return new WP_REST_Response( $surveys );
	}

	/**
	 * Get a single survey by id
	 *
	 * @return WP_REST_Response
	 */
	public function get_survey( WP_REST_Request $request ) {

		$survey_id = $request->get_param( 'id' );

		$survey = UserFeedback_Survey::find( $survey_id );

		if ( ! $survey ) {
			return new WP_REST_Response( null, 404 );
		}

		if ( $request->has_param( 'with' ) ) {
			$query_instance = UserFeedback_Survey::query();
			$query_instance->with( explode( ',', $request->get_param( 'with' ) ) );
			$survey = $query_instance->populate_relations( $survey );
		}

		return new WP_REST_Response(
			$survey
		);
	}

	/**
	 * Saves or updates a Survey
	 *
	 * @return WP_REST_Response
	 */
	public function save_survey( WP_REST_Request $request ) {

		// Check if params include id
		$survey_id = $request['id'];

		if ( userfeedback_is_tracking_allowed() && isset( $request['template'] ) ) {
			$tracked_data = get_option( 'userfeedback_tracking_data', array() );

			if ( isset( $tracked_data['templates'] ) ) {
				$tracked_data['templates'][] = $request['template'];
			} else {
				$tracked_data['templates'] = array(
					$request['template'],
				);
			}

			update_option( 'userfeedback_tracking_data', $tracked_data );
		}

		$params = $request->get_params();
		$survey_count = UserFeedback_Survey::count();

		if(isset($params['title']) && 'First Survey' === $params['title'] && $survey_count > 0) {
			unset($params['title']);
			UserFeedback_Survey::update( $survey_id, $params );
			$survey = UserFeedback_Survey::get_by( 'title', 'First Survey' );
			$survey_id = $survey->id;
			$params['title'] = 'First Survey';
		}

		if ( isset( $survey_id ) && $survey_id != 'null' ) {
			UserFeedback_Survey::update( $survey_id, $params );
			$survey = UserFeedback_Survey::find( $survey_id );
		} else {
			$number_of_surveys = UserFeedback_Survey::count();
			$new_survey_title  =
				empty( $params['title'] ) ?
					sprintf( __( 'Survey #%d', 'userfeedback' ), $number_of_surveys + 1 ) : $params['title'];

			$new_id = UserFeedback_Survey::create(
				array_merge(
					$params,
					array( 'title' => $new_survey_title )
				)
			);
			$survey = UserFeedback_Survey::find( $new_id );
		}

		return new WP_REST_Response( $survey );
	}

	/**
	 * Duplicate survey with the given id
	 *
	 * @return WP_REST_Response
	 */
	public function duplicate_survey( $data ) {

		$survey_id = $data['id'];
		$survey    = UserFeedback_Survey::find( $survey_id );

		// Save as new survey, return new one's id
		unset( $survey->id );
		$new_survey_id = UserFeedback_Survey::create(
			array_merge(
				(array) $survey,
				array(
					'title'  => sprintf( __( 'Copy of %s', 'userfeedback' ), $survey->title ),
					'status' => 'draft',
				)
			)
		);

		$new_survey = UserFeedback_Survey::find( $new_survey_id );

		return new WP_REST_Response(
			$new_survey
		);
	}

	/**
	 * Restore surveys by Id
	 *
	 * @return WP_REST_Response
	 */
	public function restore_surveys( $data ) {
		$survey_ids = $data['survey_ids'];
		UserFeedback_Survey::restore( $survey_ids );
		return new WP_REST_Response( null, 204 );
	}

	/**
	 * Draft surveys by Id
	 *
	 * @return WP_REST_Response
	 */
	public function draft_surveys( $data ) {
		$survey_ids = $data['survey_ids'];
		$temp       = UserFeedback_Survey::draft( $survey_ids );
		return new WP_REST_Response( $temp, 200 );
	}

	/**
	 * Publish surveys by Id
	 *
	 * @return WP_REST_Response
	 */
	public function publish_surveys( $data ) {
		$survey_ids = $data['survey_ids'];
		$temp       = UserFeedback_Survey::publish( $survey_ids );
		return new WP_REST_Response( $temp, 200 );
	}

	/**
	 * Trash surveys by Id
	 *
	 * @return WP_REST_Response
	 */
	public function trash_surveys( $data ) {
		$survey_ids = $data['survey_ids'];
		UserFeedback_Survey::trash( $survey_ids );
		return new WP_REST_Response( null, 204 );
	}

	/**
	 * Delete surveys by Id
	 *
	 * @return WP_REST_Response
	 */
	public function delete_surveys( $data ) {
		$survey_ids = $data['survey_ids'];
		UserFeedback_Survey::delete( $survey_ids );
		return new WP_REST_Response( null, 204 );
	}

	/**
	 * Get available Survey templates
	 *
	 * @return WP_REST_Response
	 */
	public function get_available_survey_templates() {
		$templates = UserFeedback_Survey_Templates::get_instance()->get_available_templates();
		return new WP_REST_Response( $templates );
	}

	/**
	 * Pre-footer promotion block, displayed on all WPForms admin pages except Form Builder.
	 */
	public function promote_userfeedback() {
		$is_uf_page = userfeedback_screen_is_userfeedback();
		
		if( !$is_uf_page ){
			return;
		}

		$is_pro = userfeedback_is_pro_version();

		$links = [
			[
				'text' => __( 'Support', 'userfeedback' ),
				'link' => $is_pro ? userfeedback_get_url('footer_link', 'made-with-love', 'https://www.userfeedback.com/contact/') : 'https://wordpress.org/support/plugin/userfeedback-lite/',
				'target' => '_blank',
			],
			[
				'text' => __( 'Docs', 'userfeedback' ),
				'link' => userfeedback_get_url('footer_link', 'made-with-love', 'https://www.userfeedback.com/docs/'),
				'target' => '_blank',
			],
			[
				'text' => __( 'Free Plugins', 'userfeedback' ),
				'link' => admin_url('admin.php?page=userfeedback_settings#/about'),
				'target' => '_self',
			],
			[
				'text' => __( 'Suggest a Feature', 'userfeedback' ),
				'link' => userfeedback_get_url('footer_link', 'made-with-love', 'https://www.userfeedback.com/suggest-feature/'),
				'target' => '_blank',
			],
		];
		if(!empty($links)){
			echo '<div class="userfeedback-love">';
			echo esc_html__('Made with ♥ by the UserFeedback Team', 'userfeedback');
			$links_output = [];
			foreach($links as $link){
				$links_output[] = '<a target="'.esc_attr($link['target']).'" href="'.esc_url($link['link']).'">' . esc_html($link['text']) . '</a>';
			}
			echo '<div>'. implode('<span class="sep">/</span>', $links_output) .'</div>';
			echo '</div>';
		}
		
	}

}

new UserFeedback_Surveys();