1
1
<?php
2
2
/**
3
- * Copyright © Magento, Inc. All rights reserved.
4
- * See COPYING.txt for license details .
3
+ * Copyright 2020 Adobe
4
+ * All Rights Reserved .
5
5
*/
6
6
declare (strict_types=1 );
7
7
11
11
use Magento \Framework \GraphQl \Exception \GraphQlAuthorizationException ;
12
12
use Magento \Framework \GraphQl \Query \ResolverInterface ;
13
13
use Magento \Framework \GraphQl \Schema \Type \ResolveInfo ;
14
+ use Magento \Framework \Lock \LockManagerInterface ;
14
15
use Magento \GraphQl \Model \Query \ContextInterface ;
15
16
use Magento \Sales \Model \Reorder \Data \Error ;
16
17
use Magento \Sales \Model \OrderFactory ;
@@ -26,6 +27,10 @@ class Reorder implements ResolverInterface
26
27
*/
27
28
private const ARGUMENT_ORDER_NUMBER = 'orderNumber ' ;
28
29
30
+ private const LOCK_PREFIX = 'reorder_lock_ ' ;
31
+
32
+ private const LOCK_TIMEOUT = 60 ;
33
+
29
34
/**
30
35
* @var OrderFactory
31
36
*/
@@ -36,16 +41,24 @@ class Reorder implements ResolverInterface
36
41
*/
37
42
private $ reorder ;
38
43
44
+ /**
45
+ * @var LockManagerInterface
46
+ */
47
+ private $ lockManager ;
48
+
39
49
/**
40
50
* @param \Magento\Sales\Model\Reorder\Reorder $reorder
41
51
* @param OrderFactory $orderFactory
52
+ * @param LockManagerInterface $lockManager
42
53
*/
43
54
public function __construct (
44
55
\Magento \Sales \Model \Reorder \Reorder $ reorder ,
45
- OrderFactory $ orderFactory
56
+ OrderFactory $ orderFactory ,
57
+ LockManagerInterface $ lockManager
46
58
) {
47
59
$ this ->orderFactory = $ orderFactory ;
48
60
$ this ->reorder = $ reorder ;
61
+ $ this ->lockManager = $ lockManager ;
49
62
}
50
63
51
64
/**
@@ -74,7 +87,18 @@ public function resolve(
74
87
);
75
88
}
76
89
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
+ }
78
102
79
103
return [
80
104
'cart ' => [
0 commit comments