MOON
Server: Apache
System: Linux server.royaltuning.hu 4.18.0-425.13.1.el8_7.x86_64 #1 SMP Tue Feb 21 04:20:52 EST 2023 x86_64
User: royaltuning (1001)
PHP: 8.2.30
Disabled: exec,passthru,shell_exec,system
Upload Files
File: /home/royaltuning/www/public/wp-content/plugins/easysales/includes/ApiController.php
<?php

if (!defined('ABSPATH')) {
    exit; // Exit if accessed directly
}

use EasySales\Models\OrderModel\OrderModel;
use EasySales\Models\ProductModel\ProductModel;

class ApiController
{
    /**
     * Module Version
     * @var string
     */
    private $version = EASYSALES_PLUGIN_VERSION;

    /**
     * @var ProductTransformer
     */
    private $productTransformer;
    /**
     * @var OrderTransformer
     */
    private $orderTransformer;

    /**
     * @var EasySales
     */
    private $pluginInstance;

    /**
     * ApiController constructor.
     * @param ProductTransformer $productTransformer
     * @param OrderTransformer $orderTransformer
     */
    public function __construct(ProductTransformer $productTransformer, OrderTransformer $orderTransformer)
    {
        $this->productTransformer = $productTransformer;
        $this->orderTransformer = $orderTransformer;
    }

    public function setPluginInstance($pluginInstance)
    {
        $this->pluginInstance = $pluginInstance;
    }

    /**
     * @param WP_REST_Request $request
     * @return array
     */
    public function testConnection(WP_REST_Request $request)
    {
        if ($request->get_param('easySalesApiUrl')) {
            update_option('easysales-api-url', $request->get_param('easySalesApiUrl') . '/api/v1/website');
        }

        return [
            'success' => true,
            'message' => 'Integration successful',
            'version' => $this->version
        ];
    }

    /**
     * @param WP_REST_Request $request
     * @return array
     */
    public function getProducts(WP_REST_Request $request)
    {
        $params = $request->get_param('params');

        if (!isset($params['page'])) {
            $page = 1;
        } else {
            $page = $params['page'];
        }
        // Get all products
        $statuses = ['publish', 'pending'];

        if (get_option('easysales-draft-products') == 1) {
            $statuses[] = 'draft';
        }

        if (get_option('easysales-private-products') == 1) {
            $statuses[] = 'private';
        }

        $visibility = ['visible', 'catalog', 'search'];

        if (get_option('easysales-disabled-products') == 1) {
            $visibility [] = 'hidden';
        }

        $per_page = 500;
        if (!empty($params['per_page'])) {
            $per_page = $params['per_page'];
        }

        if (isset($params['trash'])) {
            $statuses = ['trash'];
        }

        $products = wc_get_products([
            'page' => $page,
            'limit' => $per_page,
            'paginate' => true,
            'status' => $statuses,
            'visibility' => $visibility,
            'orderby' => 'modified',
            'order' => 'DESC',
        ]);

        $pages = $products->max_num_pages;
        $products = $products->products;

        $transformedProducts = [];

        // Transform simple and variable products
        foreach ($products as $product) {
            if ($product instanceof WC_Product_Simple) {
                if ($product->get_sku()) {
                    $transformedProducts[] = $this->productTransformer->transformSimpleProduct($product);
                }
            } elseif ($product instanceof WC_Product_Variable) {
                $transformedProducts = array_merge($transformedProducts, $this->productTransformer->transformVariableProduct($product));
            } elseif ($product instanceof WC_Product_Variation) {
                $productId = $product->get_parent_id();
                $product = wc_get_product($productId);
                $transformedProducts[] = $this->productTransformer->transformVariableProduct($product);
            }
        }

        return [
            'products' => $transformedProducts,
            'pages' => $pages
        ];
    }

    /**
     * @param WP_REST_Request $request
     * @return array|WP_Error
     */
    public function getProduct(WP_REST_Request $request)
    {
        $params = $request->get_param('params');
        return $this->getProductByIdentifier($params);
    }

