Skip to content

Commit 5a523cf

Browse files
committed
Only create a review request if it does not already exist for the order
1 parent 5fc7986 commit 5a523cf

File tree

4 files changed

+29
-2
lines changed

4 files changed

+29
-2
lines changed

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
"psr/event-dispatcher": "^1.0",
1616
"psr/log": "^1.1 || ^2.0 || ^3.0",
1717
"setono/composite-compiler-pass": "^1.1",
18+
"setono/doctrine-orm-trait": "^1.0.1",
1819
"sylius/core": "^1.0",
1920
"sylius/core-bundle": "^1.0",
2021
"sylius/mailer-bundle": "^1.8 || ^2.0",

src/EventSubscriber/CreateReviewRequestSubscriber.php

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,23 @@
55
namespace Setono\SyliusReviewPlugin\EventSubscriber;
66

77
use Doctrine\Persistence\ManagerRegistry;
8+
use Setono\Doctrine\ORMTrait;
89
use Setono\SyliusReviewPlugin\Factory\ReviewRequestFactoryInterface;
10+
use Setono\SyliusReviewPlugin\Repository\ReviewRequestRepositoryInterface;
911
use Sylius\Bundle\ResourceBundle\Event\ResourceControllerEvent;
1012
use Sylius\Component\Core\Model\OrderInterface;
1113
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
1214
use Webmozart\Assert\Assert;
1315

1416
final class CreateReviewRequestSubscriber implements EventSubscriberInterface
1517
{
18+
use ORMTrait;
19+
1620
public function __construct(
17-
private readonly ManagerRegistry $managerRegistry,
21+
ManagerRegistry $managerRegistry,
1822
private readonly ReviewRequestFactoryInterface $reviewRequestFactory,
1923
) {
24+
$this->managerRegistry = $managerRegistry;
2025
}
2126

2227
public static function getSubscribedEvents(): array
@@ -34,6 +39,12 @@ public function create(ResourceControllerEvent $event): void
3439

3540
$reviewRequest = $this->reviewRequestFactory->createFromOrder($order);
3641

37-
$this->managerRegistry->getManagerForClass($reviewRequest::class)?->persist($reviewRequest);
42+
/** @var ReviewRequestRepositoryInterface $reviewRequestRepository */
43+
$reviewRequestRepository = $this->getRepository($reviewRequest, ReviewRequestRepositoryInterface::class);
44+
if ($reviewRequestRepository->hasExistingForOrder($order)) {
45+
return;
46+
}
47+
48+
$this->getManager($reviewRequest)->persist($reviewRequest);
3849
}
3950
}

src/Repository/ReviewRequestRepository.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use Doctrine\ORM\QueryBuilder;
88
use Setono\SyliusReviewPlugin\Model\ReviewRequestInterface;
99
use Sylius\Bundle\ResourceBundle\Doctrine\ORM\EntityRepository;
10+
use Sylius\Component\Core\Model\OrderInterface;
1011

1112
class ReviewRequestRepository extends EntityRepository implements ReviewRequestRepositoryInterface
1213
{
@@ -41,4 +42,15 @@ public function removeCancelled(): void
4142
->execute()
4243
;
4344
}
45+
46+
public function hasExistingForOrder(OrderInterface $order): bool
47+
{
48+
return (int) $this->createQueryBuilder('o')
49+
->select('COUNT(o.id)')
50+
->andWhere('o.order = :order')
51+
->setParameter('order', $order)
52+
->getQuery()
53+
->getSingleScalarResult() > 0
54+
;
55+
}
4456
}

src/Repository/ReviewRequestRepositoryInterface.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Setono\SyliusReviewPlugin\Repository;
66

77
use Doctrine\ORM\QueryBuilder;
8+
use Sylius\Component\Core\Model\OrderInterface;
89
use Sylius\Component\Resource\Repository\RepositoryInterface;
910

1011
interface ReviewRequestRepositoryInterface extends RepositoryInterface
@@ -20,4 +21,6 @@ public function removeBefore(\DateTimeInterface $threshold): void;
2021
* Removes all review requests that are cancelled
2122
*/
2223
public function removeCancelled(): void;
24+
25+
public function hasExistingForOrder(OrderInterface $order): bool;
2326
}

0 commit comments

Comments
 (0)