<?php if ( ! defined( 'ABSPATH' ) ) { exit; } if ( class_exists( 'WC_REST_Connect_Services_Controller' ) ) { return; } class WC_REST_Connect_Services_Controller extends WC_REST_Connect_Base_Controller { protected $rest_base = 'connect/services/(?P<id>[a-z_]+)\/(?P<instance>[\d]+)'; /** * @var WC_Connect_Service_Schemas_Store */ protected $service_schemas_store; public function __construct( WC_Connect_API_Client $api_client, WC_Connect_Service_Settings_Store $settings_store, WC_Connect_Logger $logger, WC_Connect_Service_Schemas_Store $schemas_store ) { parent::__construct( $api_client, $settings_store, $logger ); $this->service_schemas_store = $schemas_store; } public function get( $request ) { $method_id = $request['id']; $instance_id = isset( $request['instance'] ) ? $request['instance'] : false; $service_schema = $this->service_schemas_store->get_service_schema_by_id_or_instance_id( $instance_id ? $instance_id : $method_id ); if ( ! $service_schema ) { return new WP_Error( 'schemas_not_found', __( 'Service schemas were not loaded', 'woocommerce-services' ), array( 'status' => 500 ) ); } $payload = apply_filters( 'wc_connect_shipping_service_settings', array( 'success' => true, ), $method_id, $instance_id ); return new WP_REST_Response( $payload, 200 ); } /** * Attempts to update the settings on a particular service and instance */ public function post( $request ) { $request_params = $request->get_params(); $id = array_key_exists( 'id', $request_params ) ? $request_params['id'] : ''; $instance = array_key_exists( 'instance', $request_params ) ? absint( $request_params['instance'] ) : false; if ( empty( $id ) ) { $error = new WP_Error( 'service_id_missing', __( 'Unable to update service settings. Form data is missing service ID.', 'woocommerce-services' ), array( 'status' => 400 ) ); $this->logger->log( $error, __CLASS__ ); return $error; } $settings = (object) $request->get_json_params(); if ( empty( $settings ) ) { $error = new WP_Error( 'bad_form_data', __( 'Unable to update service settings. The form data could not be read.', 'woocommerce-services' ), array( 'status' => 400 ) ); $this->logger->log( $error, __CLASS__ ); return $error; } $validation_result = $this->settings_store->validate_and_possibly_update_settings( $settings, $id, $instance ); if ( is_wp_error( $validation_result ) ) { $error = new WP_Error( 'validation_failed', sprintf( __( 'Unable to update service settings. Validation failed. %s', 'woocommerce-services' ), $validation_result->get_error_message() ), array( 'status' => 400 ) ); $this->logger->log( $error, __CLASS__ ); return $error; } return new WP_REST_Response( array( 'success' => true ), 200 ); } }