196 lines
5.7 KiB
PHP
196 lines
5.7 KiB
PHP
<?php
|
|
|
|
if ( ! class_exists( 'WC_Connect_Service_Schemas_Validator' ) ) {
|
|
|
|
class WC_Connect_Service_Schemas_Validator {
|
|
|
|
/**
|
|
* Validates the overall passed services object (all service types and all services therein)
|
|
*
|
|
* @param object $services
|
|
*
|
|
* @return WP_Error|true
|
|
*/
|
|
public function validate_service_schemas( $service_schemas ) {
|
|
|
|
if ( ! is_object( $service_schemas ) ) {
|
|
return new WP_Error(
|
|
'outermost_container_not_object',
|
|
'Malformed service schemas. Outermost container is not an object.'
|
|
);
|
|
}
|
|
|
|
if ( ! isset( $service_schemas->shipping ) || ! is_array( $service_schemas->shipping ) ) {
|
|
return new WP_Error(
|
|
'service_type_not_ref_array',
|
|
'Malformed service schemas. \'shipping\' does not reference an array.'
|
|
);
|
|
}
|
|
|
|
$service_counter = 0;
|
|
foreach ( $service_schemas->shipping as $service_schema ) {
|
|
if ( ! is_object( $service_schema ) ) {
|
|
return new WP_Error(
|
|
'service_not_ref_object',
|
|
sprintf(
|
|
'Malformed service schema. Service type \'shipping\' [%d] does not reference an object.',
|
|
$service_counter
|
|
)
|
|
);
|
|
}
|
|
|
|
$result = $this->validate_service_schema( 'shipping', $service_counter, $service_schema );
|
|
if ( is_wp_error( $result ) ) {
|
|
return $result;
|
|
}
|
|
|
|
$service_counter ++;
|
|
}
|
|
|
|
if ( ! isset( $service_schemas->boxes ) || ! is_object( $service_schemas->boxes ) ) {
|
|
return new WP_Error(
|
|
'boxes_not_object',
|
|
'Malformed service schemas. \'boxes\' is not an object.'
|
|
);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Validates a particular service schema, especially the parts of the service that WC relies
|
|
* on like id, method_title, method_description, etc
|
|
*
|
|
* @param string $service_type
|
|
* @param integer $service_counter
|
|
* @param object $service
|
|
*
|
|
* @return WP_Error|true
|
|
*/
|
|
protected function validate_service_schema( $service_type, $service_counter, $service_schema ) {
|
|
$required_properties = array(
|
|
'id' => 'string',
|
|
'method_description' => 'string',
|
|
'method_title' => 'string',
|
|
'service_settings' => 'object',
|
|
'form_layout' => 'array',
|
|
);
|
|
|
|
foreach ( $required_properties as $required_property => $required_property_type ) {
|
|
if ( ! property_exists( $service_schema, $required_property ) ) {
|
|
return new WP_Error(
|
|
'required_service_property_missing',
|
|
sprintf(
|
|
'Malformed service schema. Service type \'%s\' [%d] does not include a required \'%s\' property.',
|
|
$service_type,
|
|
$service_counter,
|
|
$required_property
|
|
)
|
|
);
|
|
}
|
|
|
|
$property_type = gettype( $service_schema->$required_property );
|
|
if ( $required_property_type !== $property_type ) {
|
|
return new WP_Error(
|
|
'required_service_property_wrong_type',
|
|
sprintf(
|
|
'Malformed service schema. Service type \'%s\' [%d] property \'%s\' is a %s. Was expecting a %s.',
|
|
$service_type,
|
|
$service_counter,
|
|
$service_schema->$required_property,
|
|
$property_type,
|
|
$required_property_type
|
|
)
|
|
);
|
|
}
|
|
}
|
|
|
|
return $this->validate_service_schema_settings( $service_schema->id, $service_schema->service_settings );
|
|
}
|
|
|
|
/**
|
|
* Validates a particular service's service settings schema, especially the parts of the
|
|
* service settings that WC relies on like type, required and properties
|
|
*
|
|
* @param string $service_id
|
|
* @param object $service_settings
|
|
*
|
|
* @return WP_Error|true
|
|
*/
|
|
protected function validate_service_schema_settings( $service_id, $service_settings ) {
|
|
$required_properties = array(
|
|
'type' => 'string',
|
|
'required' => 'array',
|
|
'properties' => 'object',
|
|
);
|
|
|
|
foreach ( $required_properties as $required_property => $required_property_type ) {
|
|
if ( ! property_exists( $service_settings, $required_property ) ) {
|
|
return new WP_Error(
|
|
'service_settings_missing_required_property',
|
|
sprintf(
|
|
'The settings part of a service schema is malformed. Service \'%s\' service_settings do not include a required \'%s\' property.',
|
|
$service_id,
|
|
$required_property
|
|
)
|
|
);
|
|
}
|
|
|
|
$property_type = gettype( $service_settings->$required_property );
|
|
if ( $required_property_type !== $property_type ) {
|
|
return new WP_Error(
|
|
'service_settings_property_wrong_type',
|
|
sprintf(
|
|
"The settings part of a service schema is malformed. Service '%s' service_setting property '%s' is a %s. Was expecting a %s.",
|
|
$service_id,
|
|
$required_property,
|
|
$property_type,
|
|
$required_property_type
|
|
)
|
|
);
|
|
}
|
|
}
|
|
|
|
$result = $this->validate_service_settings_required_properties( $service_id, $service_settings->properties );
|
|
if ( is_wp_error( $result ) ) {
|
|
return $result;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
|
|
/**
|
|
* Validates a particular service's schema's required properties, especially the parts of the
|
|
* properties that WC relies on and title
|
|
*
|
|
* @param string $service_id
|
|
* @param object $service_settings_properties
|
|
*
|
|
* @return WP_Error|true
|
|
*/
|
|
protected function validate_service_settings_required_properties( $service_id, $service_settings_properties ) {
|
|
$required_properties = array(
|
|
'title',
|
|
);
|
|
|
|
foreach ( $required_properties as $required_property ) {
|
|
if ( ! property_exists( $service_settings_properties, $required_property ) ) {
|
|
return new WP_Error(
|
|
'service_properties_missing_required_property',
|
|
sprintf(
|
|
"The properties part of a service schema is malformed. Service '%s' service_settings properties do not include a required '%s' property.",
|
|
$service_id,
|
|
$required_property
|
|
)
|
|
);
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
}
|
|
|
|
}
|