symfony-doge/veslo

View on GitHub
src/AnthillBundle/Vacancy/Roadmap/ConveyorAwareRoadmap.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

/*
 * This file is part of the Veslo project <https://github.com/symfony-doge/veslo>.
 *
 * (C) 2019 Pavel Petrov <itnelo@gmail.com>.
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 *
 * @license https://opensource.org/licenses/GPL-3.0 GPL-3.0
 */

declare(strict_types=1);

namespace Veslo\AnthillBundle\Vacancy\Roadmap;

use Veslo\AnthillBundle\Dto\Vacancy\ConfigurableRoadmapDto;
use Veslo\AnthillBundle\Dto\Vacancy\Roadmap\ConfigurationDto;
use Veslo\AnthillBundle\Dto\Vacancy\LocationDto;
use Veslo\AnthillBundle\Dto\Vacancy\Roadmap\StrategyDto;
use Veslo\AnthillBundle\Dto\Vacancy\RoadmapDto;
use Veslo\AnthillBundle\Vacancy\ConfigurableRoadmapInterface;
use Veslo\AnthillBundle\Vacancy\RoadmapInterface;

/**
 * Wrapper for a roadmap that provides meta information for conveyor process
 */
class ConveyorAwareRoadmap
{
    /**
     * Actual roadmap instance that holds context and parsing plan for specific site
     *
     * @var RoadmapInterface
     */
    private $roadmap;

    /**
     * Wrapped roadmap name
     *
     * @var string
     */
    private $name;

    /**
     * ConveyorAwareRoadmap constructor.
     *
     * @param RoadmapInterface $roadmap Actual roadmap instance that holds context and parsing plan for specific site
     * @param string           $name    Wrapped roadmap name
     */
    public function __construct(RoadmapInterface $roadmap, string $name)
    {
        $this->roadmap = $roadmap;
        $this->name    = $name;
    }

    /**
     * Returns name of wrapped roadmap for conveyor workflow
     *
     * @return string
     */
    public function getName(): string
    {
        $name = $this->name;

        if (!$this->roadmap instanceof ConfigurableRoadmapInterface) {
            return $name;
        }

        $configuration    = $this->roadmap->getConfiguration();
        $parameters       = $configuration->getParameters();
        $configurationKey = $parameters->getConfigurationKey();

        return "$name.$configurationKey";
    }

    /**
     * Returns positive whenever roadmap has available vacancy for parsing
     *
     * @return bool
     *
     * @see RoadmapInterface::hasNext()
     */
    public function hasNext(): bool
    {
        return $this->roadmap->hasNext();
    }

    /**
     * Returns URL that contains vacancy for parsing with meta information about roadmap for conveyor workflow
     *
     * @return LocationDto|null
     *
     * @see RoadmapInterface::next()
     */
    public function next(): ?LocationDto
    {
        $vacancyUrl = $this->roadmap->next();

        if (empty($vacancyUrl)) {
            return null;
        }

        $roadmapDto = new RoadmapDto();
        $roadmapDto->setName($this->name);

        if ($this->roadmap instanceof ConfigurableRoadmapInterface) {
            $roadmapDto = $this->upgradeToConfigurableRoadmapDto($roadmapDto);
        }

        $locationDto = new LocationDto();
        $locationDto->setRoadmap($roadmapDto);
        $locationDto->setVacancyUrl($vacancyUrl);

        return $locationDto;
    }

    /**
     * Builds and returns configurable roadmap dto by specified base roadmap dto
     *
     * @param RoadmapDto $roadmapDto Base roadmap dto
     *
     * @return ConfigurableRoadmapDto
     */
    private function upgradeToConfigurableRoadmapDto(RoadmapDto $roadmapDto): ConfigurableRoadmapDto
    {
        $configurableRoadmapDto = new ConfigurableRoadmapDto();
        $configurableRoadmapDto->setName($roadmapDto->getName());

        $strategy     = $this->roadmap->getStrategy();
        $strategyName = substr(get_class($strategy), stripos(get_class($strategy), 'Strategy\\'));

        $strategyDto = new StrategyDto();
        $strategyDto->setName($strategyName);
        $configurableRoadmapDto->setStrategy($strategyDto);

        /** @var ConfigurationInterface $configuration */
        $configuration = $this->roadmap->getConfiguration();

        $parameters       = $configuration->getParameters();
        $configurationKey = $parameters->getConfigurationKey();

        $configurationDto = new ConfigurationDto();
        $configurationDto->setKey($configurationKey);
        $configurableRoadmapDto->setConfiguration($configurationDto);

        return $configurableRoadmapDto;
    }
}