/wp-content/plugins/woocommerce-services/classes/class-wc-connect-service-schemas-store.php
https://gitlab.com/remyvianne/krowkaramel · PHP · 266 lines · 161 code · 49 blank · 56 comment · 28 complexity · 9391353097845e03b1e145aa5139564f MD5 · raw file
- <?php
- if ( ! class_exists( 'WC_Connect_Service_Schemas_Store' ) ) {
- class WC_Connect_Service_Schemas_Store {
- /**
- * @var WC_Connect_API_Client
- */
- protected $api_client;
- /**
- * @var WC_Connect_Logger
- */
- protected $logger;
- public function __construct( WC_Connect_API_Client $api_client, WC_Connect_Logger $logger ) {
- $this->api_client = $api_client;
- $this->logger = $logger;
- }
- public function fetch_service_schemas_from_connect_server() {
- $response_body = $this->api_client->get_service_schemas();
- if ( is_wp_error( $response_body ) ) {
- $error_data = $response_body->get_error_data();
- if ( isset( $error_data['response_status_code'] ) ) {
- $this->update_last_fetch_result_code( $error_data['response_status_code'] );
- }
- $this->logger->log( $response_body, __FUNCTION__ );
- return false;
- }
- $this->update_last_fetch_result_code( '200' );
- $this->logger->log( 'Successfully loaded service schemas from server response.', __FUNCTION__ );
- $this->update_last_fetch_timestamp();
- $this->maybe_update_heartbeat();
- $old_schemas = $this->get_service_schemas();
- if ( $old_schemas == $response_body ) {
- // schemas weren't changed, but were fetched without problems
- return true;
- }
- // If we made it this far, it is safe to store the object
- return $this->update_service_schemas( $response_body );
- }
- public function get_service_schemas() {
- return WC_Connect_Options::get_option( 'services', null );
- }
- protected function update_service_schemas( $service_schemas ) {
- return WC_Connect_Options::update_option( 'services', $service_schemas );
- }
- public function get_last_fetch_timestamp() {
- return WC_Connect_Options::get_option( 'services_last_update', null );
- }
- protected function update_last_fetch_timestamp() {
- WC_Connect_Options::update_option( 'services_last_update', time() );
- }
- public function get_last_fetch_result_code() {
- return WC_Connect_Options::get_option( 'services_last_result_code' );
- }
- /**
- * @param int $result_status_code
- */
- protected function update_last_fetch_result_code( $result_status_code ) {
- WC_Connect_Options::update_option( 'services_last_result_code', $result_status_code );
- }
- protected function maybe_update_heartbeat() {
- $last_heartbeat = WC_Connect_Options::get_option( 'last_heartbeat' );
- $now = time();
- if ( ! $last_heartbeat ) {
- $should_update = true;
- } else {
- $last_heartbeat = absint( $last_heartbeat );
- if ( $last_heartbeat > $now ) {
- // last heartbeat in the future? wacky
- $should_update = true;
- } else {
- $elapsed = $now - $last_heartbeat;
- $should_update = $elapsed > DAY_IN_SECONDS;
- }
- }
- if ( $should_update ) {
- WC_Connect_Options::update_option( 'last_heartbeat', $now );
- }
- }
- /**
- * Returns all service ids of a specific type (e.g. shipping)
- *
- * @param string $type The type of services to return
- *
- * @return array An array of that type's service ids, or an empty array if no such type is known
- */
- public function get_all_service_ids_of_type( $type ) {
- if ( empty( $type ) ) {
- return array();
- }
- $service_schemas = $this->get_service_schemas();
- if ( ! is_object( $service_schemas ) || ! property_exists( $service_schemas, $type ) || ! is_array( $service_schemas->$type ) ) {
- return array();
- }
- $service_schema_ids = array();
- foreach ( $service_schemas->$type as $service_schema ) {
- $service_schema_ids[] = $service_schema->id;
- }
- return $service_schema_ids;
- }
- /**
- * Returns all shipping method ids
- *
- * @return array|bool An array of supported shipping method ids or false if schema does not support method_id
- */
- public function get_all_shipping_method_ids() {
- $shipping_method_ids = array();
- $service_schemas = $this->get_service_schemas();
- if ( ! is_object( $service_schemas ) || ! property_exists( $service_schemas, 'shipping' ) || ! is_array( $service_schemas->shipping ) ) {
- return $shipping_method_ids;
- }
- foreach ( $service_schemas->shipping as $service_schema ) {
- if ( ! property_exists( $service_schema, 'method_id' ) ) {
- continue;
- }
- $shipping_method_ids[] = $service_schema->method_id;
- }
- return $shipping_method_ids;
- }
- /**
- * Returns a particular service's schema given its id
- *
- * @param string $service_id The service id for which to return the schema
- *
- * @return object|null The service schema or null if no such id was found
- */
- public function get_service_schema_by_id( $service_id ) {
- $service_schemas = $this->get_service_schemas();
- if ( ! is_object( $service_schemas ) ) {
- return null;
- }
- foreach ( $service_schemas as $service_type => $service_type_service_schemas ) {
- $matches = wp_filter_object_list( $service_type_service_schemas, array( 'id' => $service_id ) );
- if ( $matches ) {
- return array_shift( $matches );
- }
- }
- return null;
- }
- /**
- * Returns a particular service's schema given its method_id
- *
- * @param $method_id
- *
- * @return object|null The service schema or null if no such id was found
- */
- public function get_service_schema_by_method_id( $method_id ) {
- $service_schemas = $this->get_service_schemas();
- if ( ! is_object( $service_schemas ) ) {
- return null;
- }
- foreach ( $service_schemas as $service_type => $service_type_service_schemas ) {
- $matches = wp_filter_object_list( $service_type_service_schemas, array( 'method_id' => $method_id ) );
- if ( $matches ) {
- return array_shift( $matches );
- }
- }
- return null;
- }
- /**
- * Returns a service's schema given its shipping zone instance
- *
- * @param string $instance_id The shipping zone instance id for which to return the schema
- *
- * @return object|null The service schema or null if no such instance was found
- */
- public function get_service_schema_by_instance_id( $instance_id ) {
- global $wpdb;
- $method_id = $wpdb->get_var(
- $wpdb->prepare(
- "SELECT method_id FROM {$wpdb->prefix}woocommerce_shipping_zone_methods WHERE instance_id = %d;",
- $instance_id
- )
- );
- return $this->get_service_schema_by_method_id( $method_id );
- }
- /**
- * Returns a service's schema given an id or shipping zone instance.
- *
- * @param string $id_or_instance_id String ID or numeric instance ID.
- * @return object|null Service schema on success, null on failure
- */
- public function get_service_schema_by_id_or_instance_id( $id_or_instance_id ) {
- if ( is_numeric( $id_or_instance_id ) ) {
- return $this->get_service_schema_by_instance_id( $id_or_instance_id );
- }
- if ( ! empty( $id_or_instance_id ) ) {
- return $this->get_service_schema_by_method_id( $id_or_instance_id );
- }
- return null;
- }
- /**
- * Returns packages schema
- *
- * @return object|null Packages schema on success, null on failure
- */
- public function get_packages_schema() {
- $service_schemas = $this->get_service_schemas();
- if ( ! is_object( $service_schemas ) || ! property_exists( $service_schemas, 'boxes' ) ) {
- return null;
- }
- return $service_schemas->boxes;
- }
- public function get_predefined_packages_schema() {
- $service_schemas = $this->get_service_schemas();
- if ( ! is_object( $service_schemas ) ) {
- return null;
- }
- $predefined_packages = array();
- foreach ( $service_schemas->shipping as $service_schema ) {
- if ( ! isset( $service_schema->packages ) ) {
- continue;
- }
- $predefined_packages[ $service_schema->id ] = $service_schema->packages;
- }
- return $predefined_packages;
- }
- }
- }