REST_Forms_Controller

Class to access forms via the REST API.

Description

Source

File: src/db-objects/forms/rest-forms-controller.php

class REST_Forms_Controller extends REST_Models_Controller {

	/**
	 * Constructor.
	 *
	 * @since 1.0.0
	 *
	 * @param Form_Manager $manager The manager instance.
	 */
	public function __construct( $manager ) {
		parent::__construct( $manager );

		$this->namespace .= '/v1';
	}

	/**
	 * Retrieves the model's schema, conforming to JSON Schema.
	 *
	 * @since 1.0.0
	 *
	 * @return array Model schema data.
	 */
	public function get_item_schema() {
		$schema = parent::get_item_schema();

		$schema['properties']['status'] = array(
			'description' => __( 'Status of the form.', 'torro-forms' ),
			'type'        => 'string',
			'enum'        => array_keys( get_post_stati( array(
				'internal' => false,
			) ) ),
			'context'     => array( 'edit' ),
		);

		$schema['properties']['timestamp'] = array(
			'description' => __( 'UNIX timestamp for when the form was created.', 'torro-forms' ),
			'type'        => 'integer',
			'context'     => array( 'view', 'edit', 'embed' ),
		);

		$schema['properties']['timestamp_modified'] = array(
			'description' => __( 'UNIX timestamp for when the form was last modified.', 'torro-forms' ),
			'type'        => 'integer',
			'context'     => array( 'view', 'edit', 'embed' ),
		);

		return $schema;
	}

	/**
	 * Retrieves the query params for the models collection.
	 *
	 * @since 1.0.0
	 *
	 * @return array Collection parameters.
	 */
	public function get_collection_params() {
		$query_params = parent::get_collection_params();

		$query_params['per_page']['maximum'] = 500;
		$query_params['orderby']['default'] = 'timestamp';
		$query_params['order']['default'] = 'desc';

		$query_params['status'] = array(
			'description'       => __( 'Limit result set to forms with one or more specific statuses.', 'torro-forms' ),
			'type'              => 'array',
			'items'             => array(
				'type' => 'string',
				'enum' => array_keys( get_post_stati( array(
					'internal' => false,
				) ) ),
			),
			'default'           => 'publish',
			'sanitize_callback' => array( $this, 'sanitize_status_param' ),
		);

		return $query_params;
	}

	/**
	 * Prepares links for the request.
	 *
	 * @since 1.0.0
	 *
	 * @param Form $form Form object.
	 * @return array Links for the given form.
	 */
	protected function prepare_links( $form ) {
		$links = parent::prepare_links( $form );

		$primary_property = $this->manager->get_primary_property();

		$links['containers'] = array(
			'href'       => add_query_arg( array(
				'form_id'  => $form->$primary_property,
				'per_page' => 10,
			), rest_url( sprintf( '%s/%s', $this->namespace, 'containers' ) ) ),
			'embeddable' => true,
		);

		$links['elements'] = array(
			'href'       => add_query_arg( array(
				'form_id'  => $form->$primary_property,
				'per_page' => 50,
			), rest_url( sprintf( '%s/%s', $this->namespace, 'elements' ) ) ),
			'embeddable' => true,
		);

		$links['element_choices'] = array(
			'href'       => add_query_arg( array(
				'form_id'  => $form->$primary_property,
				'per_page' => 250,
			), rest_url( sprintf( '%s/%s', $this->namespace, 'element_choices' ) ) ),
			'embeddable' => true,
		);

		$links['element_settings'] = array(
			'href'       => add_query_arg( array(
				'form_id'  => $form->$primary_property,
				'per_page' => 250,
			), rest_url( sprintf( '%s/%s', $this->namespace, 'element_settings' ) ) ),
			'embeddable' => true,
		);

		$links['submissions'] = array(
			'href' => add_query_arg( 'form_id', $form->$primary_property, rest_url( sprintf( '%s/%s', $this->namespace, 'submissions' ) ) ),
		);

		$links['submission_values'] = array(
			'href' => add_query_arg( 'form_id', $form->$primary_property, rest_url( sprintf( '%s/%s', $this->namespace, 'submission_values' ) ) ),
		);

		return $links;
	}

	/**
	 * Sanitizes and validates the list of statuses.
	 *
	 * @since 1.0.0
	 *
	 * @param string|array    $statuses  One or more statuses.
	 * @param WP_REST_Request $request   Full details about the request.
	 * @param string          $parameter Additional parameter to pass to validation.
	 * @return array|WP_Error A list of valid statuses, otherwise WP_Error object.
	 */
	public function sanitize_status_param( $statuses, $request, $parameter ) {
		$statuses = wp_parse_slug_list( $statuses );

		$attributes = $request->get_attributes();
		$default_status = $attributes['args']['status']['default'];

		foreach ( $statuses as $status ) {
			if ( $status === $default_status ) {
				continue;
			}

			$post_type_obj = get_post_type_object( $this->manager->get_prefix() . 'form' );

			if ( current_user_can( $post_type_obj->cap->edit_posts ) ) {
				$result = rest_validate_request_arg( $status, $request, $parameter );
				if ( is_wp_error( $result ) ) {
					return $result;
				}
			} else {
				return new WP_Error( 'rest_forbidden_status', __( 'Status is forbidden.', 'torro-forms' ), array( 'status' => rest_authorization_required_code() ) );
			}
		}

		return $statuses;
	}
}

Changelog

Changelog
Version Description
1.0.0 Introduced.

Methods

  • get_embed_limit — Gets the limit for embedding resources from another collection endpoint.