Newer
Older
TillQliro / Model / OrderManagementStatus / Update / HandlerPool.php
@Jonas Jonsson Jonas Jonsson on 2 Apr 2024 3 KB Initial
<?php
/**
 * Copyright © Qliro AB. All rights reserved.
 * See LICENSE.txt for license details.
 */

namespace Qliro\QliroOne\Model\OrderManagementStatus\Update;

use Qliro\QliroOne\Api\Admin\OrderManagementStatusUpdateHandlerInterface;
use Qliro\QliroOne\Api\Data\QliroOrderManagementStatusInterface;
use Qliro\QliroOne\Model\Logger\Manager as LogManager;

/**
 * Class HandlerPool, all handlers available to deal with Order Management Status Notifications sent from Qliro
 */
class HandlerPool
{
    /**
     * @var array
     */
    private $handlerPool;

    /**
     * @var \Qliro\QliroOne\Model\Logger\Manager
     */
    private $logManager;

    private $handlerStatusMap = [
        QliroOrderManagementStatusInterface::STATUS_SUCCESS => 'handleSuccess',
        QliroOrderManagementStatusInterface::STATUS_CANCELLED => 'handleCancelled',
        QliroOrderManagementStatusInterface::STATUS_ERROR => 'handleError',
        QliroOrderManagementStatusInterface::STATUS_INPROCESS => 'handleInProcess',
        QliroOrderManagementStatusInterface::STATUS_ONHOLD => 'handleOnHold',
        QliroOrderManagementStatusInterface::STATUS_USER_INTERACTION => 'handleUserInteraction',
        QliroOrderManagementStatusInterface::STATUS_CREATED => 'handleCreated',
    ];

    /**
     * HandlerPool constructor.
     *
     * @param array $handlerPool
     * @param \Qliro\QliroOne\Model\Logger\Manager $logManager
     */
    public function __construct(
        LogManager $logManager,
        $handlerPool = []
    ) {
        $this->handlerPool = $handlerPool;
        $this->logManager = $logManager;
    }

    /**
     * If a handler is found, figure out what status it is and call the selected handler for it
     * Returns true if it was handled, otherwise it returns false
     *
     * @param \Qliro\QliroOne\Model\Notification\QliroOrderManagementStatus $qliroOrderManagementStatus
     * @param \Qliro\QliroOne\Model\OrderManagementStatus $omStatus
     * @return bool
     */
    public function handle($qliroOrderManagementStatus, $omStatus)
    {
        try {
            $type = $omStatus->getRecordType();
            // Null means it used to throw an exception and log it. Type is always null initially, no point in logging
            if ($type === null) {
                return false;
            }
            $handler = $this->handlerPool[$type] ?? null;
            if ($handler instanceof OrderManagementStatusUpdateHandlerInterface) {
                $handlerFunction = $this->handlerStatusMap[$qliroOrderManagementStatus->getStatus()];
                if ($handlerFunction) {
                    $handler->$handlerFunction($qliroOrderManagementStatus, $omStatus);
                } else {
                    throw new \LogicException('No status function for OrderManagementStatus handler available');
                }
            } else {
                throw new \LogicException('No Handler for OrderManagementStatus available');
            }

        } catch (\Exception $exception) {
            $this->logManager->debug(
                $exception,
                [
                    'extra' => [
                        'type' => $type,
                        'status' => $qliroOrderManagementStatus->getStatus(),
                    ],
                ]
            );

            return false;
        }

        return true;
    }
}