inklabs/kommerce-core

View on GitHub
src/ActionHandler/Order/CreateOrderFromCartHandler.php

Summary

Maintainability
A
1 hr
Test Coverage
<?php
namespace inklabs\kommerce\ActionHandler\Order;

use inklabs\kommerce\Action\Order\CreateOrderFromCartCommand;
use inklabs\kommerce\EntityRepository\CartRepositoryInterface;
use inklabs\kommerce\EntityDTO\Builder\CreditCardDTOBuilder;
use inklabs\kommerce\EntityDTO\Builder\DTOBuilderFactoryInterface;
use inklabs\kommerce\EntityDTO\Builder\OrderAddressDTOBuilder;
use inklabs\kommerce\EntityRepository\UserRepositoryInterface;
use inklabs\kommerce\Lib\Authorization\AuthorizationContextInterface;
use inklabs\kommerce\Lib\CartCalculatorInterface;
use inklabs\kommerce\Lib\Command\CommandHandlerInterface;
use inklabs\kommerce\Service\OrderServiceInterface;

final class CreateOrderFromCartHandler implements CommandHandlerInterface
{
    /** @var CreateOrderFromCartCommand */
    private $command;

    /** @var CartRepositoryInterface */
    private $cartRepository;

    /** @var CartCalculatorInterface */
    private $cartCalculator;

    /** @var OrderServiceInterface */
    private $orderService;

    /** @var UserRepositoryInterface */
    private $userRepository;

    /** @var DTOBuilderFactoryInterface */
    private $dtoBuilderFactory;

    public function __construct(
        CreateOrderFromCartCommand $command,
        CartRepositoryInterface $cartRepository,
        CartCalculatorInterface $cartCalculator,
        OrderServiceInterface $orderService,
        UserRepositoryInterface $userRepository,
        DTOBuilderFactoryInterface $dtoBuilderFactory
    ) {
        $this->cartRepository = $cartRepository;
        $this->cartCalculator = $cartCalculator;
        $this->orderService = $orderService;
        $this->userRepository = $userRepository;
        $this->dtoBuilderFactory = $dtoBuilderFactory;
        $this->command = $command;
    }

    public function verifyAuthorization(AuthorizationContextInterface $authorizationContext): void
    {
        $authorizationContext->verifyCanManageCart(
            $this->command->getCartId()
        );
    }

    public function handle()
    {
        $cart = $this->cartRepository->findOneById($this->command->getCartId());
        $user = $this->userRepository->findOneById($this->command->getUserId());

        $order = $this->orderService->createOrderFromCart(
            $this->command->getOrderId(),
            $user,
            $cart,
            $this->cartCalculator,
            $this->command->getIp4(),
            OrderAddressDTOBuilder::createFromDTO($this->command->getShippingAddressDTO()),
            OrderAddressDTOBuilder::createFromDTO($this->command->getBillingAddressDTO()),
            CreditCardDTOBuilder::createFromDTO($this->command->getCreditCardDTO())
        );

        $this->cartRepository->delete($cart);
    }
}