From 2e27eac9990ba8153d8ef99f672a06068eef0409 Mon Sep 17 00:00:00 2001 From: david Date: Tue, 11 Jul 2023 17:19:38 +0300 Subject: [PATCH 1/2] refactor controllers and frontend --- Controller/Roundup/Create.php | 59 ++++++++++--------- Controller/Roundup/Remove.php | 50 +++++++++------- Model/Total/Donation.php | 12 ++-- view/frontend/web/js/view/cart/donmo-block.js | 25 +++++--- .../js/view/checkout/summary/donmo-block.js | 22 ++++--- 5 files changed, 96 insertions(+), 72 deletions(-) diff --git a/Controller/Roundup/Create.php b/Controller/Roundup/Create.php index 0ae4b10..f53364b 100644 --- a/Controller/Roundup/Create.php +++ b/Controller/Roundup/Create.php @@ -2,39 +2,36 @@ namespace Donmo\Roundup\Controller\Roundup; -use Magento\Checkout\Model\Cart as CustomerCart; +use Donmo\Roundup\Logger\Logger; use Magento\Framework\App\Action\HttpPostActionInterface; use Magento\Framework\Controller\ResultFactory; use Magento\Framework\Webapi\Rest\Request; -use Magento\Quote\Model\Quote; -use Magento\Checkout\Model\Session; +use Magento\Checkout\Model\Session as CheckoutSession; use Magento\Quote\Api\CartRepositoryInterface; + class Create implements HttpPostActionInterface { - - /** - * @var Request - */ - private $request; + private Logger $logger; + private ResultFactory $resultFactory; + private Request $request; + private CheckoutSession $checkoutSession; + private CartRepositoryInterface $cartRepository; public function __construct( ResultFactory $resultFactory, Request $request, - Quote $quote, - Session $checkoutSession, - CartRepositoryInterface $quoteRepository, - CustomerCart $cart, + CheckoutSession $checkoutSession, + CartRepositoryInterface $cartRepository, + Logger $logger ) { + $this->logger = $logger; $this->resultFactory = $resultFactory; $this->request = $request; - $this->quote = $quote; $this->checkoutSession = $checkoutSession; - $this->quoteRepository = $quoteRepository; - $this->cart = $cart; + $this->cartRepository = $cartRepository; } - public function execute() { // Add Donation to quote @@ -42,17 +39,25 @@ public function execute() $donationAmount = floatval($this->request->getBodyParams()['amount']); - $cartQuote = $this->cart->getQuote(); - $cartQuote->setDonmodonation($donationAmount)->collectTotals(); - $this->quoteRepository->save($cartQuote); - $this->checkoutSession->setCartGrandTotal($cartQuote->getGrandTotal()); - - $jsonResponse->setData( - [ - 'status' => 'success', - 'donationAmount' => $donationAmount - ] - ); + if ($this->checkoutSession->hasQuote()) { + $quote = $this->checkoutSession->getQuote(); + + $quote->setDonmodonation($donationAmount)->collectTotals(); + $this->cartRepository->save($quote); + + $jsonResponse->setData( + [ + 'message' => 'success', + ] + ); + } else { + $jsonResponse->setHttpResponseCode(404); + + $jsonResponse->setData( + ['message' => 'no quote provided'] + ); + } + return $jsonResponse; } } diff --git a/Controller/Roundup/Remove.php b/Controller/Roundup/Remove.php index 845ce34..1017425 100644 --- a/Controller/Roundup/Remove.php +++ b/Controller/Roundup/Remove.php @@ -2,49 +2,55 @@ namespace Donmo\Roundup\Controller\Roundup; -use Magento\Checkout\Model\Cart as CustomerCart; +use Donmo\Roundup\Logger\Logger; use Magento\Checkout\Model\Session; use Magento\Framework\App\Action\HttpDeleteActionInterface; use Magento\Framework\Controller\ResultFactory; -use Magento\Framework\Webapi\Rest\Request; use Magento\Quote\Api\CartRepositoryInterface; -use Magento\Quote\Model\Quote; class Remove implements HttpDeleteActionInterface { + private Logger $logger; + private ResultFactory $resultFactory; + private Session $checkoutSession; + private CartRepositoryInterface $cartRepository; + public function __construct( ResultFactory $resultFactory, - Request $request, - Quote $quote, Session $checkoutSession, - CartRepositoryInterface $quoteRepository, - CustomerCart $cart + CartRepositoryInterface $cartRepository, + Logger $logger ) { $this->resultFactory = $resultFactory; - $this->request = $request; - $this->quote = $quote; $this->checkoutSession = $checkoutSession; - $this->quoteRepository = $quoteRepository; - $this->cart = $cart; + $this->cartRepository = $cartRepository; + $this->logger = $logger; } public function execute() { // Remove Donation from quote $jsonResponse = $this->resultFactory->create(ResultFactory::TYPE_JSON); - $cartQuote = $this->cart->getQuote(); - $cartQuote->setDonmodonation(0)->collectTotals(); - $this->quoteRepository->save($cartQuote); - $this->checkoutSession->setCartGrandTotal($cartQuote->getGrandTotal()); - - $total = $cartQuote->getGrandTotal(); - $jsonResponse->setData( - [ - 'total' => $total - ] - ); + if ($this->checkoutSession->hasQuote()) { + $quote = $this->checkoutSession->getQuote(); + + $quote->setDonmodonation(0)->collectTotals(); + $this->cartRepository->save($quote); + + $jsonResponse->setData( + [ + 'message' => 'success' + ] + ); + } else { + $jsonResponse->setHttpResponseCode(404); + + $jsonResponse->setData( + ['message' => 'no quote provided'] + ); + } return $jsonResponse; } } diff --git a/Model/Total/Donation.php b/Model/Total/Donation.php index 586c69a..091ef93 100644 --- a/Model/Total/Donation.php +++ b/Model/Total/Donation.php @@ -2,30 +2,26 @@ namespace Donmo\Roundup\Model\Total; - use Magento\Quote\Api\Data\ShippingAssignmentInterface; use Magento\Quote\Model\Quote; use Magento\Quote\Model\Quote\Address\Total; use Magento\Quote\Model\Quote\Address\Total\AbstractTotal; use Donmo\Roundup\Model\Config as DonmoConfig; + class Donation extends AbstractTotal { private DonmoConfig $donmoConfig; public function __construct(DonmoConfig $donmoConfig) { $this->donmoConfig = $donmoConfig; - $this->setCode('donmodonation'); } - - /** * @param Quote $quote * @param ShippingAssignmentInterface $shippingAssignment * @param Total $total * @return $this */ - public function collect( Quote $quote, ShippingAssignmentInterface $shippingAssignment, @@ -38,9 +34,9 @@ public function collect( $donationAmount = $quote->getDonmodonation(); - $total->addTotalAmount($this->getCode(), $donationAmount); + $total->setTotalAmount('donmodonation', $donationAmount); - $total->addBaseTotalAmount($this->getCode(), $donationAmount); + $total->setBaseTotalAmount('donmodonation', $donationAmount); return $this; } @@ -51,7 +47,7 @@ public function fetch(Quote $quote, Total $total) $donationAmount = $quote->getDonmodonation(); if ($donationAmount) { return [ - 'code' => $this->getCode(), + 'code' => 'donmodonation', 'title' => $this->donmoConfig->getDonationLabel(), 'value' => $donationAmount ]; diff --git a/view/frontend/web/js/view/cart/donmo-block.js b/view/frontend/web/js/view/cart/donmo-block.js index 9512efd..d86b848 100644 --- a/view/frontend/web/js/view/cart/donmo-block.js +++ b/view/frontend/web/js/view/cart/donmo-block.js @@ -4,7 +4,7 @@ define([ 'Magento_Checkout/js/model/totals', 'Magento_Checkout/js/model/quote', 'mage/url', - 'Magento_Checkout/js/action/get-totals', + 'Magento_Checkout/js/action/get-payment-information' ], function (Component, ko, totals, quote, url, getTotalsAction) { return Component.extend({ defaults: { @@ -12,8 +12,7 @@ define([ }, grandTotal: ko.observable(quote.totals()['grand_total']), - - addDonation: ({ donationAmount }) => { + addDonation: ({ donationAmount }) => { const path = url.build('donmo/roundup/create'); fetch(path, { @@ -25,9 +24,13 @@ define([ body: JSON.stringify({ amount: donationAmount }) - }).then(response => response.json()).then(() => getTotalsAction([])) + }).then(response => { + if(!response.ok) { + throw new Error(); + } + return response.json() + }).then(() => getTotalsAction()) }, - removeDonation: () => { const path = url.build('donmo/roundup/remove'); @@ -36,8 +39,13 @@ define([ headers: { 'X-Requested-With': 'XMLHttpRequest' } - }).then(response => response.json()).then( - () => getTotalsAction([])).then(() => console.log('remove donation completed')) + }).then(response => { + if(! response.ok) { + throw new Error(); + } + return response.json() + }).then( + () => getTotalsAction()) }, insertIntegration: function (){ @@ -57,9 +65,10 @@ define([ getGrandTotal: () => quote.totals()['grand_total'], } ) + donmo.build() - // on totals change, trigger grandTotal observable with new value + // on totals change, trigger grandTotal observable with its value quote.totals.subscribe((data) => this.grandTotal(data['grand_total'])) // on grandTotal change, refresh donmo integration diff --git a/view/frontend/web/js/view/checkout/summary/donmo-block.js b/view/frontend/web/js/view/checkout/summary/donmo-block.js index 840321b..d86b848 100644 --- a/view/frontend/web/js/view/checkout/summary/donmo-block.js +++ b/view/frontend/web/js/view/checkout/summary/donmo-block.js @@ -5,7 +5,7 @@ define([ 'Magento_Checkout/js/model/quote', 'mage/url', 'Magento_Checkout/js/action/get-payment-information' -], function (Component, ko, totals, quote, url, getPaymentInformation) { +], function (Component, ko, totals, quote, url, getTotalsAction) { return Component.extend({ defaults: { template: 'Donmo_Roundup/checkout/summary/donmo-block', @@ -24,7 +24,12 @@ define([ body: JSON.stringify({ amount: donationAmount }) - }).then(response => response.json()).then(() => getPaymentInformation()) + }).then(response => { + if(!response.ok) { + throw new Error(); + } + return response.json() + }).then(() => getTotalsAction()) }, removeDonation: () => { const path = url.build('donmo/roundup/remove'); @@ -34,13 +39,16 @@ define([ headers: { 'X-Requested-With': 'XMLHttpRequest' } - }).then(response => response.json()).then( - () => getPaymentInformation()).then(() => console.log('remove donation completed')) + }).then(response => { + if(! response.ok) { + throw new Error(); + } + return response.json() + }).then( + () => getTotalsAction()) }, insertIntegration: function (){ - console.log('quote id', quote.getQuoteId()) - const donmo = DonmoRoundup( { publicKey: this.donmoConfig.publicKey, @@ -60,7 +68,7 @@ define([ donmo.build() - // on totals change, trigger grandTotal observable with new value + // on totals change, trigger grandTotal observable with its value quote.totals.subscribe((data) => this.grandTotal(data['grand_total'])) // on grandTotal change, refresh donmo integration From 928535b52877f2029cb1934692bb174159e393ca Mon Sep 17 00:00:00 2001 From: david Date: Thu, 13 Jul 2023 12:12:13 +0300 Subject: [PATCH 2/2] add graphql support --- Model/Resolver/AddDonationToQuote.php | 44 ++++++++++++++++++++++ Model/Resolver/DonationResolver.php | 31 +++++++++++++++ Model/Resolver/RemoveDonationFromQuote.php | 44 ++++++++++++++++++++++ etc/schema.graphqls | 16 ++++++++ 4 files changed, 135 insertions(+) create mode 100644 Model/Resolver/AddDonationToQuote.php create mode 100644 Model/Resolver/DonationResolver.php create mode 100644 Model/Resolver/RemoveDonationFromQuote.php create mode 100644 etc/schema.graphqls diff --git a/Model/Resolver/AddDonationToQuote.php b/Model/Resolver/AddDonationToQuote.php new file mode 100644 index 0000000..c22a211 --- /dev/null +++ b/Model/Resolver/AddDonationToQuote.php @@ -0,0 +1,44 @@ +logger = $logger; + $this->cartRepository = $cartRepository; + $this->maskedQuoteIdToQuoteId = $maskedQuoteIdToQuoteId; + } + + public function resolve(Field $field, $context, ResolveInfo $info, array $value = null, array $args = null) + { + $donationAmount = $args['donationAmount']; + $maskedId = $args['cartId']; + + $quoteId = $this->maskedQuoteIdToQuoteId->execute($maskedId); + + $quote = $this->cartRepository->get($quoteId); + + $quote->setDonmodonation($donationAmount)->collectTotals(); + $this->cartRepository->save($quote); + + return ['message' => 'success']; + } +} diff --git a/Model/Resolver/DonationResolver.php b/Model/Resolver/DonationResolver.php new file mode 100644 index 0000000..e436946 --- /dev/null +++ b/Model/Resolver/DonationResolver.php @@ -0,0 +1,31 @@ +logger = $logger; + } + + public function resolve(Field $field, $context, ResolveInfo $info, array $value = null, array $args = null) + { + /** @var Quote $quote */ + $quote = $value['model']; + + $donmoDonation = $quote->getDonmodonation(); + + $currency = $quote->getQuoteCurrencyCode(); + + return ['value' => $donmoDonation, 'currency' => $currency]; + } +} diff --git a/Model/Resolver/RemoveDonationFromQuote.php b/Model/Resolver/RemoveDonationFromQuote.php new file mode 100644 index 0000000..92b7849 --- /dev/null +++ b/Model/Resolver/RemoveDonationFromQuote.php @@ -0,0 +1,44 @@ +logger = $logger; + $this->cartRepository = $cartRepository; + $this->maskedQuoteIdToQuoteId = $maskedQuoteIdToQuoteId; + } + + + public function resolve(Field $field, $context, ResolveInfo $info, array $value = null, array $args = null) + { + $maskedId = $args['cartId']; + + $quoteId = $this->maskedQuoteIdToQuoteId->execute($maskedId); + + $quote = $this->cartRepository->get($quoteId); + + $quote->setDonmodonation(0)->collectTotals(); + $this->cartRepository->save($quote); + + return ['message' => 'success']; + } +} diff --git a/etc/schema.graphqls b/etc/schema.graphqls new file mode 100644 index 0000000..1cafa06 --- /dev/null +++ b/etc/schema.graphqls @@ -0,0 +1,16 @@ +type CartPrices @doc(description: "Contains details about the final price of items in the cart, including discount and tax information.") { + donmo_donation: Money + @doc(description: "Donmo Roundup donation") + @resolver(class: "\\Donmo\\Roundup\\Model\\Resolver\\DonationResolver") +} + +type Mutation { + addDonationToQuote(cartId: String!, donationAmount: Float!): DonmoDonationOutput @resolver(class: "\\Donmo\\Roundup\\Model\\Resolver\\AddDonationToQuote") @doc(description:"Add Donmo donation to quote") + + removeDonationFromQuote(cartId: String!): DonmoDonationOutput @resolver(class: "\\Donmo\\Roundup\\Model\\Resolver\\RemoveDonationFromQuote") @doc(description:"Remove Donmo donation from quote") +} + +type DonmoDonationOutput { + message: String @doc(description: "Result message") +} +