SAREhub/EasyECA

View on GitHub
src/SAREhub/EasyECA/DI/Rule/Loader/Http/RulesHttpResponseParsingStrategy.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php


namespace SAREhub\EasyECA\DI\Rule\Loader\Http;

use Psr\Http\Message\ResponseInterface;
use SAREhub\Commons\Misc\ArrayHelper;
use SAREhub\EasyECA\Rule\Definition\EventRuleGroupDefinitionFactory;
use SAREhub\EasyECA\Rule\Loader\Http\HttpResponseParsingStrategy;

class RulesHttpResponseParsingStrategy implements HttpResponseParsingStrategy
{
    /**
     * @var EventRuleGroupDefinitionFactory
     */
    private $definitionFactory;

    /**
     * @var string
     */
    private $groupIdKey;

    public function __construct(EventRuleGroupDefinitionFactory $definitionFactory, $groupIdKey = "campaignId")
    {
        $this->definitionFactory = $definitionFactory;
        $this->groupIdKey = $groupIdKey;
    }

    public function parse(ResponseInterface $response): array
    {
        $data = $this->extractRulesFromResponse($response);
        $data = (isset($data[$this->groupIdKey])) ? [$data] : $data;
        $definitions = [];
        foreach ($data as $groupConfig) {
            $groupDefinitions = $this->createEventRuleGroupDefinitions($groupConfig);
            $definitions = array_merge($definitions, $groupDefinitions);
        }
        return $definitions;
    }

    protected function extractRulesFromResponse(ResponseInterface $response): array
    {
        return json_decode($response->getBody()->getContents(), true)["data"];
    }

    private function createEventRuleGroupDefinitions(array $config): array
    {
        $groupId = $config[$this->groupIdKey];
        $rulesGroups = $this->groupRulesByEventType($this->extractRulesFromGroupConfig($config));
        $definitions = [];
        foreach ($rulesGroups as $eventType => $rules) {
            $definitions[] = $this->definitionFactory->create($eventType, [
                "id" => $groupId,
                "rules" => $rules
            ]);
        }
        return $definitions;
    }

    protected function extractRulesFromGroupConfig($config): array
    {
        return $config["config"]["rules"];
    }

    private function groupRulesByEventType(array $rules): array
    {
        return ArrayHelper::groupByKey($rules, "event");
    }
}