oont-contents/plugins/webappick-product-feed-for-woocommerce/V5/API/V1/MakeFeed.php
2025-03-31 21:42:48 +02:00

284 lines
7 KiB
PHP

<?php
namespace CTXFeed\V5\API\V1;
use CTXFeed\V5\API\RestController;
use CTXFeed\V5\Common\Helper;
use CTXFeed\V5\Feed\Feed;
use CTXFeed\V5\Helper\FeedHelper;
use CTXFeed\V5\Utility\Config;
use WP_REST_Server;
/**
* Class MakeFeed
*
* @package CTXFeed
* @subpackage CTXFeed\V5\API
* @author Azizul Hasan <azizulhasan.cr@gmail.com>
* @link https://azizulhasan.com
* @license https://opensource.org/licenses/gpl-license.php GNU Public License
*/
class MakeFeed extends RestController {
/**
* The single instance of the class
*
* @var $_instance
*
*/
protected static $_instance = null;
/**
* The instance of config
*
* @var $config
*
*/
protected static $config = null;
public function __construct() {
parent::__construct();
$this->rest_base = 'make_feed';
}
/**
* Main MakeFeed Instance.
*
* Ensures only one instance of MakeFeed is loaded or can be loaded.
*
* @return $_instance Main instance
*/
public static function instance() {
if ( is_null( self::$_instance ) ) {
self::$_instance = new self();
}
return self::$_instance;
}
public function register_routes() {
// Save feed
register_rest_route(
$this->namespace,
'/' . $this->rest_base . '/save_feed_config',
[
/**
* @endpoint: wp-json/ctxfeed/v1/make_feed/save_feed_config
*
* @param $file_ext_type String
*/
[
'methods' => WP_REST_Server::CREATABLE,
'callback' => [ $this, 'save_feed_config' ],
'permission_callback' => [ $this, 'get_item_permissions_check' ],
'args' => [],
],
'schema' => [ $this, 'get_item_schema' ],
]
);
// Get product ids Feed.
register_rest_route(
$this->namespace,
'/' . $this->rest_base . '/get_product_ids',
[
/**
* @endpoint: wp-json/ctxfeed/v1/make_feed/get_product_ids
*
* @param $file_ext_type String
*/
[
'methods' => WP_REST_Server::CREATABLE,
'callback' => [ $this, 'get_product_ids' ],
'permission_callback' => [ $this, 'get_item_permissions_check' ],
'args' => [],
],
'schema' => [ $this, 'get_item_schema' ],
]
);
// Generate Feed
register_rest_route(
$this->namespace,
'/' . $this->rest_base . '/make_per_batch_feed',
[
/**
* @endpoint: wp-json/ctxfeed/v1/make_feed/make_per_batch_feed
*
* @param $file_ext_type String
*/
[
'methods' => WP_REST_Server::CREATABLE,
'callback' => [ $this, 'make_per_batch_feed' ],
'permission_callback' => [ $this, 'get_item_permissions_check' ],
'args' => [],
],
'schema' => [ $this, 'get_item_schema' ],
]
);
// Save Feed File
register_rest_route(
$this->namespace,
'/' . $this->rest_base . '/save_feed_file',
[
/**
* @endpoint: wp-json/ctxfeed/v1/make_feed/save_feed_file
*
* @param $file_ext_type String
*/
[
'methods' => WP_REST_Server::CREATABLE,
'callback' => [ $this, 'save_feed_file' ],
'permission_callback' => [ $this, 'get_item_permissions_check' ],
'args' => [],
],
'schema' => [ $this, 'get_item_schema' ],
]
);
}
/**
*
*
* @param $request
*
* @return void|\WP_Error|\WP_REST_Response
*/
public function save_feed_config( $request ) {
$config_data = json_decode( $request->get_body(), true );
$feed_option_name = null;
if ( ! empty( $config_data['feed_info']['option_name'] ) ) {
$feed_option_name = $config_data['feed_info']['option_name'];
}
if ( ! isset( $config_data['feed_info']['option_value'], $config_data['feed_info']['option_value']['feedrules'] ) ) {
return $this->error( __( "Feed rules not provided properly", 'woo-feed' ) );
}
$config = new Config( $config_data['feed_info'] );
$feed_rules = $config_data['feed_info']['option_value']['feedrules'];
$saved_option_name = $config->save_config( $feed_rules, $feed_option_name );
$single_feed = Feed::get_single_feed( $saved_option_name );
$saved_feed_info = is_array( $single_feed ) && count( $single_feed ) ? $single_feed[0] : [];
$response = [
'feed_info' => $saved_feed_info
];
delete_transient( 'ctx_feed_structure_transient' );
return $this->success( $response );
}
/**
* Get product ids
*
* @param $request
*
* @return void|\WP_Error|\WP_REST_Response
*/
public function get_product_ids( $request ) {
$body = json_decode( $request->get_body(), true );
if ( empty( $body['feed_info'] ) ) {
return $this->error( __( 'Feed Info Is Empty.', 'woo-feed' ) );
}
$feed_info = $body['feed_info'];
$ids = FeedHelper::get_product_ids( $feed_info );
if ( empty( $ids ) ) {
return $this->error( __( 'Product not found.', 'woo-feed' ) );
}
return $this->success( $ids );
}
/**
* Make feed
*
* @param $request
*
* @return void|\WP_Error|\WP_REST_Response
*/
public function make_per_batch_feed( $request ) {
$body = json_decode( $request->get_body(), true );
$offset = (int) $body['offset'];
$product_ids = array_map( 'absint', $body['product_ids'] );
$feedrules = $body['feed_info']['option_value']['feedrules'];
// Write log if debug log is enabled.
if ( Helper::is_debugging_enabled() ) {
FeedHelper::log_data( $feedrules, $offset, $product_ids );
}
try {
$status = false;
$status = FeedHelper::generate_temp_feed_body( $body['feed_info'], $product_ids, $offset );
return $this->success( [
'status' => $status,
'offset' => $offset,
'message' => $status ? __( 'Temporary Feed Generated', 'woo-feed' ) : __( 'Something went wrong.', 'woo-feed' )
] );
} catch ( Exception $e ) {
$message = 'Error Generating Product Data.' . PHP_EOL . 'Caught Exception :: ' . $e->getMessage();
woo_feed_log( $feedrules['filename'], $message, 'critical', $e, true );
woo_feed_log_fatal_error( $message, $e );
return $this->error( [ 'status' => false, 'offset' => $offset, 'message' => $message ] );
}
}
/**
*
*
* @param $request
*
* @return void|\WP_Error|\WP_REST_Response
*/
public function save_feed_file( $request ) {
$body = json_decode( $request->get_body(), true );
$should_update_last_update_time = false;
if ( isset( $body['should_update_last_update_time'] ) && $body['should_update_last_update_time'] ) {
$should_update_last_update_time = true;
}
$save_file = FeedHelper::save_feed_file( $body['feed_info'], $should_update_last_update_time );
$status = $save_file['status'];
$feed_url = $save_file['feed_url'];
if ( is_wp_error( $status ) ) {
return $this->error( $status->get_error_message(), $status->get_error_code() );
}
$response = [
'message' => __( 'Feed Successfully Generated', 'woo-feed' ),
'feed_url' => $feed_url,
'notice' => [
'type' => 'warning',
'message' => '',
'link' => ''
]
];
return $this->success( $response );
}
}