Passed
Pull Request — master (#202)
by Zing
09:12 queued 04:07
created

SmsSwitchConnectionCommand::handle()   A

Complexity

Conditions 6
Paths 6

Size

Total Lines 26
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 13
CRAP Score 6.0852

Importance

Changes 5
Bugs 0 Features 0
Metric Value
eloc 14
c 5
b 0
f 0
dl 0
loc 26
ccs 13
cts 15
cp 0.8667
rs 9.2222
cc 6
nc 6
nop 0
crap 6.0852
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Zing\LaravelSms\Commands;
6
7
use Illuminate\Console\Command;
8
use Illuminate\Support\Str;
9
use Symfony\Component\Console\Input\InputArgument;
10
use Symfony\Component\Console\Input\InputOption;
11
12
class SmsSwitchConnectionCommand extends Command
13
{
14
    /**
15
     * The console command name.
16
     *
17
     * @var string
18
     */
19
    protected $name = 'sms:connection';
20
21
    /**
22
     * Get the console command arguments.
23
     *
24
     * @return \Symfony\Component\Console\Input\InputArgument[]
25
     */
26 2
    protected function getArguments(): array
27
    {
28 2
        return [new InputArgument('connection', InputArgument::REQUIRED, 'Which connection to use')];
29
    }
30
31
    /**
32
     * Get the console command options.
33
     *
34
     * @return \Symfony\Component\Console\Input\InputOption[]
35
     */
36 2
    protected function getOptions(): array
37
    {
38
        return [
39 2
            new InputOption(
40 2
                'show',
41 2
                's',
42 2
                InputOption::VALUE_NONE,
43 2
                'Display the sms default connection instead of modifying files'
44
            ),
45 2
            new InputOption(
46 2
                'always-no',
47 2
                null,
48 2
                InputOption::VALUE_NONE,
49 2
                'Skip generating sms default connection if it already exists'
50
            ),
51 2
            new InputOption(
52 2
                'force',
53 2
                'f',
54 2
                InputOption::VALUE_NONE,
55 2
                'Skip confirmation when overwriting an existing sms default connection'
56
            ),
57
        ];
58
    }
59
60
    /**
61
     * The console command description.
62
     *
63
     * @var string
64
     */
65
    protected $description = 'Set the sms default connection used to send message';
66
67
    /**
68
     * Execute the console command.
69
     */
70 2
    public function handle(): void
71
    {
72 2
        $connection = $this->argument('connection');
73 2
        if (is_array($connection)) {
74
            return;
75
        }
76
77 2
        if ($connection === null) {
78
            return;
79
        }
80
81 2
        if ($this->option('show')) {
82 1
            $this->comment('SMS_CONNECTION=' . $connection);
83
84 1
            return;
85
        }
86
87 2
        $path = $this->envPath();
88 2
        if (! file_exists($path)) {
89 1
            $this->displayConnection($connection);
90
91 1
            return;
92
        }
93
94 2
        if ($this->putEnvToFile($connection, $path)) {
95 2
            $this->displayConnection($connection);
96
        }
97 2
    }
98
99
    /**
100
     * put default sms connection to the .env file path.
101
     *
102
     * @param string $connection the default sms connection
103
     * @param string $path the .env file path.
104
     */
105 2
    protected function putEnvToFile(string $connection, string $path): bool
106
    {
107
        /** @var string $contents */
108 2
        $contents = file_get_contents($path);
109
110 2
        if (! Str::contains($contents, 'SMS_CONNECTION')) {
111
            // create new entry
112 2
            file_put_contents($path, PHP_EOL . sprintf('SMS_CONNECTION=%s', $connection) . PHP_EOL, FILE_APPEND);
113
114 2
            return true;
115
        }
116
117 2
        if ($this->option('always-no')) {
118 1
            $this->comment('Sms default connection already exists. Skipping...');
119
120 1
            return false;
121
        }
122
123 1
        if (! $this->isConfirmed()) {
124 1
            $this->comment('Phew... No changes were made to your sms default connection.');
125
126 1
            return false;
127
        }
128
129 1
        file_put_contents(
130 1
            $path,
131 1
            str_replace(
132 1
                'SMS_CONNECTION=' . $this->laravel['config']['sms.default'],
133 1
                'SMS_CONNECTION=' . $connection,
134
                $contents
135
            )
136
        );
137
138 1
        return true;
139
    }
140
141
    /**
142
     * Display the key.
143
     */
144 2
    protected function displayConnection(string $connection): void
145
    {
146 2
        $this->laravel['config']['sms.default'] = $connection;
147
148 2
        $this->info(sprintf('sms default connection switch to [%s] successfully.', $connection));
149 2
    }
150
151
    /**
152
     * Check if the modification is confirmed.
153
     */
154 1
    protected function isConfirmed(): bool
155
    {
156 1
        if ($this->option('force')) {
157
            return true;
158
        }
159
160 1
        return $this->confirm(
161 1
            'This maybe invalidate existing sms feature. Are you sure you want to override the sms default connection?'
162
        );
163
    }
164
165
    /**
166
     * Get the .env file path.
167
     */
168 2
    protected function envPath(): string
169
    {
170 2
        if (method_exists($this->laravel, 'environmentFilePath')) {
171 2
            return $this->laravel->environmentFilePath();
172
        }
173
174
        return $this->laravel->basePath('.env');
175
    }
176
}
177