Skip to content

Commit c92a3df

Browse files
committed
ACP2E-3774: Concurrent Calls to Reorder GraphQL API - Same Products Added to Different Rows
1 parent df92deb commit c92a3df

File tree

2 files changed

+29
-4
lines changed

2 files changed

+29
-4
lines changed

app/code/Magento/SalesGraphQl/Model/Resolver/Reorder.php

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?php
22
/**
3-
* Copyright © Magento, Inc. All rights reserved.
4-
* See COPYING.txt for license details.
3+
* Copyright 2020 Adobe
4+
* All Rights Reserved.
55
*/
66
declare(strict_types=1);
77

@@ -11,6 +11,7 @@
1111
use Magento\Framework\GraphQl\Exception\GraphQlAuthorizationException;
1212
use Magento\Framework\GraphQl\Query\ResolverInterface;
1313
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
14+
use Magento\Framework\Lock\LockManagerInterface;
1415
use Magento\GraphQl\Model\Query\ContextInterface;
1516
use Magento\Sales\Model\Reorder\Data\Error;
1617
use Magento\Sales\Model\OrderFactory;
@@ -26,6 +27,10 @@ class Reorder implements ResolverInterface
2627
*/
2728
private const ARGUMENT_ORDER_NUMBER = 'orderNumber';
2829

30+
private const LOCK_PREFIX = 'reorder_lock_';
31+
32+
private const LOCK_TIMEOUT = 60;
33+
2934
/**
3035
* @var OrderFactory
3136
*/
@@ -36,16 +41,24 @@ class Reorder implements ResolverInterface
3641
*/
3742
private $reorder;
3843

44+
/**
45+
* @var LockManagerInterface
46+
*/
47+
private $lockManager;
48+
3949
/**
4050
* @param \Magento\Sales\Model\Reorder\Reorder $reorder
4151
* @param OrderFactory $orderFactory
52+
* @param LockManagerInterface $lockManager
4253
*/
4354
public function __construct(
4455
\Magento\Sales\Model\Reorder\Reorder $reorder,
45-
OrderFactory $orderFactory
56+
OrderFactory $orderFactory,
57+
LockManagerInterface $lockManager
4658
) {
4759
$this->orderFactory = $orderFactory;
4860
$this->reorder = $reorder;
61+
$this->lockManager = $lockManager;
4962
}
5063

5164
/**
@@ -74,7 +87,18 @@ public function resolve(
7487
);
7588
}
7689

77-
$reorderOutput = $this->reorder->execute($orderNumber, $storeId);
90+
$lockName = implode('_', [$currentUserId, $storeId, $orderNumber]);
91+
if ($this->lockManager->lock(self::LOCK_PREFIX . $lockName, self::LOCK_TIMEOUT)) {
92+
try {
93+
$reorderOutput = $this->reorder->execute($orderNumber, $storeId);
94+
} finally {
95+
$this->lockManager->unlock(self::LOCK_PREFIX . $lockName);
96+
}
97+
} else {
98+
throw new \Magento\Framework\Exception\LocalizedException(
99+
__('The reorder is locked for processing. The concurrent request has been aborted.')
100+
);
101+
}
78102

79103
return [
80104
'cart' => [
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
"The reorder is locked for processing. The concurrent request has been aborted.","The reorder is locked for processing. The concurrent request has been aborted."

0 commit comments

Comments
 (0)