<?php
declare(strict_types=1);
namespace BitBag\OpenMarketplace\Component\Organization\EventListener;
use BitBag\OpenMarketplace\Component\Core\Shop\Checker\ReCaptchaCheckerInterface;
use BitBag\OpenMarketplace\Component\Customer\Model\CustomerInterface;
use BitBag\OpenMarketplace\Component\Inquiry\Entity\InquiryInterface;
use BitBag\OpenMarketplace\Component\Inquiry\Entity\MessageInterface as InquiryMessageInterface;
use BitBag\OpenMarketplace\Component\Organization\Email\OrganizationEmailManagerInterface;
use BitBag\OpenMarketplace\Component\Organization\Entity\OrganizationInterface;
use BitBag\OpenMarketplace\Component\Organization\Manager\RegistrationConflictManager;
use BitBag\OpenMarketplace\Component\RFQ\Entity\MessageInterface as RFQMessageInterface;
use BitBag\OpenMarketplace\Component\RFQ\Entity\RFQInterface;
use BitBag\OpenMarketplace\Component\Vendor\Repository\CustomerRepositoryInterface;
use Sylius\Bundle\ResourceBundle\Event\ResourceControllerEvent;
final class SimpleRegistrationEventListener
{
public function __construct(
private CustomerRepositoryInterface $customerRepository,
private OrganizationEmailManagerInterface $emailManager,
private RegistrationConflictManager $registrationConflictManager,
private ReCaptchaCheckerInterface $reCaptchaChecker
) {
}
public function __invoke(ResourceControllerEvent $event): void
{
$object = $event->getSubject();
if (!$object instanceof InquiryInterface && !$object instanceof RFQInterface) {
return;
}
if (!$this->reCaptchaChecker->checkIsValid($object->getRecaptcha())) {
$event->stop('open_marketplace.recaptcha.invalid', 'error');
return;
}
$customer = $object->getCustomer();
if (!$customer instanceof CustomerInterface) {
return;
}
$this->registrationConflictManager->manage($event);
if ($event->isPropagationStopped()) {
return;
}
$this->assignToOrganization($customer, $object, true);
$this->customerRepository->add($customer);
$this->emailManager->sendActivationEmail($customer, $object);
}
private function assignToOrganization(
CustomerInterface $customer,
InquiryInterface|RFQInterface $object,
bool $assignEmail = false
): void {
$organization = $customer->getOrganization();
if (!$organization instanceof OrganizationInterface) {
return;
}
$object->setBuyer($organization);
if (true === $assignEmail) {
$organization->setEmail($customer->getEmail() ?? '');
}
/** @var RFQMessageInterface|InquiryMessageInterface $message */
foreach ($object->getMessages() as $message) {
$message->setCustomer($customer);
}
}
}