Files
2018-06-28 10:02:07 +02:00

252 lines
7.4 KiB
PHP

<?php
/**
* Gravity Flow Web API
*
* @package GravityFlow
* @subpackage Classes/Gravity_Flow_Web_API
* @copyright Copyright (c) 2015-2018, Steven Henty S.L.
* @license http://opensource.org/licenses/gpl-2.0.php GNU Public Licenses
*/
if ( ! class_exists( 'GFForms' ) ) {
die();
}
/**
* Class Gravity_Flow_Web_API
*
* @copyright Copyright (c) 2015-2018, Steven Henty S.L.
* @license http://opensource.org/licenses/gpl-2.0.php GNU Public License
*/
class Gravity_Flow_Web_API {
/**
* Gravity_Flow_Web_API constructor.
*/
public function __construct() {
add_action( 'gform_webapi_get_entries_assignees', array( $this, 'get_entries_assignees' ), 10, 2 );
add_action( 'gform_webapi_post_entries_assignees', array( $this, 'post_entries_assignees' ), 10, 2 );
add_action( 'gform_webapi_get_forms_steps', array( $this, 'get_forms_steps' ) );
add_action( 'gform_webapi_get_entries_steps', array( $this, 'get_entries_steps' ) );
}
/**
* Gets the steps for the specified entry.
*
* @param int $entry_id The entry ID.
*/
public function get_entries_steps( $entry_id ) {
$capability = apply_filters( 'gravityflow_web_api_capability_get_entries_steps', 'gravityflow_create_steps' );
$this->authorize( $capability );
$entry = GFAPI::get_entry( $entry_id );
$form_id = absint( $entry['form_id'] );
$api = new Gravity_Flow_API( $form_id );
$form_steps = $api->get_steps();
$current_step = $api->get_current_step( $entry );
$current_step_id = $current_step ? $current_step->get_id() : -1;
$response = array();
foreach ( $form_steps as $form_step ) {
$step = $api->get_step( $form_step->get_id(), $entry );
$is_current_step = ( $current_step_id == $step->get_id() );
$response[] = array(
'id' => $step->get_id(),
'type' => $step->get_type(),
'label' => $step->get_label(),
'name' => $step->get_name(),
'is_current_step' => $is_current_step,
'is_active' => $step->is_active(),
'supports_expiration' => $step->supports_expiration(),
'assignees' => $this->get_assignees_array( $step ),
'settings' => $step->get_feed_meta(),
'status' => $is_current_step ? $step->evaluate_status() : rgar( $entry, 'workflow_step_status_' . $step->get_id() ),
'expiration_timestamp' => $step->get_expiration_timestamp(),
'is_expired' => $step->is_expired(),
'is_queued' => $step->is_queued(),
'entry_count' => $step->entry_count(),
);
}
$this->end( 200, $response );
}
/**
* Gets the steps for the specified form.
*
* @param int $form_id The form ID.
*/
public function get_forms_steps( $form_id ) {
$capability = apply_filters( 'gravityflow_web_api_capability_get_forms_steps', 'gravityflow_create_steps' );
$this->authorize( $capability );
$api = new Gravity_Flow_API( $form_id );
$steps = $api->get_steps();
$response = array();
foreach ( $steps as $step ) {
$response[] = array(
'id' => $step->get_id(),
'type' => $step->get_type(),
'label' => $step->get_label(),
'name' => $step->get_name(),
'is_active' => $step->is_active(),
'entry_count' => $step->entry_count(),
'supports_expiration' => $step->supports_expiration(),
'assignees' => $this->get_assignees_array( $step ),
'settings' => $step->get_feed_meta(),
);
}
$this->end( 200, $response );
}
/**
* Gets the assignee(s) for the specified entry.
*
* @param int $entry_id The entry ID.
* @param null|string $assignee_key The assignee key or null.
*/
public function get_entries_assignees( $entry_id, $assignee_key = null ) {
$capability = apply_filters( 'gravityflow_web_api_capability_get_entries_assignees', 'gravityflow_create_steps' );
$this->authorize( $capability );
$entry = GFAPI::get_entry( $entry_id );
$form_id = absint( $entry['form_id'] );
$api = new Gravity_Flow_API( $form_id );
$step = $api->get_current_step( $entry );
if ( empty( $assignee_key ) ) {
$response = $this->get_assignees_array( $step );
} else {
$assignee = Gravity_Flow_Assignees::create( $assignee_key, $step );
$response = $this->get_assignee_array( $assignee );
}
$this->end( 200, $response );
}
/**
* Processes a status update for a specified assignee of the current step of the specified entry.
*
* @param int $entry_id The entry ID.
* @param null|string $assignee_key The assignee key or null.
*/
public function post_entries_assignees( $entry_id, $assignee_key = null ) {
global $HTTP_RAW_POST_DATA;
$capability = apply_filters( 'gravityflow_web_api_capability_post_entries_assignees', 'gravityflow_create_steps' );
$this->authorize( $capability );
$assignee_key = urldecode( $assignee_key );
if ( empty( $assignee_key ) ) {
$this->end( 400, 'Bad request' );
}
$entry = GFAPI::get_entry( $entry_id );
if ( empty( $entry ) ) {
$this->end( 404, 'Entry not found' );
}
$form_id = absint( $entry['form_id'] );
$api = new Gravity_Flow_API( $form_id );
$step = $api->get_current_step( $entry );
$assignee = Gravity_Flow_Assignees::create( $assignee_key, $step );
if ( ! isset( $HTTP_RAW_POST_DATA ) ) {
$HTTP_RAW_POST_DATA = file_get_contents( 'php://input' );
}
$data = json_decode( $HTTP_RAW_POST_DATA, true );
$new_status = $data['status'];
$form = GFAPI::get_form( $form_id );
$step->process_assignee_status( $assignee, $new_status, $form );
$api->process_workflow( $entry_id );
$response = 'Status updated successfully';
$this->end( 200, $response );
}
/**
* Gets the assignees for the supplied step.
*
* @param Gravity_Flow_Step|bool $step The current step.
*
* @return array
*/
public function get_assignees_array( $step ) {
$assignees = $step && $step instanceof Gravity_Flow_Step ? $step->get_assignees() : array();
$response = array();
foreach ( $assignees as $assignee ) {
$response[] = $this->get_assignee_array( $assignee );
}
return $response;
}
/**
* Get an array of properties for the supplied assignee object.
*
* @param Gravity_Flow_Assignee $assignee The assignee.
*
* @return array
*/
public function get_assignee_array( $assignee ) {
return array(
'key' => $assignee->get_key(),
'id' => $assignee->get_id(),
'type' => $assignee->get_type(),
'display_name' => $assignee->get_display_name(),
'status' => $assignee->get_status(),
);
}
/**
* Completes the request by having the Gravity Forms Web API output the specified status code and response.
*
* @param int $status The status code.
* @param array|string $response The response.
*/
public function end( $status, $response ) {
GFWebAPI::end( $status, $response );
}
/**
* Validates if the user has the capabilities required to perform the current request.
*
* @param array $caps The capabilities required for the current request.
*
* @return bool
*/
public function authorize( $caps = array() ) {
if ( GFCommon::current_user_can_any( $caps ) ) {
return true;
}
$this->die_forbidden();
}
/**
* End the request with a 403 error.
*/
public function die_forbidden() {
$this->end( 403, __( 'Forbidden', 'gravityflow' ) );
}
}
new Gravity_Flow_Web_API();