Security update for Core, with self-updated composer
[yaffs-website] / vendor / drupal / console / src / Command / Generate / PluginRestResourceCommand.php
1 <?php
2
3 /**
4  * @file
5  * Contains \Drupal\Console\Command\Generate\PluginRestResourceCommand.
6  */
7
8 namespace Drupal\Console\Command\Generate;
9
10 use Drupal\Console\Utils\Validator;
11 use Symfony\Component\Console\Input\InputInterface;
12 use Symfony\Component\Console\Input\InputOption;
13 use Symfony\Component\Console\Output\OutputInterface;
14 use Drupal\Console\Command\Shared\ServicesTrait;
15 use Drupal\Console\Command\Shared\ModuleTrait;
16 use Drupal\Console\Generator\PluginRestResourceGenerator;
17 use Drupal\Console\Command\Shared\ConfirmationTrait;
18 use Drupal\Console\Core\Command\Command;
19 use Drupal\Console\Extension\Manager;
20 use Drupal\Console\Core\Utils\StringConverter;
21 use Drupal\Console\Core\Utils\ChainQueue;
22
23 /**
24  * Class PluginRestResourceCommand
25  *
26  * @package Drupal\Console\Command\Generate
27  */
28 class PluginRestResourceCommand extends Command
29 {
30     use ServicesTrait;
31     use ModuleTrait;
32     use ConfirmationTrait;
33
34     /**
35      * @var Manager
36      */
37     protected $extensionManager;
38
39     /**
40      * @var PluginRestResourceGenerator
41      */
42     protected $generator;
43
44     /**
45      * @var StringConverter
46      */
47     protected $stringConverter;
48
49     /**
50      * @var Validator
51      */
52     protected $validator;
53
54     /**
55      * @var ChainQueue
56      */
57     protected $chainQueue;
58
59
60     /**
61      * PluginRestResourceCommand constructor.
62      *
63      * @param Manager                     $extensionManager
64      * @param PluginRestResourceGenerator $generator
65      * @param StringConverter             $stringConverter
66      * @param Validator                   $validator
67      * @param ChainQueue                  $chainQueue
68      */
69     public function __construct(
70         Manager $extensionManager,
71         PluginRestResourceGenerator $generator,
72         StringConverter $stringConverter,
73         Validator $validator,
74         ChainQueue $chainQueue
75     ) {
76         $this->extensionManager = $extensionManager;
77         $this->generator = $generator;
78         $this->stringConverter = $stringConverter;
79         $this->validator = $validator;
80         $this->chainQueue = $chainQueue;
81         parent::__construct();
82     }
83
84     protected function configure()
85     {
86         $this
87             ->setName('generate:plugin:rest:resource')
88             ->setDescription($this->trans('commands.generate.plugin.rest.resource.description'))
89             ->setHelp($this->trans('commands.generate.plugin.rest.resource.help'))
90             ->addOption(
91                 'module',
92                 null,
93                 InputOption::VALUE_REQUIRED,
94                 $this->trans('commands.common.options.module')
95             )
96             ->addOption(
97                 'class',
98                 null,
99                 InputOption::VALUE_OPTIONAL,
100                 $this->trans('commands.generate.plugin.rest.resource.options.class')
101             )
102             ->addOption(
103                 'plugin-id',
104                 null,
105                 InputOption::VALUE_OPTIONAL,
106                 $this->trans('commands.generate.plugin.rest.resource.options.plugin-id')
107             )
108             ->addOption(
109                 'plugin-label',
110                 null,
111                 InputOption::VALUE_OPTIONAL,
112                 $this->trans('commands.generate.plugin.rest.resource.options.plugin-label')
113             )
114             ->addOption(
115                 'plugin-url',
116                 null,
117                 InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY,
118                 $this->trans('commands.generate.plugin.rest.resource.options.plugin-url')
119             )
120             ->addOption(
121                 'plugin-states',
122                 null,
123                 InputOption::VALUE_OPTIONAL | InputOption::VALUE_IS_ARRAY,
124                 $this->trans('commands.generate.plugin.rest.resource.options.plugin-states')
125             )
126             ->setAliases(['gprr']);
127     }
128
129     /**
130      * {@inheritdoc}
131      */
132     protected function execute(InputInterface $input, OutputInterface $output)
133     {
134         // @see use Drupal\Console\Command\Shared\ConfirmationTrait::confirmOperation
135         if (!$this->confirmOperation()) {
136             return 1;
137         }
138
139         $http_methods = $this->getHttpMethods();
140         $module = $input->getOption('module');
141         $class_name = $this->validator->validateClassName($input->getOption('class'));
142         $plugin_id = $input->getOption('plugin-id');
143         $plugin_label = $input->getOption('plugin-label');
144         $plugin_url = $input->getOption('plugin-url');
145         $plugin_states = $this->validator->validateHttpMethods($input->getOption('plugin-states'), $http_methods);
146
147         $prepared_plugin = [];
148         foreach ($plugin_states as $plugin_state) {
149             $prepared_plugin[$plugin_state] = $http_methods[$plugin_state];
150         }
151
152         $this->generator->generate([
153             'module_name' => $module,
154             'class_name' => $class_name,
155             'plugin_label' => $plugin_label,
156             'plugin_id' => $plugin_id,
157             'plugin_url' => $plugin_url,
158             'plugin_states' => $prepared_plugin,
159         ]);
160
161         $this->chainQueue->addCommand('cache:rebuild', ['cache' => 'discovery']);
162
163         return 0;
164     }
165
166     protected function interact(InputInterface $input, OutputInterface $output)
167     {
168         // --module option
169         $this->getModuleOption();
170
171         // --class option
172         $class_name = $input->getOption('class');
173         if (!$class_name) {
174             $class_name = $this->getIo()->ask(
175                 $this->trans('commands.generate.plugin.rest.resource.questions.class'),
176                 'DefaultRestResource',
177                 function ($class) {
178                     return $this->validator->validateClassName($class);
179                 }
180             );
181             $input->setOption('class', $class_name);
182         }
183
184         // --plugin-id option
185         $plugin_id = $input->getOption('plugin-id');
186         if (!$plugin_id) {
187             $plugin_id = $this->getIo()->ask(
188                 $this->trans('commands.generate.plugin.rest.resource.questions.plugin-id'),
189                 $this->stringConverter->camelCaseToUnderscore($class_name)
190             );
191             $input->setOption('plugin-id', $plugin_id);
192         }
193
194         // --plugin-label option
195         $plugin_label = $input->getOption('plugin-label');
196         if (!$plugin_label) {
197             $plugin_label = $this->getIo()->ask(
198                 $this->trans('commands.generate.plugin.rest.resource.questions.plugin-label'),
199                 $this->stringConverter->camelCaseToHuman($class_name)
200             );
201             $input->setOption('plugin-label', $plugin_label);
202         }
203
204         // --plugin-url option
205         $plugin_url = $input->getOption('plugin-url');
206         if (!$plugin_url) {
207             $plugin_url = $this->getIo()->ask(
208                 $this->trans('commands.generate.plugin.rest.resource.questions.plugin-url')
209             );
210             $input->setOption('plugin-url', $plugin_url);
211         }
212
213
214         // --plugin-states option
215         $plugin_states = $input->getOption('plugin-states');
216         if (!$plugin_states) {
217             $states = array_keys($this->getHttpMethods());
218             $plugin_states = $this->getIo()->choice(
219                 $this->trans('commands.generate.plugin.rest.resource.questions.plugin-states'),
220                 $states,
221                 null,
222                 true
223             );
224
225             $input->setOption('plugin-states', $plugin_states);
226         }
227     }
228
229     /**
230      * Returns available HTTP methods.
231      *
232      * @return array
233      *   Available HTTP methods.
234      */
235     protected function getHttpMethods()
236     {
237         return [
238             'GET' => [
239               'http_code' => 200,
240               'response_class' => 'ResourceResponse',
241             ],
242             'PUT' => [
243               'http_code' => 201,
244               'response_class' => 'ModifiedResourceResponse',
245             ],
246             'POST' => [
247               'http_code' => 200,
248               'response_class' => 'ModifiedResourceResponse',
249             ],
250             'PATCH' => [
251               'http_code' => 204,
252               'response_class' => 'ModifiedResourceResponse',
253             ],
254             'DELETE' => [
255               'http_code' => 204,
256               'response_class' => 'ModifiedResourceResponse',
257             ],
258             'HEAD' => [
259               'http_code' => 200,
260               'response_class' => 'ResourceResponse',
261             ],
262             'OPTIONS' => [
263               'http_code' => 200,
264               'response_class' => 'ResourceResponse',
265             ],
266         ];
267     }
268 }