Skip to content

Commit c99a5e7

Browse files
authored
Adding Meta-transmitted exception logging to all key order observers (#615)
* Adding Meta-transmitted exception logging to all key order observers * Refactoring code to provide correct store ID, and moving shared logic to a trait * changing type * post-testing changes * spacing fixes * Comment tweak to trigger static tests * Responding to static test failures: no superfluous public functions * Responding to static test failures: no superfluous public function * At Noah's suggestion, breaking each exception into its own event, and making type a dynamic value * events should be lowercase * lint fixes * cyclomatic complexity * npathcomplexity
1 parent 2014271 commit c99a5e7

File tree

4 files changed

+244
-17
lines changed

4 files changed

+244
-17
lines changed
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/**
6+
* Copyright (c) Meta Platforms, Inc. and affiliates.
7+
*
8+
* Licensed under the Apache License, Version 2.0 (the "License");
9+
* you may not use this file except in compliance with the License.
10+
* You may obtain a copy of the License at
11+
*
12+
* http://www.apache.org/licenses/LICENSE-2.0
13+
*
14+
* Unless required by applicable law or agreed to in writing, software
15+
* distributed under the License is distributed on an "AS IS" BASIS,
16+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17+
* See the License for the specific language governing permissions and
18+
* limitations under the License.
19+
*/
20+
21+
namespace Meta\Sales\Observer;
22+
23+
use Magento\Framework\Event\Observer;
24+
use Meta\BusinessExtension\Helper\FBEHelper;
25+
use Throwable;
26+
27+
trait MetaObserverTrait
28+
{
29+
/**
30+
* Execute function
31+
*
32+
* @param Observer $observer
33+
* @return void
34+
* @throws Throwable
35+
*/
36+
public function execute(Observer $observer)
37+
{
38+
try {
39+
$this->executeImpl($observer);
40+
} catch (Throwable $e) {
41+
$storeId = $this->getStoreId($observer);
42+
$this->getFBEHelper()->logExceptionImmediatelyToMeta(
43+
$e,
44+
[
45+
'store_id' => $storeId,
46+
'event' => $this->getExceptionEvent() ?? "order_observer_exception",
47+
'event_type' => strtolower(get_class($e))
48+
]
49+
);
50+
throw $e;
51+
}
52+
}
53+
54+
/**
55+
* Implementation of the execute function
56+
*
57+
* @param Observer $observer
58+
* @return void
59+
*/
60+
abstract protected function executeImpl(Observer $observer);
61+
62+
/**
63+
* Get Facebook Event Helper
64+
*
65+
* @return FBEHelper
66+
*/
67+
abstract protected function getFBEHelper();
68+
69+
/**
70+
* Get Store ID
71+
*
72+
* @param Observer $observer
73+
* @return string
74+
*/
75+
abstract protected function getStoreId(Observer $observer);
76+
77+
/**
78+
* Get Exception Event
79+
*
80+
* @return string
81+
*/
82+
abstract protected function getExceptionEvent();
83+
}

app/code/Meta/Sales/Observer/Order/Cancel.php

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,22 @@
2020

2121
namespace Meta\Sales\Observer\Order;
2222

23-
use Exception;
2423
use GuzzleHttp\Exception\GuzzleException;
2524
use Magento\Framework\Event\Observer;
2625
use Magento\Framework\Event\ObserverInterface;
2726
use Magento\Sales\Model\Order;
27+
use Meta\BusinessExtension\Helper\FBEHelper;
2828
use Meta\BusinessExtension\Model\System\Config as SystemConfig;
2929
use Meta\Sales\Helper\OrderHelper;
3030
use Meta\Sales\Model\Order\CreateCancellation;
3131
use Meta\Sales\Helper\CommerceHelper;
3232

33+
use Meta\Sales\Observer\MetaObserverTrait;
34+
3335
class Cancel implements ObserverInterface
3436
{
37+
use MetaObserverTrait;
38+
3539
/**
3640
* @var SystemConfig
3741
*/
@@ -47,21 +51,60 @@ class Cancel implements ObserverInterface
4751
*/
4852
private CommerceHelper $commerceHelper;
4953

54+
/**
55+
* @var FBEHelper
56+
*/
57+
private FBEHelper $fbeHelper;
58+
5059
/**
5160
* Constructor
5261
*
5362
* @param SystemConfig $systemConfig
5463
* @param OrderHelper $orderHelper
5564
* @param CommerceHelper $commerceHelper
65+
* @param FBEHelper $fbeHelper
5666
*/
5767
public function __construct(
5868
SystemConfig $systemConfig,
5969
OrderHelper $orderHelper,
60-
CommerceHelper $commerceHelper
70+
CommerceHelper $commerceHelper,
71+
FBEHelper $fbeHelper
6172
) {
6273
$this->systemConfig = $systemConfig;
6374
$this->orderHelper = $orderHelper;
6475
$this->commerceHelper = $commerceHelper;
76+
$this->fbeHelper = $fbeHelper;
77+
}
78+
79+
/**
80+
* Get Exception Event
81+
*
82+
* @return string
83+
*/
84+
protected function getExceptionEvent()
85+
{
86+
return 'refund_observer_exception';
87+
}
88+
89+
/**
90+
* Get Store ID
91+
*
92+
* @param Observer $observer
93+
* @return string
94+
*/
95+
protected function getStoreId(Observer $observer)
96+
{
97+
return $observer->getEvent()->getOrder()->getStoreId();
98+
}
99+
100+
/**
101+
* Get Facebook Event Helper
102+
*
103+
* @return FBEHelper
104+
*/
105+
protected function getFBEHelper()
106+
{
107+
return $this->fbeHelper;
65108
}
66109

67110
/**
@@ -71,11 +114,11 @@ public function __construct(
71114
* @return void
72115
* @throws GuzzleException
73116
*/
74-
public function execute(Observer $observer)
117+
protected function executeImpl(Observer $observer)
75118
{
76119
/** @var Order $order */
77120
$order = $observer->getEvent()->getOrder();
78-
$storeId = $order->getStoreId();
121+
$storeId = $this->getStoreId($observer);
79122

80123
if (!($this->systemConfig->isOrderSyncEnabled($storeId)
81124
&& $this->systemConfig->isOnsiteCheckoutEnabled($storeId))) {

app/code/Meta/Sales/Observer/Order/Refund.php

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,13 @@
3232
use Meta\BusinessExtension\Helper\GraphAPIAdapter;
3333
use Meta\BusinessExtension\Model\System\Config as SystemConfig;
3434
use Meta\Sales\Api\Data\FacebookOrderInterfaceFactory;
35-
use Psr\Log\LoggerInterface;
35+
use Meta\BusinessExtension\Helper\FBEHelper;
36+
use Meta\Sales\Observer\MetaObserverTrait;
3637

3738
class Refund implements ObserverInterface
3839
{
40+
use MetaObserverTrait;
41+
3942
/**
4043
* @var SystemConfig
4144
*/
@@ -51,19 +54,58 @@ class Refund implements ObserverInterface
5154
*/
5255
private FacebookOrderInterfaceFactory $facebookOrderFactory;
5356

57+
/**
58+
* @var FBEHelper
59+
*/
60+
private FBEHelper $fbeHelper;
61+
5462
/**
5563
* @param SystemConfig $systemConfig
5664
* @param GraphAPIAdapter $graphAPIAdapter
5765
* @param FacebookOrderInterfaceFactory $facebookOrderFactory
66+
* @param FBEHelper $fbeHelper
5867
*/
5968
public function __construct(
6069
SystemConfig $systemConfig,
6170
GraphAPIAdapter $graphAPIAdapter,
62-
FacebookOrderInterfaceFactory $facebookOrderFactory
71+
FacebookOrderInterfaceFactory $facebookOrderFactory,
72+
FBEHelper $fbeHelper
6373
) {
6474
$this->systemConfig = $systemConfig;
6575
$this->graphAPIAdapter = $graphAPIAdapter;
6676
$this->facebookOrderFactory = $facebookOrderFactory;
77+
$this->fbeHelper = $fbeHelper;
78+
}
79+
80+
/**
81+
* Get Exception Event
82+
*
83+
* @return string
84+
*/
85+
protected function getExceptionEvent()
86+
{
87+
return 'refund_observer_exception';
88+
}
89+
90+
/**
91+
* Get Store ID
92+
*
93+
* @param Observer $observer
94+
* @return string
95+
*/
96+
protected function getStoreId(Observer $observer)
97+
{
98+
return $observer->getEvent()->getPayment()->getOrder()->getStoreId();
99+
}
100+
101+
/**
102+
* Get Facebook Event Helper
103+
*
104+
* @return FBEHelper
105+
*/
106+
protected function getFBEHelper(): FBEHelper
107+
{
108+
return $this->fbeHelper;
67109
}
68110

69111
/**
@@ -72,8 +114,10 @@ public function __construct(
72114
* @param Observer $observer
73115
* @return void
74116
* @throws GuzzleException|Exception
117+
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
118+
* @SuppressWarnings(PHPMD.NPathComplexity)
75119
*/
76-
public function execute(Observer $observer)
120+
protected function executeImpl(Observer $observer)
77121
{
78122
/** @var Payment $payment */
79123
$payment = $observer->getEvent()->getPayment();
@@ -97,7 +141,7 @@ public function execute(Observer $observer)
97141
return;
98142
}
99143

100-
// @todo fix magento bug with incorrectly loading order in credit memo resulting in missing extension attributes
144+
// @todo fix magento bug with incorrectly loading order in credit memo causing missing extension attributes
101145
// https://github.com/magento/magento2/issues/23345
102146

103147
$facebookOrder = $this->facebookOrderFactory->create();
@@ -109,6 +153,7 @@ public function execute(Observer $observer)
109153

110154
$deductionAmount = $creditmemo->getAdjustment();
111155
if ($deductionAmount > 0) {
156+
// TODO: Add Telemetry rather than counting exceptions.
112157
throw new Exception('Cannot refund order on Meta. Adjustment Refunds are not yet supported.');
113158
} elseif ($deductionAmount < 0) {
114159
// Magento allows Adjustment Fees to be negative, but the Graph API deductions must always be positive
@@ -123,7 +168,6 @@ public function execute(Observer $observer)
123168
if ($currencyCode === 'GBP') {
124169
$shippingRefundAmount += $creditmemo->getShippingTaxAmount();
125170
}
126-
127171
try {
128172
$refundItemsBySku = $this->getRefundItems($creditmemo, $payment, false);
129173
$this->refundOrder(
@@ -147,7 +191,6 @@ public function execute(Observer $observer)
147191
$reasonText
148192
);
149193
}
150-
151194
$payment->getOrder()->addCommentToStatusHistory('Order Refunded on Meta');
152195
}
153196

0 commit comments

Comments
 (0)