CaseManagement.php 2.64 KB
Newer Older
Ketan's avatar
Ketan committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Magento\Signifyd\Model;

use Magento\Framework\Api\FilterBuilder;
use Magento\Framework\Api\SearchCriteriaBuilder;
use Magento\Signifyd\Api\CaseManagementInterface;
use Magento\Signifyd\Api\CaseRepositoryInterface;
use Magento\Signifyd\Api\Data\CaseInterface;
use Magento\Signifyd\Api\Data\CaseInterfaceFactory;
use Magento\Framework\Exception\AlreadyExistsException;
use Magento\Framework\DB\Adapter\DuplicateException;

/**
 *
 * Default case management implementation
 */
class CaseManagement implements CaseManagementInterface
{
    /**
     * @var CaseRepositoryInterface
     */
    private $caseRepository;

    /**
     * @var CaseInterfaceFactory
     */
    private $caseFactory;

    /**
     * @var FilterBuilder
     */
    private $filterBuilder;

    /**
     * @var SearchCriteriaBuilder
     */
    private $searchCriteriaBuilder;

    /**
     * CaseManagement constructor.
     * @param CaseRepositoryInterface $caseRepository
     * @param CaseInterfaceFactory $caseFactory
     * @param FilterBuilder $filterBuilder
     * @param SearchCriteriaBuilder $searchCriteriaBuilder
     */
    public function __construct(
        CaseRepositoryInterface $caseRepository,
        CaseInterfaceFactory $caseFactory,
        FilterBuilder $filterBuilder,
        SearchCriteriaBuilder $searchCriteriaBuilder
    ) {
        $this->caseRepository = $caseRepository;
        $this->caseFactory = $caseFactory;
        $this->searchCriteriaBuilder = $searchCriteriaBuilder;
        $this->filterBuilder = $filterBuilder;
    }

    /**
     * @inheritdoc
     */
    public function create($orderId)
    {
        /** @var \Magento\Signifyd\Api\Data\CaseInterface $case */
        $case = $this->caseFactory->create();
        $case->setOrderId($orderId)
            ->setStatus(CaseInterface::STATUS_PENDING)
            ->setGuaranteeDisposition(CaseInterface::GUARANTEE_PENDING);
        try {
            return $this->caseRepository->save($case);
        } catch (DuplicateException $e) {
            throw new AlreadyExistsException(__('This order already has associated case entity'), $e);
        }
    }

    /**
     * @inheritdoc
     */
    public function getByOrderId($orderId)
    {
        $filters = [
            $this->filterBuilder->setField('order_id')
                ->setValue($orderId)
                ->create()
        ];
        $searchCriteria = $this->searchCriteriaBuilder->addFilters($filters)->create();
        $items = $this->caseRepository->getList($searchCriteria)->getItems();
        return !empty($items) ? array_pop($items) : null;
    }
}