    public function getProductByIdentifier($params)
    {
        if (empty($params['product_id']) && empty($params['sku'])) {
            return new WP_Error('400', 'Product identifier not provided');
        }
        if (!empty($params['product_id'])) {
            $product = wc_get_product($params['product_id']);
        } else {
            $productId = wc_get_product_id_by_sku($params['sku']);
            $product = wc_get_product($productId);
        }

        if (!$product) {
            return new WP_Error('404', 'Product not found');
        }

        if (get_class($product) == 'WC_Product_Simple') {
            $transformedProduct = $this->productTransformer->transformSimpleProduct($product);
            remove_all_filters('es_product_info_transform');
            $originalTransformedProduct = $this->productTransformer->transformSimpleProduct($product);
        } elseif (get_class($product) == 'WC_Product_Variable') {
            $transformedProduct = $this->productTransformer->transformVariableProduct($product);
            remove_all_filters('es_product_info_transform');
            $originalTransformedProduct = $this->productTransformer->transformVariableProduct($product);
        } elseif (get_class($product) == 'WC_Product_Variation') {
            $productId = $product->get_parent_id();
            $product = wc_get_product($productId);
            $transformedProduct = $this->productTransformer->transformVariableProduct($product);
            remove_all_filters('es_product_info_transform');
            $originalTransformedProduct = $this->productTransformer->transformVariableProduct($product);
        }

        $isChanged = false;
        if ($originalTransformedProduct) {
            $isChanged = md5(wp_json_encode($transformedProduct)) !== md5(wp_json_encode($originalTransformedProduct));
        }

        return [
            'is_changed' => $isChanged,
            'debug' => $originalTransformedProduct,
            'product' => $transformedProduct,
        ];
    }

    /**
     * @param WP_REST_Request $request
     * @return array
     */
    public function getProductStocks(WP_REST_Request $request)
    {
        $params = $request->get_param('params');

        if (!isset($params['page'])) {
            $page = 1;
        } else {
            $page = $params['page'];
        }
        // Get all products
        $statuses = ['publish', 'pending'];

        if (get_option('easysales-draft-products') == 1) {
            $statuses[] = 'draft';
        }

        if (get_option('easysales-private-products') == 1) {
            $statuses[] = 'private';
        }

        $visibility = ['visible', 'catalog', 'search'];

        if (get_option('easysales-disabled-products') == 1) {
            $visibility [] = 'hidden';
        }

        $per_page = 500;
        if (!empty($params['per_page'])) {
            $per_page = $params['per_page'];
        }

        $products = wc_get_products([
            'page' => $page,
            'limit' => $per_page,
            'paginate' => true,
            'status' => $statuses,
            'visibility' => $visibility,
            'orderby' => 'modified',
            'order' => 'DESC',
        ]);

        $pages = $products->max_num_pages;
        $products = $products->products;

        $transformedProducts = [];

        // Transform simple and variable products
        foreach ($products as $product) {
            if ($product instanceof WC_Product_Simple) {
                if ($product->get_sku()) {
                    $transformedProducts[] = $this->productTransformer->transformSimpleProductStock($product);
                }
            } elseif ($product instanceof WC_Product_Variable) {
                $transformedProducts = array_merge($transformedProducts, $this->productTransformer->transformVariableProductStock($product));
            }
        }

        return [
            'stocks' => $transformedProducts,
            'pages' => $pages
        ];
    }

