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.'));
}
}