update sync order module

This commit is contained in:
Kai Ton 2024-05-17 08:15:32 +07:00
parent 867e553946
commit 7ef2bef4db
16 changed files with 401 additions and 48 deletions

View File

@ -11,10 +11,10 @@ class Repository implements RepositoryInterface
{
function __construct()
{
$this->authorization();
$this->_authorization();
}
private function authorization()
private function _authorization()
{
$headers = apache_request_headers();
$apiKey = \IpSupply\SyncOrder\Helper::API_KEY;
@ -32,55 +32,51 @@ class Repository implements RepositoryInterface
die(json_encode(['message' => 'unauthorized']));
}
private function _responseOk(array $data)
static function getForm()
{
header('HTTP/1.1 200 Ok');
header('Accept: application/json');
header('Content-Type: application/json');
die(json_encode($data));
$data = [
'url' => '',
];
$config = \IpSupply\SyncOrder\Config\Getter::get('config');
if ($config) {
$data = json_decode($config, true);
}
private function _responseFail(array $data)
{
header('HTTP/1.1 400 Bad request');
header('Accept: application/json');
header('Content-Type: application/json');
die(json_encode($data));
return [
[
'label' => 'API',
'name' => 'url',
'value' => $data['url'] ?? ''
]
];
}
private function _responseMethodFail()
{
header('HTTP/1.1 400 bad request');
header('Accept: application/json');
header('Content-Type: application/json');
die(json_encode([
'status' => false,
'message' => 'Param ?method=... not exist!'
]));
}
public function getData()
{
return $this->_responseOk([
return \IpSupply\SyncOrder\Helper::responseOk([
'status' => true,
'data' => []
]);
// return $this->_responseMethodFail();
}
public function postData()
{
parse_str(
string: file_get_contents('php://input'),
result: $payload
result: $payload,
);
return $this->_responseOk([
'status' => true,
'data' => [], // TODO
'payload' => $payload
]);
unset($payload['form_key']);
// return $this->_responseMethodFail();
\IpSupply\SyncOrder\Config\Setter::set(
path: 'config',
value: json_encode($payload),
);
return \IpSupply\SyncOrder\Helper::responseOk([
'status' => true,
]);
}
}

View File

@ -2,6 +2,8 @@
namespace IpSupply\SyncOrder\Api;
use Magento\Framework\Exception\LocalizedException;
/**
* @api
*/
@ -15,8 +17,7 @@ interface RepositoryInterface
public function getData();
/**
* methot: POST
*
* method: POST
* @return string
*/
public function postData();

View File

@ -26,4 +26,8 @@ class Config extends Template
{
return \IpSupply\SyncOrder\Helper::API_KEY;
}
public function getForm() {
return \IpSupply\SyncOrder\Api\Repository::getForm();
}
}

View File

@ -0,0 +1,32 @@
<?php
namespace IpSupply\SyncOrder\Config;
use IpSupply\SyncOrder\Helper;
use Magento\Framework\App\Config\ScopeConfigInterface;
class Getter
{
protected $scopeConfig;
static function get($path, $prefix = true)
{
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$configGetter = $objectManager->create(self::class);
$path = $prefix
? Helper::PREFIX . '/' . $path
: $path;
return $configGetter->getConfigValue($path);
}
public function __construct(ScopeConfigInterface $scopeConfig)
{
$this->scopeConfig = $scopeConfig;
}
public function getConfigValue($fullPath)
{
return $this->scopeConfig->getValue($fullPath);
}
}

View File

@ -0,0 +1,35 @@
<?php
namespace IpSupply\SyncOrder\Config;
use IpSupply\SyncOrder\Helper;
use Magento\Framework\App\Config\Storage\WriterInterface;
class Setter
{
protected $configWriter;
static function set($path, $value, $prefix = true)
{
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$configSetter = $objectManager->create(self::class);
$path = $prefix
? Helper::PREFIX . '/' . $path
: $path;
$configSetter->setConfigValue($path, $value);
// Clean cache old
$cacheManager = $objectManager->get(\Magento\Framework\App\Cache\Manager::class);
$cacheManager->flush(['config']);
}
public function __construct(WriterInterface $configWriter)
{
$this->configWriter = $configWriter;
}
public function setConfigValue($fullPath, $value)
{
$this->configWriter->save($fullPath, $value);
}
}

View File

@ -4,4 +4,32 @@ namespace IpSupply\SyncOrder;
final class Helper {
public const API_KEY = 'IpSupply@123';
public const PREFIX = 'IpSupply_SyncOrder';
static function responseOk(array $data)
{
header('HTTP/1.1 200 Ok');
header('Accept: application/json');
header('Content-Type: application/json');
die(json_encode($data));
}
static function responseFail(array $data)
{
header('HTTP/1.1 400 Bad request');
header('Accept: application/json');
header('Content-Type: application/json');
die(json_encode($data));
}
static function responseMethodFail()
{
header('HTTP/1.1 400 bad request');
header('Accept: application/json');
header('Content-Type: application/json');
die(json_encode([
'status' => false,
'message' => 'Param ?method=... not exist!'
]));
}
}

View File

@ -0,0 +1,35 @@
<?php
namespace IpSupply\SyncOrder\Observer;
use Magento\Framework\Event\ObserverInterface;
class CheckOrderStatus implements ObserverInterface
{
protected $orderRepository;
protected $dir;
public function __construct(
\Magento\Sales\Api\OrderRepositoryInterface $orderRepository,
\Magento\Framework\Filesystem\DirectoryList $dir,
) {
$this->orderRepository = $orderRepository;
$this->dir = $dir;
}
public function execute(\Magento\Framework\Event\Observer $observer)
{
$order = $observer->getEvent()->getOrder();
$customerId = $order->getCustomerId();
$OrderStatus = $order->getStatus();
$file = $this->dir->getPath('log') . '/' . 'CheckOrderStatus.log';
if (!file_exists($file)) {
$fh = fopen($file, 'w') or die("Can't create file");
fclose($fh);
}
$current = file_get_contents($file);
$current .= $customerId . ':' . $OrderStatus . " \n";
file_put_contents($file, $current);
}
}

View File

@ -0,0 +1,36 @@
<?php
namespace IpSupply\SyncOrder\Serialize\Serializer;
use Magento\Framework\Serialize\Serializer\Json as SerializerJson;
class Json extends SerializerJson
{
/**
* @inheritDoc
* @since 101.0.0
*/
public function unserialize($string)
{
if ($string === null) {
throw new \InvalidArgumentException(
'Unable to unserialize value. Error: Parameter must be a string type, null given.'
);
}
$result = json_decode($string, true);
if (json_last_error() !== JSON_ERROR_NONE) {
parse_str($string, $result);
if (is_array($result)) {
return $result;
} else {
throw new \InvalidArgumentException(
$string . " - Unable to unserialize value. Error: " . json_last_error_msg()
);
}
}
return $result;
}
}

View File

@ -0,0 +1,33 @@
<?php
namespace IpSupply\SyncOrder\Setup;
use Magento\Catalog\Model\Product;
use Magento\Eav\Model\Entity\Attribute\ScopedAttributeInterface;
use Magento\Framework\Setup\ModuleContextInterface;
use Magento\Framework\Setup\ModuleDataSetupInterface;
use Magento\Framework\Setup\UpgradeDataInterface;
class UpgradeData implements UpgradeDataInterface
{
protected $_eavSetupFactory;
protected $_attributeRepositoryInterface;
protected $_attributeSetupFactory;
public function __construct(
\Magento\Eav\Setup\EavSetupFactory $eavSetupFactory,
\Magento\Eav\Api\AttributeRepositoryInterface $attributeRepositoryInterface,
\Magento\Catalog\Setup\CategorySetupFactory $attributeSetupFactory
) {
$this->_eavSetupFactory = $eavSetupFactory;
$this->_attributeRepositoryInterface = $attributeRepositoryInterface;
$this->_attributeSetupFactory = $attributeSetupFactory;
}
public function upgrade(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
{
\IpSupply\SyncOrder\Config\Setter::set(path: 'config', value: json_encode([
'url' => 'https://google.com' // TODO: config api
]));
}
}

View File

@ -0,0 +1,13 @@
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<!-- Repository -->
<preference
for="IpSupply\SyncOrder\Api\RepositoryInterface"
type="IpSupply\SyncOrder\Api\Repository"
/>
<preference
for="Magento\Framework\Serialize\Serializer\Json"
type="IpSupply\SyncOrder\Serialize\Serializer\Json"
/>
</config>

View File

@ -0,0 +1,6 @@
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="sales_order_save_after">
<observer name="syncorder_sales_order_save_after" instance="IpSupply\SyncOrder\Observer\CheckOrderStatus" />
</event>
</config>

View File

@ -1,12 +1,12 @@
<?xml version="1.0"?>
<routes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Webapi:etc/webapi.xsd">
<route url="ipsupply/syncorder/sync" method="GET">
<route url="V1/syncorder/config" method="GET">
<service class="IpSupply\SyncOrder\Api\RepositoryInterface" method="getData"/>
<resources>
<resource ref="anonymous"/>
</resources>
</route>
<route url="ipsupply/syncorder/sync" method="POST">
<route url="V1/syncorder/config" method="POST">
<service class="IpSupply\SyncOrder\Api\RepositoryInterface" method="postData"/>
<resources>
<resource ref="anonymous"/>

View File

@ -0,0 +1,9 @@
<?xml version="1.0"?>
<page
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"
>
<head>
<css src="IpSupply_SyncOrder::css/config.css" />
</head>
</page>

View File

@ -1,14 +1,16 @@
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<page
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"
>
<head>
<css src="IpSupply_SyncOrder::css/config.css"/>
<css src="IpSupply_SyncOrder::css/config.css" />
</head>
<body>
<referenceContainer name="content">
<block class="IpSupply\SyncOrder\Block\Adminhtml\Config" template="IpSupply_SyncOrder::syncorder_config.phtml"/>
<!--
Template: IpSupply_SyncOrder::syncorder_config.phtml to ../templates/syncorder_config.phtml
-->
</referenceContainer>
</body>
<referenceBlock name="content">
<block
class="IpSupply\SyncOrder\Block\Adminhtml\Config"
template="IpSupply_SyncOrder::syncorder_config.phtml"
/>
<!-- Template: IpSupply_SyncOrder::syncorder_config.phtml to ../templates/syncorder_config.phtml -->
</referenceBlock>
</page>

View File

@ -0,0 +1,76 @@
<div class="ipsupply">
<form id="form">
<?php foreach ($block->getForm() as $field) : ?>
<div class="form-group">
<label for="<?= $field['name'] ?>"><?= $field['label'] ?></label>
<input type="text" id="<?= $field['name'] ?>" name="<?= $field['name'] ?>" value="<?= $field['value'] ?>" />
</div>
<?php endforeach ?>
<div class="form-group">
<button class="submit" type="submit">Save</button>
</div>
</form>
</div>
<script>
const AJAX_URL = location.origin + "/rest/V1/syncorder/config"; // TODO: need /sync to /config
require([
"jquery",
"mage/translate",
"uiComponent",
"ko",
"Magento_Ui/js/modal/alert",
"Magento_Ui/js/modal/confirm",
"Magento_Ui/js/modal/modal",
], function($, $t, Component, ko, alertModal, confirmModal, modal) {
"use strict";
$.ajaxSetup({
contentType: "application/json;",
headers: {
API_KEY: "<?= $block->getApiKey() ?>",
},
success: function(data) {
// do something before xhr
},
fail: function(error) {
console.error(error);
alertModal({
content: error.message,
});
},
});
// Event
$("#form").on("submit", function(e) {
e.preventDefault();
e.stopPropagation();
$(this)
.find('[type=submit]')
.attr('disabled', 'disabled');
$.post(AJAX_URL, $(this).serialize())
.then(res => {
if (res.status) {
alertModal({
content: 'Successfully: Data saved!'
})
} else {
alertModal({
content: 'Failed: Data not saved!'
})
}
})
.catch(() => {
alertModal({
content: 'Fail saved!'
})
})
.then(() => {
$(this)
.find('[type=submit]')
.removeAttr('disabled');
})
});
});
</script>

View File

@ -0,0 +1,47 @@
.ipsupply {
box-sizing: border-box;
font-size: 16px;
}
.ipsupply button {
background: #eb5202;
color: #fff;
border: none;
outline: 0;
}
.ipsupply form {
box-sizing: border-box;
padding: 20px;
border: 1.5px solid #aca;
max-width: 600px;
}
.ipsupply form .form-group {
margin-bottom: 10px;
display: flex;
justify-content: space-between;
align-items: center;
}
.ipsupply form .form-group label {
font-weight: bold;
text-transform: uppercase;
margin-right: 5px;
min-width: 70px;
}
.ipsupply form .form-group label::after {
content: ":";
}
.ipsupply form .form-group input {
outline: 0;
border: 1px solid #aca;
padding: 3px 5px;
width: 100%;
}
.ipsupply form .form-group [type=submit] {
width: 100%;
}