    /**
     * @param WP_REST_Request $request
     * @return array
     */
    public function getProductPrices(WP_REST_Request $request)
    {
        $params = $request->get_param('params');

        if (!isset($params['page'])) {
            $page = 1;
        } else {
            $page = $params['page'];
        }
        // Get all products
        $statuses = ['publish', 'pending'];

        if (get_option('easysales-draft-products') == 1) {
            $statuses[] = 'draft';
        }

        if (get_option('easysales-private-products') == 1) {
            $statuses[] = 'private';
        }

        $visibility = ['visible', 'catalog', 'search'];

        if (get_option('easysales-disabled-products') == 1) {
            $visibility [] = 'hidden';
        }

        $per_page = 500;
        if (!empty($params['per_page'])) {
            $per_page = $params['per_page'];
        }

        $products = wc_get_products([
            'page' => $page,
            'limit' => $per_page,
            'paginate' => true,
            'status' => $statuses,
            'visibility' => $visibility,
            'orderby' => 'modified',
            'order' => 'DESC',
        ]);

        $pages = $products->max_num_pages;
        $products = $products->products;

        $transformedProducts = [];

        // Transform simple and variable products
        foreach ($products as $product) {
            if ($product instanceof WC_Product_Simple) {
                if ($product->get_sku()) {
                    $transformedProducts[] = $this->productTransformer->transformSimpleProductPrices($product);
                }
            } elseif ($product instanceof WC_Product_Variable) {
                $transformedProducts = array_merge($transformedProducts, $this->productTransformer->transformVariableProductPrices($product));
            }
        }

        return [
            'prices' => $transformedProducts,
            'pages' => $pages
        ];
    }

    /**
     * Retrieve categories
     *
     * @param WP_REST_Request $request
     * @return array
     */
    public function getCategories(WP_REST_Request $request)
    {
        // Get all categories
        $transformedCategories = get_terms('product_cat', ['hide_empty' => false]);

        // Transform categories
        $transformedCategories = array_map(function ($category) {
            return [
                'category_website_id' => $category->term_id,
                'name' => $category->name
            ];
        }, $transformedCategories);

        return [
            'categories' => $transformedCategories,
        ];
    }

    /**
     * Retrieve characteristics
     *
     * @param WP_REST_Request $request
     * @return array
     */
    public function getCharacteristics(WP_REST_Request $request)
    {
        // Get all characteristics
        $characteristics = wc_get_attribute_taxonomies();
        $transformedCharacteristics = [];

        // Transform characteristics
        foreach ($characteristics as $characteristic) {
            $transformedCharacteristics[] = [
                'characteristic_website_id' => $characteristic->attribute_id,
                'name' => $characteristic->attribute_label
            ];
        }

        return [
            'characteristics' => $transformedCharacteristics,
        ];
    }

    /**
     * @param WP_REST_Request $request
     * @return array|WP_Error
     */
    public function getOrders(WP_REST_Request $request)
    {
        $params = $request->get_param('params');

        $filters = [
            'paginate' => true,
            'orderby' => 'modified',
            'order' => 'DESC',
        ];

        $filters['page'] = 1;
        if (!empty($params['page'])) {
            $filters['page'] = $params['page'];
        }

        $filters['limit'] = 500;
        if (!empty($params['per_page'])) {
            $filters['limit'] = $params['per_page'];
        }

        if (!empty($params['last_call'])) {
            $filters['date_modified'] = '>=' . $params['last_call'];
        }

        $orders = wc_get_orders($filters);

        $pages = $orders->max_num_pages;
        $orders = $orders->orders;

        $transformedOrders = [];

        foreach ($orders as $order) {
            if ($order->get_type() !== 'shop_order_refund') {
                $transformedOrders[] = $this->orderTransformer->transform($order);
            }
        }

        return [
            'orders' => $transformedOrders,
            'pages' => $pages
        ];
    }

    /**
     * @param WP_REST_Request $request
     * @return array|WP_Error
     */
    public function getOrder(WP_REST_Request $request)
    {
        $params = $request->get_param('params');
        if (empty($params['order_id'])) {
            return new WP_Error('400', 'Order id not provided');
        }

        $order = wc_get_order($params['order_id']);
        if (!$order) {
            return new WP_Error('404', 'Order not found');
        }

        $transformed = $this->orderTransformer->transform($order);
        remove_all_filters('es_order_info_transform');
        $original = $this->orderTransformer->transform($order);

        $isChanged = md5(wp_json_encode($transformed)) !== md5(wp_json_encode($original));

        return [
            'is_changed' => $isChanged,
            'debug' => $original,
            'order' => $transformed,
        ];
    }

