automatewoo/includes/Rest_Api/Controllers/Workflows.php
fei-source 47d3c9a8b6 Update to v6.2.2
Source: GrootMade/Festinger Vault
2026-03-15 08:31:15 +08:00

335 lines
9.5 KiB
PHP

<?php
namespace AutomateWoo\Rest_Api\Controllers;
use AutomateWoo\Format;
use AutomateWoo\Permissions;
use AutomateWoo\Rest_Api\Schema\WorkflowSchema;
use AutomateWoo\Rest_Api\Utilities\CreateUpdateWorkflow;
use AutomateWoo\Rest_Api\Utilities\DeleteWorkflow;
use AutomateWoo\Rest_Api\Utilities\GetWorkflow;
use AutomateWoo\Rest_Api\Utilities\Pagination;
use AutomateWoo\Rest_Api\Utilities\RestException;
use AutomateWoo\Workflow;
use AutomateWoo\Workflows as WorkflowsHelper;
use AutomateWoo\Workflow_Query;
use WP_Error;
use WP_REST_Request;
use WP_REST_Response;
use WP_REST_Server;
defined( 'ABSPATH' ) || exit;
/**
* Workflows Rest API controller.
*
* @since 4.9.0
*/
class Workflows extends AbstractController {
use WorkflowSchema;
use CreateUpdateWorkflow;
use DeleteWorkflow;
use GetWorkflow;
/**
* Route base.
*
* @var string
*/
protected $rest_base = 'workflows';
/**
* Register the routes.
*/
public function register_routes() {
register_rest_route(
$this->namespace,
"/{$this->rest_base}",
[
[
'methods' => WP_REST_Server::READABLE,
'callback' => [ $this, 'get_items' ],
'permission_callback' => [ Permissions::class, 'can_manage' ],
'args' => $this->get_collection_params(),
],
[
'methods' => WP_REST_Server::CREATABLE,
'callback' => [ $this, 'create_item' ],
'permission_callback' => [ Permissions::class, 'can_manage' ],
'args' => $this->get_properties_schema(),
],
'schema' => [ $this, 'get_public_item_schema' ],
]
);
register_rest_route(
$this->namespace,
"/{$this->rest_base}/(?P<id>[\d]+)",
[
'args' => [
'id' => [
'description' => __( 'Unique identifier for the workflow.', 'automatewoo' ),
'type' => 'integer',
],
],
[
'methods' => WP_REST_Server::READABLE,
'callback' => [ $this, 'get_item' ],
'permission_callback' => [ Permissions::class, 'can_manage' ],
],
[
'methods' => WP_REST_Server::EDITABLE,
'callback' => [ $this, 'update_item' ],
'permission_callback' => [ Permissions::class, 'can_manage' ],
'args' => $this->get_update_parameters_schema(),
],
[
'methods' => WP_REST_Server::DELETABLE,
'callback' => [ $this, 'delete_item' ],
'permission_callback' => [ Permissions::class, 'can_manage' ],
'args' => $this->get_delete_parameters_schema(),
],
'schema' => [ $this, 'get_public_item_schema' ],
]
);
}
/**
* Retrieves a collection workflows.
*
* @param WP_REST_Request $request
*
* @return WP_Error|WP_REST_Response
*/
public function get_items( $request ) {
$query = new Workflow_Query();
$query->set_no_found_rows( false );
$query->set_limit( $request->get_param( 'per_page' ) );
$query->set_page( $request->get_param( 'page' ) );
$query->set_status( $request->get_param( 'status' ) ?: 'any' );
$query->set_trigger( $request->get_param( 'trigger' ) );
if ( $request->has_param( 'type' ) ) {
$query->set_type( $request->get_param( 'type' ) );
}
if ( $request->has_param( 'search' ) ) {
$query->set_search( $request->get_param( 'search' ) );
}
if ( $request->has_param( 'include' ) ) {
$query->set_include( $request->get_param( 'include' ) );
}
$items = $query->get_results();
$data = [];
foreach ( $items as $item ) {
$item_data = $this->prepare_item_for_response( $item, $request );
$data[] = $this->prepare_response_for_collection( $item_data );
}
$response = new WP_REST_Response( $data );
$response = ( new Pagination( $request, $response, $query->get_found_rows() ) )->add_headers();
return $response;
}
/**
* Retrieves a single Workflow item.
*
* @param WP_REST_Request $request Full request object.
*
* @return WP_Error|WP_REST_Response Response object on success, or WP_Error object on failure.
*/
public function get_item( $request ) {
try {
$workflow = $this->get_workflow( $request['id'] );
} catch ( RestException $e ) {
return $e->get_wp_error();
}
return rest_ensure_response( $this->prepare_item_for_response( $workflow, $request ) );
}
/**
* Retrieves the query params for the collections.
*
* @return array
*/
public function get_collection_params() {
$params = parent::get_collection_params();
$params['context']['default'] = 'view';
$params['status'] = [
'description' => __( 'Limit results by status.', 'automatewoo' ),
'type' => 'string',
'validate_callback' => 'rest_validate_request_arg',
'enum' => [ 'active', 'disabled' ],
];
$params['type'] = [
'description' => __( 'Limit results by type.', 'automatewoo' ),
'type' => 'string',
'validate_callback' => 'rest_validate_request_arg',
'enum' => array_keys( WorkflowsHelper::get_types() ),
];
$params['trigger'] = [
'description' => __( 'Limit results by one or more triggers.', 'automatewoo' ),
'type' => 'array',
'items' => [
'type' => 'string',
],
'default' => [],
'sanitize_callback' => 'wp_parse_slug_list',
];
return $params;
}
/**
* Creates a single Workflow item.
*
* @since 6.0.10
*
* @param WP_REST_Request $request Full request object.
*
* @return WP_Error|WP_REST_Response Response object on success, or WP_Error object on failure.
*/
public function create_item( $request ) {
try {
$workflow = $this->create_workflow( $request );
} catch ( RestException $e ) {
return $e->get_wp_error();
}
return rest_ensure_response( $this->prepare_item_for_response( $workflow, $request ) );
}
/**
* Updates a single Workflow item.
*
* @since 6.0.10
*
* @param WP_REST_Request $request Full request object.
*
* @return WP_Error|WP_REST_Response Response object on success, or WP_Error object on failure.
*/
public function update_item( $request ) {
try {
$workflow = $this->update_workflow( $request );
} catch ( RestException $e ) {
return $e->get_wp_error();
}
return rest_ensure_response( $this->prepare_item_for_response( $workflow, $request ) );
}
/**
* Deletes a single Workflow item (moves to trash if available).
*
* @since 6.0.10
*
* @param WP_REST_Request $request Full request object.
*
* @return WP_Error|WP_REST_Response Response object on success, or WP_Error object on failure.
*/
public function delete_item( $request ) {
try {
$id = (int) $request['id'];
$force = boolval( $request['force'] );
$workflow = $this->delete_workflow( $id, $force );
} catch ( RestException $e ) {
return $e->get_wp_error();
}
// If force deleted return a simple response as the full workflow data is no longer available.
if ( 'deleted' === $workflow->get_status() ) {
return rest_ensure_response(
[
'id' => $workflow->get_id(),
'status' => $workflow->get_status(),
]
);
}
return rest_ensure_response( $this->prepare_item_for_response( $workflow, $request ) );
}
/**
* Prepare the workflow for the REST response.
*
* @param Workflow $workflow
* @param WP_REST_Request $request
*
* @return WP_REST_Response|mixed
*/
public function prepare_item_for_response( $workflow, $request ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed
$data = [
'id' => $workflow->get_id(),
'title' => $workflow->get_title(),
'status' => $workflow->get_status(),
'type' => $workflow->get_type(),
'trigger' => [
'name' => $workflow->get_trigger_name(),
'options' => $workflow->get_trigger_options(),
],
'rules' => $workflow->get_rule_data(),
'actions' => array_values( $workflow->get_actions_data() ),
'timing' => $this->prepare_timing_for_response( $workflow ),
'is_transactional' => $workflow->is_transactional(),
'is_tracking_enabled' => $workflow->is_tracking_enabled(),
'is_conversion_tracking_enabled' => $workflow->is_conversion_tracking_enabled(),
'google_analytics_link_tracking' => $workflow->get_ga_tracking_params(),
'workflow_order' => $workflow->get_order(),
];
return rest_ensure_response( $data );
}
/**
* Prepare the workflow timing for the REST response.
*
* @param Workflow $workflow
*
* @return array
*/
protected function prepare_timing_for_response( $workflow ) {
$data = [
'type' => $workflow->get_timing_type(),
];
switch ( $workflow->get_timing_type() ) {
case 'delayed':
$data['delay'] = [
'unit' => $workflow->get_timing_delay_unit(),
'value' => $workflow->get_timing_delay_number(),
];
break;
case 'scheduled':
$data['scheduled'] = [
'time_of_day' => $workflow->get_scheduled_time(),
'days' => array_map( Format::class . '::api_weekday', $workflow->get_scheduled_days() ),
];
if ( $workflow->get_timing_delay_number() ) {
$data['delay'] = [
'unit' => $workflow->get_timing_delay_unit(),
'value' => $workflow->get_timing_delay_number(),
];
}
break;
case 'fixed':
$data['datetime'] = Format::api_datetime( $workflow->get_fixed_time() );
break;
case 'datetime':
$data['variable'] = $workflow->get_option( 'queue_datetime', false );
break;
}
return $data;
}
}