Files
medicalalert-web-reloaded/wp/wp-content/plugins/woocommerce-smart-coupons/includes/class-wc-sc-rest-coupons-controller.php
2024-06-17 16:29:48 -04:00

237 lines
7.5 KiB
PHP

<?php
/**
* REST API Coupons controller for Smart Coupons
*
* Handles requests to the wc/sc/v1/coupons endpoint.
*
* @author StoreApps
* @since 4.10.0
* @version 1.2.0
*
* @package woocommerce-smart-coupons/includes/
*/
defined( 'ABSPATH' ) || exit;
if ( ! class_exists( 'WC_SC_REST_Coupons_Controller' ) ) {
/**
* REST API Coupons controller class.
*
* @package Automattic/WooCommerce/RestApi
* @extends WC_REST_CRUD_Controller
*/
class WC_SC_REST_Coupons_Controller extends WC_REST_Coupons_Controller {
/**
* Endpoint namespace.
*
* @var string
*/
protected $namespace = 'wc/v3/sc';
/**
* Route base.
*
* @var string
*/
protected $rest_base = 'coupons';
/**
* Post type.
*
* @var string
*/
protected $post_type = 'shop_coupon';
/**
* Constructor
*/
public function __construct() {
add_filter( "woocommerce_rest_prepare_{$this->post_type}_object", array( $this, 'handle_response_data' ), 99, 3 );
}
/**
* Register the routes for coupons.
*/
public function register_routes() {
register_rest_route(
$this->namespace,
'/' . $this->rest_base,
array(
array(
'methods' => WP_REST_Server::CREATABLE,
'callback' => array( $this, 'create_item' ),
'permission_callback' => array( $this, 'create_item_permissions_check' ),
'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
),
'schema' => array( $this, 'get_public_item_schema' ),
)
);
}
/**
* Prepare a single coupon for create or update.
*
* @param WP_REST_Request $request Request object.
* @param bool $creating If is creating a new object.
* @return WP_Error|WC_Data
*/
protected function prepare_object_for_database( $request, $creating = false ) {
global $woocommerce_smart_coupon;
$id = isset( $request['id'] ) ? absint( $request['id'] ) : 0;
$coupon = new WC_Coupon( $id );
$schema = $this->get_item_schema();
$data_keys = array_keys( array_filter( $schema['properties'], array( $this, 'filter_writable_props' ) ) );
$email_restrictions = ( ! empty( $request['email_restrictions'] ) && count( $request['email_restrictions'] ) === 1 ) ? $request['email_restrictions'] : '';
// Validate required POST fields.
if ( $creating ) {
if ( empty( $request['code'] ) ) {
$request['code'] = $woocommerce_smart_coupon->generate_unique_code( $email_restrictions );
} else {
$_coupon = new WC_Coupon( $request['code'] );
$is_auto_generate = ( is_object( $_coupon ) && is_callable( array( $_coupon, 'get_meta' ) ) ) ? $_coupon->get_meta( 'auto_generate_coupon' ) : 'no';
if ( 'yes' === $is_auto_generate ) {
$request['code'] = $woocommerce_smart_coupon->generate_unique_code( $email_restrictions );
foreach ( $data_keys as $key ) {
if ( empty( $request[ $key ] ) ) {
switch ( $key ) {
case 'code':
// do nothing.
break;
case 'meta_data':
$meta_data = ( is_object( $_coupon ) && is_callable( array( $_coupon, 'get_meta_data' ) ) ) ? $_coupon->get_meta_data() : null;
$new_meta_data = array();
if ( ! empty( $meta_data ) ) {
foreach ( $meta_data as $meta ) {
if ( is_object( $meta ) && is_callable( array( $meta, 'get_data' ) ) ) {
$data = $meta->get_data();
if ( isset( $data['id'] ) ) {
unset( $data['id'] );
}
$new_meta_data[] = $data;
}
}
}
$request[ $key ] = $new_meta_data;
break;
case 'description':
$request[ $key ] = ( is_object( $_coupon ) && is_callable( array( $_coupon, 'get_description' ) ) ) ? $_coupon->get_description() : null;
break;
default:
if ( is_callable( array( $_coupon, "get_{$key}" ) ) ) {
$request[ $key ] = $_coupon->{"get_{$key}"}();
}
break;
}
}
}
}
}
}
// Handle all writable props.
foreach ( $data_keys as $key ) {
$value = $request[ $key ];
if ( ! is_null( $value ) ) {
switch ( $key ) {
case 'code':
$coupon_code = wc_format_coupon_code( $value );
$id = $coupon->get_id() ? $coupon->get_id() : 0;
$id_from_code = wc_get_coupon_id_by_code( $coupon_code, $id );
if ( $id_from_code ) {
return new WP_Error( 'woocommerce_rest_coupon_code_already_exists', __( 'The coupon code already exists', 'woocommerce-smart-coupons' ), array( 'status' => 400 ) );
}
$coupon->set_code( $coupon_code );
break;
case 'meta_data':
if ( is_array( $value ) ) {
foreach ( $value as $meta ) {
$coupon->update_meta_data( $meta['key'], $meta['value'], isset( $meta['id'] ) ? $meta['id'] : '' );
}
}
break;
case 'description':
$coupon->set_description( wp_filter_post_kses( $value ) );
break;
default:
if ( is_callable( array( $coupon, "set_{$key}" ) ) ) {
$coupon->{"set_{$key}"}( $value );
}
break;
}
}
}
/**
* Filters an object before it is inserted via the REST API.
*
* The dynamic portion of the hook name, `$this->post_type`,
* refers to the object type slug.
*
* @param WC_Data $coupon Object object.
* @param WP_REST_Request $request Request object.
* @param bool $creating If is creating a new object.
*/
return apply_filters( "woocommerce_rest_pre_insert_{$this->post_type}_object", $coupon, $request, $creating );
}
/**
* Handle REST response data
*
* @param WP_REST_Response|mixed $response The response.
* @param WC_Coupon|mixed $object The object.
* @param WP_REST_Request|mixed $request The request.
* @return WP_REST_Response
*/
public function handle_response_data( $response = null, $object = null, $request = null ) {
global $woocommerce_smart_coupon;
if ( ! empty( $request['sc_is_send_email'] ) && 'yes' === $request['sc_is_send_email'] ) {
$is_send_email = $woocommerce_smart_coupon->is_email_template_enabled();
$email_restrictions = ( ! empty( $request['email_restrictions'] ) ) ? current( $request['email_restrictions'] ) : '';
if ( 'yes' === $is_send_email && ! empty( $email_restrictions ) ) {
$coupon = array(
'code' => ( is_object( $object ) && is_callable( array( $object, 'get_code' ) ) ) ? $object->get_code() : '',
'amount' => ( is_object( $object ) && is_callable( array( $object, 'get_amount' ) ) ) ? $object->get_amount() : 0,
);
$action_args = apply_filters(
'wc_sc_email_coupon_notification_args',
array(
'email' => $email_restrictions,
'coupon' => $coupon,
'discount_type' => ( is_object( $object ) && is_callable( array( $object, 'get_discount_type' ) ) ) ? $object->get_discount_type() : '',
)
);
// Trigger email notification.
do_action( 'wc_sc_email_coupon_notification', $action_args );
}
}
if ( ! empty( $request['sc_is_html'] ) && 'yes' === $request['sc_is_html'] ) {
$data = '';
ob_start();
do_action(
'wc_sc_paint_coupon',
array(
'coupon' => $object,
'with_css' => 'yes',
'with_container' => 'yes',
)
);
$data = ob_get_clean();
$response = rest_ensure_response( $data );
}
return $response;
}
}
}