    /**
     * @param WP_REST_Request $request
     * @return array|WP_Error
     */
    public function updateOrder(WP_REST_Request $request)
    {
        $order_id = $request->get_param('params')['id'];

        // Get product with given ID
        $order = new OrderModel($order_id);

        // Check if product exists and sku match
        if (!$order->exists()) {
            return new WP_Error('invalid_order_id', __('Invalid order ID.'));
        }

        $status = strtolower($request->get_param('params')['status']);
        switch ($status) {
            case 'completed':
                $updateStatus = $order->setAsCompleted();
                break;
            case 'canceled':
                $updateStatus = $order->setAsCanceled();
                break;
            default:
                $updateStatus = null;
                break;
        }

        if (!$updateStatus) {
            return new WP_Error('update_status_order', __('Could not update order status'));
        }

        return [
            'order' => $order_id,
            'status' => $status,
        ];
    }

    /**
     * @param WP_REST_Request $request
     * @return array|WP_Error
     */
    public function updateProductStock(WP_REST_Request $request)
    {
        $id = $request->get_param('params')['product_website_id'];
        $stock = $request->get_param('params')['stock'];
        $sku = $request->get_param('params')['sku'];

        // Verify if stock is numeric and greater than 0
        if (!is_numeric($stock) || $stock < 0) {
            return new WP_Error('invalid_stock', __('Invalid stock.'));
        }

        // SKU is required
        if (!$sku) {
            return new WP_Error('invalid_sku', __('Invalid SKU.'));
        }

        remove_action('woocommerce_update_product', [$this->pluginInstance, 'update_product']);

        // Get product with given ID
        $product = new ProductModel($id);

        // Check if product exists
        if (!$product->get()) {
            return new WP_Error('invalid_product_id', __('Invalid product ID.'));
        }

        // Verify sku
        if ($product->verifySku($sku)) {
            $product->updateAtumPluginStock($id, $stock);

            $product->get()->set_manage_stock(true);
            $product->get()->save();
            wc_update_product_stock($id, $stock);

            return [
                'product' => $id,
                'stock' => $stock,
            ];
        }

        return new WP_Error('invalid_product_id_or_sku', __('Invalid product ID or SKU.'));
    }

    /**
     * @param WP_REST_Request $request
     * @return array|WP_Error
     */
    public function updateProductPrices(WP_REST_Request $request)
    {
        $id = $request->get_param('params')['product_website_id'];
        $salePrice = $request->get_param('params')['sale_price'];
        $fullPrice = $request->get_param('params')['full_price'];
        $sku = $request->get_param('params')['sku'];

        // Verify if prices are numeric
        if (!is_numeric($salePrice) || !is_numeric($fullPrice)) {
            return new WP_Error('invalid_prices', __('Invalid prices.'));
        }

        // SKU is required
        if (!$sku) {
            return new WP_Error('invalid_sku', __('Invalid SKU.'));
        }

        remove_action('woocommerce_update_product', [$this->pluginInstance, 'update_product']);

        // Get product with given ID
        $product = new ProductModel($id);

        // Check if product exists
        if (!$product->get()) {
            return new WP_Error('invalid_product_id', __('Invalid product ID.'));
        }

        // Verify sku
        if ($product->verifySku($sku)) {
            $product->get()->set_sale_price($salePrice);
            $product->get()->set_regular_price($fullPrice);
            $product->get()->save();

            return [
                'product' => $id,
                'sale_price' => $salePrice,
                'full_price' => $fullPrice
            ];
        }

        return new WP_Error('invalid_product_id_or_sku', __('Invalid product ID or SKU.'));
    }
}