Passed
Pull Request — master (#394)
by Brian
05:43
created

prepare_items_query()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 20
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 9
c 1
b 0
f 0
dl 0
loc 20
rs 9.9666
cc 3
nc 3
nop 2
1
<?php
2
/**
3
 * REST discounts controller.
4
 *
5
 * @version 1.0.19
6
 */
7
8
defined( 'ABSPATH' ) || exit;
9
10
/**
11
 * REST API discounts controller class.
12
 *
13
 * @package Invoicing
14
 */
15
class WPInv_REST_Discounts_Controller extends GetPaid_REST_Posts_Controller {
16
17
    /**
18
	 * Post type.
19
	 *
20
	 * @var string
21
	 */
22
	protected $post_type = 'wpi_discount';
23
24
	/**
25
	 * The base of this controller's route.
26
	 *
27
	 * @since 1.0.13
28
	 * @var string
29
	 */
30
	protected $rest_base = 'discounts';
31
32
	/** Contains this controller's class name.
33
	 *
34
	 * @var string
35
	 */
36
	public $crud_class = 'WPInv_Discount';
37
38
	/**
39
	 * Registers the routes for the objects of the controller.
40
	 *
41
	 * @since 1.0.19
42
	 *
43
	 * @see register_rest_route()
44
	 */
45
	public function register_namespace_routes( $namespace ) {
46
47
		parent::register_namespace_routes( $namespace );
48
49
		register_rest_route(
50
			$this->namespace,
51
			'/' . $this->rest_base . '/discount-types',
52
			array(
53
				array(
54
					'methods'             => WP_REST_Server::READABLE,
55
					'callback'            => array( $this, 'get_discount_types' ),
56
					'permission_callback' => array( $this, 'get_items_permissions_check' ),
57
				),
58
			)
59
		);
60
61
	}
62
63
	/**
64
	 * Handles rest requests for discount types.
65
	 *
66
	 * @since 1.0.13
67
	 *
68
	 *
69
	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
70
	 */
71
	public function get_discount_types() {
72
		return rest_ensure_response( wpinv_get_discount_types() );
73
	}
74
75
    /**
76
	 * Retrieves the query params for the discount collection.
77
	 *
78
	 * @since 1.0.13
79
	 *
80
	 * @return array Collection parameters.
81
	 */
82
	public function get_collection_params() {
83
84
		$params = array_merge(
85
86
			parent::get_collection_params(),
87
88
        	array(
89
90
				// Discount types
91
				'type'                  => array(
92
					'description'       => __( 'Type of discounts to fetch.', 'invoicing' ),
93
					'type'              => array( 'array', 'string' ),
94
					'default'           => 'any',
95
					'validate_callback' => 'rest_validate_request_arg',
96
					'sanitize_callback' => 'wpinv_parse_list',
97
					'items'             => array(
98
						'enum'          => array_merge( array( 'any' ), array_keys( wpinv_get_discount_types() ) ),
99
						'type'          => 'string',
100
					),
101
				),
102
103
			)
104
		);
105
106
		// Filter collection parameters for the discounts controller.
107
		return apply_filters( 'getpaid_rest_discounts_collection_params', $params, $this );
108
	}
109
110
	/**
111
	 * Determine the allowed query_vars for a get_items() response and
112
	 * prepare for WP_Query.
113
	 *
114
	 * @param array           $prepared_args Prepared arguments.
115
	 * @param WP_REST_Request $request Request object.
116
	 * @return array          $query_args
117
	 */
118
	protected function prepare_items_query( $prepared_args = array(), $request = null ) {
119
120
		$query_args = parent::prepare_items_query( $prepared_args );
121
122
		// Retrieve items by type.
123
		if ( ! in_array( 'any', $request['type'] ) ) {
0 ignored issues
show
Bug introduced by
It seems like $request['type'] can also be of type null; however, parameter $haystack of in_array() does only seem to accept array, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

123
		if ( ! in_array( 'any', /** @scrutinizer ignore-type */ $request['type'] ) ) {
Loading history...
124
125
			if ( empty( $query_args['meta_query'] ) ) {
126
				$query_args['meta_query'] = array();
127
			}
128
129
			$query_args['meta_query'][] = array(
130
				'key'     => '_wpi_discount_type',
131
				'value'   => implode( ',', $request['type'] ),
0 ignored issues
show
Bug introduced by
It seems like $request['type'] can also be of type null; however, parameter $pieces of implode() does only seem to accept array, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

131
				'value'   => implode( ',', /** @scrutinizer ignore-type */ $request['type'] ),
Loading history...
132
				'compare' => 'IN',
133
			);
134
135
		}
136
137
		return apply_filters( 'getpaid_rest_discounts_prepare_items_query', $query_args, $request, $this );
138
139
	}
140
141
	/**
142
	 * Retrieves a valid list of post statuses.
143
	 *
144
	 * @since 1.0.15
145
	 *
146
	 * @return array A list of registered item statuses.
147
	 */
148
	public function get_post_statuses() {
149
		return array( 'publish', 'pending', 'draft', 'expired' );
150
	}
151
152
}
153