PluginProbe
WPBot – ChatBot Conversational Forms / 1.2.0
WPBot – ChatBot Conversational Forms v1.2.0
1.5.0 1.4.8 1.4.7 trunk 0.9.2 0.9.3 0.9.5 0.9.6 0.9.7 0.9.8 0.9.9 1.0.0 1.1.0 1.1.1 1.1.2 1.1.3 1.1.4 1.1.6 1.1.7 1.1.8 1.2.0 1.3.0 1.3.1 1.3.2 1.3.3 All 36 releases
conversational-forms / classes / api / entries.php

entries.php in WPBot – ChatBot Conversational Forms 1.2.0, at classes/api/entries.php

397 lines 10.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * CRUD via REST API for entries
5 *
6 * @package Caldera_Forms Modified by QuantumCloud
7 * @author Josh Pollock <Josh@CalderaWP.com>
8 * @license GPL-2.0+
9 * @link
10 * @copyright 2016 CalderaWP LLC
11 */
12 class Qcformbuilder_Forms_API_Entries extends Qcformbuilder_Forms_API_CRUD {
13
14 /**
15 * @inheritdoc
16 *
17 * @since 1.7.0
18 */
19 public function add_routes( $namespace ) {
20 parent::add_routes($namespace);
21 register_rest_route($namespace, $this->non_id_endpoint_url() . '/delete',
22 array(
23 'methods' => array( \WP_REST_Server::READABLE ),
24 'callback' => array($this, 'delete_entries'),
25 'permission_callback' => array($this, 'update_item_permissions_check')
26 )
27 );
28 }
29
30 /**
31 * Get an entry
32 *
33 * GET /wfb-api/v2/entries/form-id/entry-id
34 *
35 * @since 1.5.0
36 *
37 * @param WP_REST_Request $request
38 *
39 * @return Qcformbuilder_Forms_API_Error|Qcformbuilder_Forms_API_Response
40 */
41 public function get_item( WP_REST_Request $request ) {
42 try{
43 $this->form_object_factory( $request[ 'form_id' ], $request );
44 }catch ( Exception $e ){
45 return Qcformbuilder_Forms_API_Response_Factory::error_form_not_found();
46 }
47
48 $entry = new Qcformbuilder_Forms_Entry( $this->form->toArray(), $request[ 'entry_id' ] );
49
50 if( null == $entry->get_entry() ){
51 return Qcformbuilder_Forms_API_Response_Factory::error_entry_not_found();
52 }
53
54 $data = $this->add_entry_to_response( $entry, array() );
55 $data = $data[ $request[ 'entry_id' ] ];
56 return Qcformbuilder_Forms_API_Response_Factory::entry_data( $data, 1, 1 );
57
58 }
59
60 /**
61 * Get entries
62 *
63 * GET /wfb-api/v2/entries/form-id
64 *
65 * @since 1.5.0
66 *
67 * @param WP_REST_Request $request
68 *
69 * @return Qcformbuilder_Forms_API_Error|Qcformbuilder_Forms_API_Response
70 */
71 public function get_items( WP_REST_Request $request ) {
72 try{
73 $this->form_object_factory( $request[ 'form_id' ], $request );
74 }catch ( Exception $e ){
75 return Qcformbuilder_Forms_API_Response_Factory::error_form_not_found();
76 }
77
78 $per_page = $request[ 'per_page' ];
79 if( 0 == $request[ 'per_page' ] ){
80 $per_page = 1;
81 }
82
83 $entries = new Qcformbuilder_Forms_Entry_Entries( $this->form->toArray(), $per_page );
84 $data = $this->prepare_entries_for_response( $entries->get_page( $request[ 'page' ], $request[ 'status' ] ) );
85 $entries->get_page( $request[ 'page' ], $request[ 'status' ] );
86 $pages = ceil( $entries->get_total( $request[ 'status' ] ) / $per_page );
87
88 return Qcformbuilder_Forms_API_Response_Factory::entry_data(
89 $data,
90 count( $data ),
91 $pages
92 );
93 }
94
95 /**
96 * Delete an entry
97 *
98 * DELETE /wfb-api/v2/entries/form-id/entry-id
99 *
100 * @since 1.5.0
101 *
102 * @param WP_REST_Request $request
103 *
104 * @return Qcformbuilder_Forms_API_Error|Qcformbuilder_Forms_API_Response
105 */
106 public function delete_item( WP_REST_Request $request ) {
107 $form_id = $request[ 'form_id' ];
108 $form = Qcformbuilder_Forms_Forms::get_form( $form_id );
109 if( ! is_array( $form ) ){
110 return Qcformbuilder_Forms_API_Response_Factory::error_form_not_found();
111 }
112
113 $result = Qcformbuilder_Forms_Entry_Bulk::delete_entries( array( $request[ 'entry_id' ] ) );
114 if( $result ){
115 return new Qcformbuilder_Forms_API_Response( __( 'Entry Deleted', 'qcformbuilder-forms' ), 200, array() );
116 }else{
117 return new Qcformbuilder_Forms_API_Error( 'not-deleted', __( 'Entry Not Deleted', 'qcformbuilder-forms' ) );
118 }
119 }
120
121 /**
122 * Delete all entries of a form based on Form ID
123 *
124 * GET /wfb-api/v2/entries/form-id/delete
125 *
126 * @since 1.7.0
127 *
128 * @param WP_REST_Request $request
129 *
130 * @return Qcformbuilder_Forms_API_Error|Qcformbuilder_Forms_API_Response
131 */
132 public function delete_entries( WP_REST_Request $request ) {
133 $formID = sanitize_text_field( $request[ 'form_id' ] );
134
135 if( false === Qcformbuilder_Forms_Forms::is_internal_form( $formID ) ){
136 $data = array(
137 'deleted' => false,
138 'message' => __( 'Form not found', 'qcformbuilder-forms')
139 );
140 return new Qcformbuilder_Forms_API_Response( $data, 404, array() );
141 }
142
143 $entries = \qcformbuilderwp\QcformbuilderFormsQueries\QcformbuilderFormsQueries()->selectByFormId( $formID, false );
144
145 if( null != $entries ) {
146 $entryIds = [];
147 foreach( array_column( $entries, 'entry' ) as $entry ){
148 $entryIds[] = $entry->id;
149 }
150
151 Qcformbuilder_Forms_Entry_Bulk::delete_entries( $entryIds );
152 $data = array(
153 'deleted' => true,
154 'message' => __( 'Entries deleted', 'qcformbuilder-forms')
155 );
156 return new Qcformbuilder_Forms_API_Response( $data, 200, array() );
157
158 } else {
159 $data = array(
160 'deleted' => false,
161 'message' => __( 'No entries found', 'qcformbuilder-forms')
162 );
163 return new Qcformbuilder_Forms_API_Response( $data, 404, array() );
164 }
165
166 }
167
168
169 /**
170 * Prepare entry data for a response
171 *
172 * @since 1.5.0
173 *
174 * @param array $entries Array of found Qcformbuilder_Forms_Entry objects
175 *
176 * @return array
177 */
178 protected function prepare_entries_for_response( $entries ){
179 $response_data = array();
180
181 if ( ! empty( $entries ) ) {
182 /** @var Qcformbuilder_Forms_Entry $entry Entry Object */
183 foreach ($entries as $id => $entry) {
184 $response_data = $this->add_entry_to_response($entry, $response_data);
185
186 }
187 }
188
189 return $response_data;
190
191 }
192
193 /**
194 * Add an entry to a response collection
195 *
196 * @since 1.5.0
197 *
198 * @param Qcformbuilder_Forms_Entry $entry Entry object
199 * @param array $response_data Current response collection
200 *
201 * @return array
202 */
203 protected function add_entry_to_response( Qcformbuilder_Forms_Entry $entry, array $response_data ){
204 $id = $entry->get_entry_id();
205 $response_data[ $id ] = array();
206
207 $response_data[ $id ] = $entry->get_entry()->to_array( false );
208 $response_data[ $id ][ 'user' ] = array(
209 'id' => '',
210 'name' => '',
211 'email' => ''
212 );
213 $user = get_user_by( 'ID', $entry->get_entry()->user_id );
214
215 if( is_object( $user ) ){
216 $response_data[ $id ][ 'user' ][ 'name' ] = $user->display_name;
217 if( current_user_can( 'edit_users' ) ){
218 $response_data[ $id ][ 'user' ][ 'email' ] = $user->user_email;
219 $response_data[ $id ][ 'user' ][ 'id' ] = $entry->get_entry()->user_id;
220 }
221 }
222
223 unset( $response_data[ $id ][ 'user_id' ] );
224
225 $fields = $entry->get_fields();
226 $response_data[ $id ][ 'fields' ] = array();
227 if( ! empty( $fields ) ){
228 /** @var Qcformbuilder_Forms_Entry_Field $field */
229 foreach( $fields as $field ){
230 if ( $this->form->is_api_field( $field->field_id ) && is_object( $field ) ) {
231 $response_data[ $id ][ 'fields' ][ $field->field_id ] = $field->to_array( false );
232 }
233 }
234
235 }
236
237 $metas = $entry->get_meta();
238 $response_data[ $id ][ 'meta' ] = array();
239 if( ! empty( $metas ) ){
240 /** @var Qcformbuilder_Forms_Entry_Meta $meta */
241 foreach ( $metas as $meta ){
242 if( is_object( $meta ) ){
243 $response_data[ $id ][ 'meta' ][ $meta->id ] = $meta->to_array( false );
244 }
245
246 }
247
248 }
249
250
251 /**
252 * Modify response data for entry returned via REST API
253 *
254 * @since 1.8.0
255 *
256 * @param array $data Data to be returned for entry
257 * @param Qcformbuilder_Forms_Entry $entry Entry data
258 */
259 $response_data[ $id ] = apply_filters( 'qcformbuilder_forms_api_entry_data', $response_data[ $id ], $entry );
260 return $response_data;
261 }
262
263 /**
264 * Permissions for entry read
265 *
266 * @since 1.5.0
267 *
268 * @param WP_REST_Request $request
269 *
270 * @return bool
271 */
272 public function get_items_permissions_check( WP_REST_Request $request ){
273 $form_id = $request[ 'form_id' ];
274 $allowed = current_user_can( Qcformbuilder_Forms::get_manage_cap( 'entry-view' ), $form_id );
275
276 if( ! $allowed ){
277 $allowed = Qcformbuilder_Forms_API_Util::check_api_token( $request );
278 }
279
280 /**
281 * Filter permissions for viewing entries via Qcformbuilder Forms REST API
282 *
283 * @since 1.5.0
284 *
285 * @param bool $allowed Is request authorized?
286 * @param string $form_id The form ID
287 * @param WP_REST_Request $request The current request
288 */
289 return apply_filters( 'qcformbuilder_forms_api_allow_entry_view', $allowed, $form_id, $request );
290
291 }
292
293 /**
294 * Permissions for entry create/update/delete
295 *
296 * @since 1.5.0
297 *
298 * @param WP_REST_Request $request
299 *
300 * @return bool
301 */
302 public function create_item_permissions_check( WP_REST_Request $request ){
303 $allowed = current_user_can( Qcformbuilder_Forms::get_manage_cap( 'entry-edit' ), $request[ 'form_id' ] );
304
305 /**
306 * Filter permissions for creating, updating or deleting entries via Qcformbuilder Forms REST API
307 *
308 * @since 1.5.0
309 *
310 * @param bool $allowed Is request authorized?
311 * @param string $form_id The form ID
312 * @param WP_REST_Request $request The current request
313 */
314 return apply_filters( 'qcformbuilder_forms_api_allow_entry_edit', $allowed, $request[ 'form_id' ], $request );
315
316 }
317
318 /**
319 * @inheritdoc
320 *
321 * @since 1.5.0
322 */
323 public function get_items_args() {
324 return wp_parse_args( array(
325 'status' => array(
326 'default' => 'active',
327 'validate_callback' => array( $this, 'validate_status' )
328 )
329 ), parent::get_items_args() );
330 }
331
332 /**
333 * Form the endpoint URL that deos not include item ID
334 *
335 * Used by for get_items() and create_items()
336 *
337 * @since 1.5.0
338 *
339 * @return string
340 */
341 protected function non_id_endpoint_url() {
342 return '/' . $this->route_base() . '/(?P<form_id>[\w-]+)';
343
344 }
345
346 /**
347 * @inheritdoc
348 *
349 * @since 1.5.0
350 */
351 public function request_args() {
352 return array(
353 );
354 }
355
356 /**
357 * Form the endpoint URL that includes item ID
358 *
359 * Used by for get_item() and update_time() and delete_item()
360 *
361 * @since 1.5.0
362 *
363 * @return string
364 */
365 public function id_endpoint_url() {
366 return $this->non_id_endpoint_url() . '/' . '(?P<entry_id>[\d]+)';
367 }
368
369 /**
370 * @inheritdoc
371 *
372 * @since 1.5.0
373 */
374 protected function route_base(){
375 return 'entries';
376 }
377
378 /**
379 * Validate status argument
380 *
381 * @since 1.5.0
382 *
383 * @param $value
384 *
385 * @return bool
386 */
387 public function validate_status( $value ){
388 return in_array( $value, array(
389 'active',
390 'pending',
391 'trash'
392 ));
393
394 }
395
396 }
397