Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
68.75% covered (warning)
68.75%
22 / 32
50.00% covered (danger)
50.00%
2 / 4
CRAP
0.00% covered (danger)
0.00%
0 / 1
OlzCommand
68.75% covered (warning)
68.75%
22 / 32
50.00% covered (danger)
50.00%
2 / 4
18.16
0.00% covered (danger)
0.00%
0 / 1
 getAllowedAppEnvs
n/a
0 / 0
n/a
0 / 0
0
 handle
n/a
0 / 0
n/a
0 / 0
0
 execute
60.87% covered (warning)
60.87%
14 / 23
0.00% covered (danger)
0.00%
0 / 1
11.83
 getAppEnv
80.00% covered (warning)
80.00%
4 / 5
0.00% covered (danger)
0.00%
0 / 1
2.03
 getIdent
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 logAndOutput
100.00% covered (success)
100.00%
3 / 3
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2
3namespace Olz\Command\Common;
4
5use Olz\Utils\WithUtilsTrait;
6use Symfony\Component\Console\Command\Command;
7use Symfony\Component\Console\Input\InputInterface;
8use Symfony\Component\Console\Output\OutputInterface;
9
10abstract class OlzCommand extends Command {
11    use WithUtilsTrait;
12
13    protected ?OutputInterface $output = null;
14
15    /** @return array<string> */
16    abstract protected function getAllowedAppEnvs(): array;
17
18    abstract protected function handle(InputInterface $input, OutputInterface $output): int;
19
20    protected function execute(InputInterface $input, OutputInterface $output): int {
21        $this->output = $output;
22
23        try {
24            $app_env = $this->getAppEnv();
25            $allowed_app_envs = $this->getAllowedAppEnvs();
26            $allowed = false;
27            foreach ($allowed_app_envs as $allowed_app_env) {
28                if ($app_env === $allowed_app_env) {
29                    $allowed = true;
30                }
31            }
32            if (!$allowed) {
33                $this->logAndOutput("Command {$this->getIdent()} not allowed in app env {$app_env}.", level: 'notice');
34                return Command::INVALID;
35            }
36            $this->logAndOutput("Running command {$this->getIdent()}...");
37            $status = $this->handle($input, $output);
38            if ($status === Command::SUCCESS) {
39                $this->logAndOutput("Successfully ran command {$this->getIdent()}.");
40            } elseif ($status === Command::FAILURE) {
41                $this->logAndOutput("Failed running command {$this->getIdent()}.", level: 'notice');
42            } elseif ($status === Command::INVALID) {
43                $this->logAndOutput("Command {$this->getIdent()} called with invalid arguments.", level: 'notice');
44            } else {
45                $this->logAndOutput("Command {$this->getIdent()} finished with unknown status {$status}.", level: 'warning');
46            }
47        } catch (\Exception $exc) {
48            $this->logAndOutput("Error running command {$this->getIdent()}{$exc->getMessage()}.", level: 'error');
49            $status = Command::FAILURE;
50        }
51        return $status;
52    }
53
54    protected function getAppEnv(): string {
55        $olz_app_env = $this->envUtils()->getAppEnv();
56        $symfony_app_env = $_ENV['APP_ENV'] ?? null;
57        if ($olz_app_env !== $symfony_app_env) {
58            throw new \Exception("OLZ and symfony app env do not match ({$olz_app_env} vs. {$symfony_app_env})");
59        }
60        return $olz_app_env;
61    }
62
63    protected function getIdent(): string {
64        return get_called_class();
65    }
66
67    /**
68     * @param array<mixed>                                                             $context
69     * @param 'alert'|'critical'|'debug'|'emergency'|'error'|'info'|'notice'|'warning' $level
70     */
71    protected function logAndOutput(string $message, array $context = [], string $level = 'info'): void {
72        $this->log()->log($level, $message, $context);
73        if ($this->output !== null) {
74            $this->output->writeln($message);
75        }
76    }
77}