UpdateUserHandler::__invoke()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 41

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 41
rs 9.264
c 0
b 0
f 0
cc 3
nc 3
nop 1
1
<?php
2
3
/*
4
 * This file has been created by developers from BitBag.
5
 * Feel free to contact us once you face any issues or want to start
6
 * another great project.
7
 * You can find more information about us on https://bitbag.io and write us
8
 * an email on [email protected].
9
 */
10
11
declare(strict_types=1);
12
13
namespace BitBag\SyliusVueStorefrontPlugin\CommandHandler\User;
14
15
use BitBag\SyliusVueStorefrontPlugin\Command\User\UpdateUser;
16
use BitBag\SyliusVueStorefrontPlugin\Sylius\Modifier\DefaultAddressModifierInterface;
17
use Doctrine\Common\Collections\Criteria;
18
use Doctrine\Persistence\ObjectManager;
19
use Sylius\Component\Addressing\Model\AddressInterface;
20
use Sylius\Component\Core\Factory\AddressFactoryInterface;
21
use Sylius\Component\Core\Model\CustomerInterface;
22
use Sylius\Component\Core\Repository\AddressRepositoryInterface;
23
use Sylius\Component\Core\Repository\CustomerRepositoryInterface;
24
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
25
26
final class UpdateUserHandler implements MessageHandlerInterface
27
{
28
    /** @var CustomerRepositoryInterface */
29
    private $customerRepository;
30
31
    /** @var AddressRepositoryInterface */
32
    private $addressRepository;
33
34
    /** @var AddressFactoryInterface */
35
    private $addressFactory;
36
37
    /** @var ObjectManager */
38
    private $objectManager;
39
40
    /** @var DefaultAddressModifierInterface */
41
    private $defaultAddressModifier;
42
43
    public function __construct(
44
        CustomerRepositoryInterface $customerRepository,
45
        AddressRepositoryInterface $addressRepository,
46
        AddressFactoryInterface $addressFactory,
47
        ObjectManager $objectManager,
48
        DefaultAddressModifierInterface $defaultAddressModifier
49
    ) {
50
        $this->customerRepository = $customerRepository;
51
        $this->addressRepository = $addressRepository;
52
        $this->addressFactory = $addressFactory;
53
        $this->objectManager = $objectManager;
54
        $this->defaultAddressModifier = $defaultAddressModifier;
55
    }
56
57
    public function __invoke(UpdateUser $command): void
58
    {
59
        /** @var CustomerInterface $customer */
60
        $customer = $this->customerRepository->findOneBy(['email' => $command->customer()->email]);
61
62
        $customer->setFirstName($command->customer()->firstname);
63
        $customer->setLastName($command->customer()->lastname);
64
65
        $addresses = $command->customer()->addresses();
66
67
        foreach ($addresses as $address) {
68
            /** @var AddressInterface $syliusAddress */
69
            $syliusAddress = $customer->getAddresses()
70
                ->matching(
71
                    Criteria::create()
72
                        ->where(Criteria::expr()->eq('id', $address->id))
73
                )
74
                ->first();
75
76
            if (false === $syliusAddress) {
77
                $syliusAddress = $this->addressFactory->createForCustomer($customer);
78
            }
79
80
            $syliusAddress->setProvinceCode((string) $address->region_id);
81
            $syliusAddress->setProvinceName((string) $address->region()->region);
82
            $syliusAddress->setCompany($address->company);
83
            $syliusAddress->setPhoneNumber($address->telephone);
84
            $syliusAddress->setPostcode($address->postcode);
85
            $syliusAddress->setCountryCode($address->country_id);
86
            $syliusAddress->setStreet(\implode(' ', $address->street));
87
            $syliusAddress->setCity($address->city);
88
            $syliusAddress->setFirstName($address->firstname);
89
            $syliusAddress->setLastName($address->lastname);
90
91
            $this->addressRepository->add($syliusAddress);
92
93
            $this->defaultAddressModifier->modify($customer, $syliusAddress);
94
        }
95
96
        $this->objectManager->flush();
97
    }
98
}
99