Passed
Push — master ( da0795...78880b )
by Jens
14:45 queued 18s
created

ProjectActionBuilder   A

Complexity

Total Complexity 18

Size/Duplication

Total Lines 161
Duplicated Lines 0 %

Test Coverage

Coverage 85.11%

Importance

Changes 0
Metric Value
wmc 18
eloc 35
dl 0
loc 161
ccs 40
cts 47
cp 0.8511
rs 10
c 0
b 0
f 0

14 Methods

Rating   Name   Duplication   Size   Complexity  
A setActions() 0 4 1
A resolveAction() 0 12 4
A getActions() 0 3 1
A callback() 0 6 2
A changeCountries() 0 4 1
A setExternalOAuth() 0 4 1
A changeName() 0 4 1
A changeLanguages() 0 4 1
A setShippingRateInputType() 0 4 1
A changeMessagesConfiguration() 0 4 1
A addAction() 0 4 1
A changeMessagesEnabled() 0 4 1
A changeCurrencies() 0 4 1
A of() 0 3 1
1
<?php
2
3
namespace Commercetools\Core\Builder\Update;
4
5
use Commercetools\Core\Error\InvalidArgumentException;
6
use Commercetools\Core\Request\AbstractAction;
7
use Commercetools\Core\Request\Project\Command\ProjectChangeCountriesAction;
8
use Commercetools\Core\Request\Project\Command\ProjectChangeCurrenciesAction;
9
use Commercetools\Core\Request\Project\Command\ProjectChangeLanguagesAction;
10
use Commercetools\Core\Request\Project\Command\ProjectChangeMessagesConfigurationAction;
11
use Commercetools\Core\Request\Project\Command\ProjectChangeMessagesEnabledAction;
12
use Commercetools\Core\Request\Project\Command\ProjectChangeNameAction;
13
use Commercetools\Core\Request\Project\Command\ProjectSetExternalOAuthAction;
14
use Commercetools\Core\Request\Project\Command\ProjectSetShippingRateInputTypeAction;
15
16
class ProjectActionBuilder
17
{
18
    private $actions = [];
19
20
    /**
21
     * @link https://docs.commercetools.com/http-api-projects-project.html#change-countries
22
     * @param ProjectChangeCountriesAction|callable $action
23
     * @return $this
24
     */
25 1
    public function changeCountries($action = null)
26
    {
27 1
        $this->addAction($this->resolveAction(ProjectChangeCountriesAction::class, $action));
28 1
        return $this;
29
    }
30
31
    /**
32
     * @link https://docs.commercetools.com/http-api-projects-project.html#change-currencies
33
     * @param ProjectChangeCurrenciesAction|callable $action
34
     * @return $this
35
     */
36 1
    public function changeCurrencies($action = null)
37
    {
38 1
        $this->addAction($this->resolveAction(ProjectChangeCurrenciesAction::class, $action));
39 1
        return $this;
40
    }
41
42
    /**
43
     * @link https://docs.commercetools.com/http-api-projects-project.html#change-languages
44
     * @param ProjectChangeLanguagesAction|callable $action
45
     * @return $this
46
     */
47 1
    public function changeLanguages($action = null)
48
    {
49 1
        $this->addAction($this->resolveAction(ProjectChangeLanguagesAction::class, $action));
50 1
        return $this;
51
    }
52
53
    /**
54
     * @link https://docs.commercetools.com/http-api-projects-project.html#change-messages-enabled
55
     * @param ProjectChangeMessagesConfigurationAction|callable $action
56
     * @return $this
57
     */
58 1
    public function changeMessagesConfiguration($action = null)
59
    {
60 1
        $this->addAction($this->resolveAction(ProjectChangeMessagesConfigurationAction::class, $action));
61 1
        return $this;
62
    }
63
64
    /**
65
     * @link https://docs.commercetools.com/http-api-projects-project.html#change-messages-enabled
66
     * @param ProjectChangeMessagesEnabledAction|callable $action
67
     * @return $this
68
     */
69 1
    public function changeMessagesEnabled($action = null)
70
    {
71 1
        $this->addAction($this->resolveAction(ProjectChangeMessagesEnabledAction::class, $action));
72 1
        return $this;
73
    }
74
75
    /**
76
     * @link https://docs.commercetools.com/http-api-projects-project.html#change-name
77
     * @param ProjectChangeNameAction|callable $action
78
     * @return $this
79
     */
80 1
    public function changeName($action = null)
81
    {
82 1
        $this->addAction($this->resolveAction(ProjectChangeNameAction::class, $action));
83 1
        return $this;
84
    }
85
86
    /**
87
     * @link https://docs.commercetools.com/http-api-projects-project.html#set-externaloauth
88
     * @param ProjectSetExternalOAuthAction|callable $action
89
     * @return $this
90
     */
91 2
    public function setExternalOAuth($action = null)
92
    {
93 2
        $this->addAction($this->resolveAction(ProjectSetExternalOAuthAction::class, $action));
94 2
        return $this;
95
    }
96
97
    /**
98
     * @link https://docs.commercetools.com/http-api-projects-project.html#set-shippingrateinputtype
99
     * @param ProjectSetShippingRateInputTypeAction|callable $action
100
     * @return $this
101
     */
102 1
    public function setShippingRateInputType($action = null)
103
    {
104 1
        $this->addAction($this->resolveAction(ProjectSetShippingRateInputTypeAction::class, $action));
105 1
        return $this;
106
    }
107
108
    /**
109
     * @return ProjectActionBuilder
110
     */
111
    public static function of()
112
    {
113
        return new self();
114
    }
115
116
    /**
117
     * @param $class
118
     * @param $action
119
     * @return AbstractAction
120
     * @throws InvalidArgumentException
121
     */
122 9
    private function resolveAction($class, $action = null)
123
    {
124 9
        if (is_null($action) || is_callable($action)) {
125 9
            $callback = $action;
126 9
            $emptyAction = $class::of();
127 9
            $action = $this->callback($emptyAction, $callback);
128
        }
129 9
        if ($action instanceof $class) {
130 9
            return $action;
131
        }
132
        throw new InvalidArgumentException(
133
            sprintf('Expected method to be called with or callable to return %s', $class)
134
        );
135
    }
136
137
    /**
138
     * @param $action
139
     * @param callable $callback
140
     * @return AbstractAction
141
     */
142 9
    private function callback($action, callable $callback = null)
143
    {
144 9
        if (!is_null($callback)) {
145 1
            $action = $callback($action);
146
        }
147 9
        return $action;
148
    }
149
150
    /**
151
     * @param AbstractAction $action
152
     * @return $this;
153
     */
154 9
    public function addAction(AbstractAction $action)
155
    {
156 9
        $this->actions[] = $action;
157 9
        return $this;
158
    }
159
160
    /**
161
     * @return array
162
     */
163 9
    public function getActions()
164
    {
165 9
        return $this->actions;
166
    }
167
168
169
    /**
170
     * @param array $actions
171
     * @return $this
172
     */
173
    public function setActions(array $actions)
174
    {
175
        $this->actions = $actions;
176
        return $this;
177
    }
178
}
179