Skip to content

Commit 0e0946d

Browse files
committed
API: Product Reviews #55: product reviews web services
1 parent 45a6365 commit 0e0946d

File tree

70 files changed

+6049
-313
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

70 files changed

+6049
-313
lines changed

app/code/Magento/Review/Controller/Adminhtml/Product/Delete.php

+7-3
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33
* Copyright © Magento, Inc. All rights reserved.
44
* See COPYING.txt for license details.
55
*/
6+
67
namespace Magento\Review\Controller\Adminhtml\Product;
78

8-
use Magento\Review\Controller\Adminhtml\Product as ProductController;
99
use Magento\Framework\Controller\ResultFactory;
10+
use Magento\Review\Controller\Adminhtml\Product as ProductController;
1011

1112
class Delete extends ProductController
1213
{
@@ -17,9 +18,12 @@ public function execute()
1718
{
1819
/** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */
1920
$resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT);
20-
$reviewId = $this->getRequest()->getParam('id', false);
21+
$reviewId = (int)$this->getRequest()->getParam('id', false);
2122
try {
22-
$this->reviewFactory->create()->setId($reviewId)->aggregate()->delete();
23+
$review = $this->reviewFactory->create(
24+
['data' => ['review_id' => $reviewId]]
25+
);
26+
$review->delete();
2327

2428
$this->messageManager->addSuccess(__('The review has been deleted.'));
2529
if ($this->getRequest()->getParam('ret') == 'pending') {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Review\Model\Aggregator;
9+
10+
use Magento\Review\Model\ResourceModel\Review as ReviewResource;
11+
use Magento\ReviewApi\Api\Data\ReviewInterface;
12+
use Magento\ReviewApi\Model\AggregatorInterface;
13+
14+
/**
15+
* Class Ratings
16+
*/
17+
class Ratings implements AggregatorInterface
18+
{
19+
/**
20+
* @var ReviewResource
21+
*/
22+
private $reviewResource;
23+
24+
/**
25+
* Aggregator constructor
26+
*
27+
* @param ReviewResource $reviewResource
28+
*/
29+
public function __construct(
30+
ReviewResource $reviewResource
31+
) {
32+
$this->reviewResource = $reviewResource;
33+
}
34+
35+
/**
36+
* @inheritdoc
37+
*/
38+
public function aggregate(ReviewInterface $review): void
39+
{
40+
$this->reviewResource->reAggregateReview($review->getReviewId(), $review->getRelatedEntityId());
41+
}
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Review\Model\Aggregator;
9+
10+
use Magento\Review\Model\ResourceModel\Review as ReviewResource;
11+
use Magento\ReviewApi\Api\Data\ReviewInterface;
12+
use Magento\ReviewApi\Model\AggregatorInterface;
13+
14+
/**
15+
* Class Review
16+
*/
17+
class Review implements AggregatorInterface
18+
{
19+
/**
20+
* @var ReviewResource
21+
*/
22+
private $reviewResource;
23+
24+
/**
25+
* Aggregator constructor
26+
*
27+
* @param ReviewResource $reviewResource
28+
*/
29+
public function __construct(
30+
ReviewResource $reviewResource
31+
) {
32+
$this->reviewResource = $reviewResource;
33+
}
34+
35+
/**
36+
* @inheritdoc
37+
*/
38+
public function aggregate(ReviewInterface $review): void
39+
{
40+
$this->reviewResource->aggregate($review);
41+
}
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\Review\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor;
8+
9+
use Magento\Framework\Api\Filter;
10+
use Magento\Framework\Api\SearchCriteria\CollectionProcessor\FilterProcessor\CustomFilterInterface;
11+
use Magento\Framework\Data\Collection\AbstractDb;
12+
13+
/**
14+
* Class ReviewCustomerFilter
15+
*/
16+
class ReviewCustomerFilter implements CustomFilterInterface
17+
{
18+
/**
19+
* Apply customer_id Filter to Review Collection
20+
*
21+
* @param Filter $filter
22+
* @param AbstractDb $collection
23+
* @return bool Whether the filter is applied
24+
*/
25+
public function apply(Filter $filter, AbstractDb $collection)
26+
{
27+
/** @var \Magento\Review\Model\ResourceModel\Review\Collection $collection */
28+
$collection->addCustomerFilter($filter->getValue());
29+
30+
return true;
31+
}
32+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\Review\Model\Api\SearchCriteria\CollectionProcessor\FilterProcessor;
8+
9+
use Magento\Catalog\Model\ResourceModel\Product as ProductResource;
10+
use Magento\Framework\Api\Filter;
11+
use Magento\Framework\Api\SearchCriteria\CollectionProcessor\FilterProcessor\CustomFilterInterface;
12+
use Magento\Framework\Data\Collection\AbstractDb;
13+
14+
/**
15+
* Class ReviewSkuFilter
16+
*/
17+
class ReviewSkuFilter implements CustomFilterInterface
18+
{
19+
/**
20+
* Product resource
21+
*
22+
* @var ProductResource
23+
*/
24+
private $productResource;
25+
26+
/**
27+
* ReviewSkuFilter constructor
28+
*
29+
* @param ProductResource $productResource
30+
*/
31+
public function __construct(
32+
ProductResource $productResource
33+
) {
34+
$this->productResource = $productResource;
35+
}
36+
37+
/**
38+
* Apply sku Filter to Review Collection
39+
*
40+
* @param Filter $filter
41+
* @param AbstractDb $collection
42+
* @return bool Whether the filter is applied
43+
*/
44+
public function apply(Filter $filter, AbstractDb $collection)
45+
{
46+
$productId = $this->productResource->getIdBySku($filter->getValue());
47+
48+
/** @var \Magento\Review\Model\ResourceModel\Review\Collection $collection */
49+
$collection->addEntityFilter('product', $productId);
50+
51+
return true;
52+
}
53+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Review\Model\Command;
9+
10+
use Magento\Framework\Exception\InputException;
11+
use Magento\Framework\Serialize\SerializerInterface;
12+
use Magento\Review\Model\ResourceModel\Review\CreateMultiple;
13+
use Magento\ReviewApi\Api\CreateReviewsInterface;
14+
use Magento\ReviewApi\Api\Data\ReviewInterface;
15+
use Magento\ReviewApi\Api\ReviewOperationResponseInterface;
16+
use Magento\ReviewApi\Model\AggregatorInterface;
17+
use Magento\ReviewApi\Model\ReviewValidatorChain;
18+
use Psr\Log\LoggerInterface;
19+
20+
/**
21+
* Class CreateReviews
22+
*/
23+
class CreateReviews implements CreateReviewsInterface
24+
{
25+
/**
26+
* @var CreateMultiple
27+
*/
28+
private $createMultiple;
29+
30+
/**
31+
* @var ReviewValidatorChain
32+
*/
33+
private $reviewValidatorChain;
34+
35+
/**
36+
* @var AggregatorInterface
37+
*/
38+
private $reviewAggregator;
39+
40+
/**
41+
* @var ReviewOperationResponseInterface
42+
*/
43+
private $reviewOperationResponse;
44+
45+
/**
46+
* @var SerializerInterface
47+
*/
48+
private $jsonSerializer;
49+
50+
/**
51+
* @var LoggerInterface
52+
*/
53+
private $logger;
54+
55+
/**
56+
* CreateReviews constructor
57+
*
58+
* @param CreateMultiple $createMultiple
59+
* @param ReviewValidatorChain $reviewValidatorChain
60+
* @param AggregatorInterface $reviewAggregator
61+
* @param ReviewOperationResponseInterface $reviewOperationResponse
62+
* @param SerializerInterface $jsonSerializer
63+
* @param LoggerInterface $logger
64+
*/
65+
public function __construct(
66+
CreateMultiple $createMultiple,
67+
ReviewValidatorChain $reviewValidatorChain,
68+
AggregatorInterface $reviewAggregator,
69+
ReviewOperationResponseInterface $reviewOperationResponse,
70+
SerializerInterface $jsonSerializer,
71+
LoggerInterface $logger
72+
) {
73+
$this->createMultiple = $createMultiple;
74+
$this->reviewValidatorChain = $reviewValidatorChain;
75+
$this->reviewAggregator = $reviewAggregator;
76+
$this->reviewOperationResponse = $reviewOperationResponse;
77+
$this->jsonSerializer = $jsonSerializer;
78+
$this->logger = $logger;
79+
}
80+
81+
/**
82+
* @inheritdoc
83+
*/
84+
public function execute(array $reviews): ReviewOperationResponseInterface
85+
{
86+
if (empty($reviews)) {
87+
throw new InputException(__('Input data is empty'));
88+
}
89+
90+
$validReviews = [];
91+
$invalidReviews = [];
92+
93+
foreach ($reviews as $key => $review) {
94+
$validationResult = $this->reviewValidatorChain->validate($review);
95+
if (!$validationResult->isValid()) {
96+
$invalidReviews[] = $review;
97+
98+
$this->reviewOperationResponse->addError(
99+
$this->getErrorMessage($validationResult->getErrors(), $review)
100+
);
101+
continue;
102+
}
103+
$validReviews[] = $review;
104+
}
105+
106+
if (!empty($validReviews)) {
107+
try {
108+
$this->createMultiple->execute($validReviews);
109+
110+
foreach ($validReviews as $review) {
111+
$this->reviewAggregator->aggregate($review);
112+
}
113+
114+
$this->reviewOperationResponse->addSuccessfulReviews($validReviews);
115+
} catch (\Exception $e) {
116+
$this->reviewOperationResponse->addFailedReviews($validReviews);
117+
$this->reviewOperationResponse->addError(
118+
__('There was an error while saving the reviews.')
119+
);
120+
$this->logger->error($e->getMessage());
121+
}
122+
}
123+
if (!empty($invalidReviews)) {
124+
$this->reviewOperationResponse->addFailedReviews($invalidReviews);
125+
}
126+
127+
unset($validReviews);
128+
unset($invalidReviews);
129+
130+
return $this->reviewOperationResponse;
131+
}
132+
133+
/**
134+
* Get error message
135+
*
136+
* @param array $errors
137+
* @param ReviewInterface $review
138+
* @return string
139+
*/
140+
private function getErrorMessage(array $errors, ReviewInterface $review)
141+
{
142+
$errorMessage = sprintf(
143+
'%s => Request Data: %s:',
144+
implode(',', $errors),
145+
$this->jsonSerializer->serialize($review->toArray())
146+
);
147+
148+
return $errorMessage;
149+
}
150+
}

0 commit comments

Comments
 (0)