Passed
Pull Request — master (#160)
by Zing
09:15 queued 03:33
created

SmsSwitchConnectionCommand   A

Complexity

Total Complexity 15

Size/Duplication

Total Lines 161
Duplicated Lines 0 %

Test Coverage

Coverage 96.67%

Importance

Changes 10
Bugs 1 Features 0
Metric Value
wmc 15
eloc 55
c 10
b 1
f 0
dl 0
loc 161
ccs 58
cts 60
cp 0.9667
rs 10

7 Methods

Rating   Name   Duplication   Size   Complexity  
A handle() 0 19 4
A getOptions() 0 20 1
A getArguments() 0 3 1
A displayConnection() 0 5 1
A putEnvToFile() 0 31 4
A envPath() 0 7 2
A isConfirmed() 0 8 2
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 array
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 array
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 = (string) $this->argument('connection');
73
74 2
        if ($this->option('show')) {
75 1
            $this->comment('SMS_CONNECTION=' . $connection);
76
77 1
            return;
78
        }
79
80 2
        $path = $this->envPath();
81 2
        if (! file_exists($path)) {
82 1
            $this->displayConnection($connection);
83
84 1
            return;
85
        }
86
87 2
        if ($this->putEnvToFile($connection, $path)) {
88 2
            $this->displayConnection($connection);
89
        }
90 2
    }
91
92
    /**
93
     * put default sms connection to the .env file path.
94
     *
95
     * @param string $connection the default sms connection
96
     * @param string $path the .env file path.
97
     *
98
     * @return bool
99
     */
100 2
    protected function putEnvToFile(string $connection, string $path): bool
101
    {
102 2
        if (! Str::contains(file_get_contents($path), 'SMS_CONNECTION')) {
103
            // create new entry
104 2
            file_put_contents($path, PHP_EOL . "SMS_CONNECTION={$connection}" . PHP_EOL, FILE_APPEND);
105
106 2
            return true;
107
        }
108
109 2
        if ($this->option('always-no')) {
110 1
            $this->comment('Sms default connection already exists. Skipping...');
111
112 1
            return false;
113
        }
114
115 1
        if (! $this->isConfirmed()) {
116 1
            $this->comment('Phew... No changes were made to your sms default connection.');
117
118 1
            return false;
119
        }
120
121 1
        file_put_contents(
122 1
            $path,
123 1
            str_replace(
124 1
                'SMS_CONNECTION=' . $this->laravel['config']['sms.default'],
125 1
                'SMS_CONNECTION=' . $connection,
126 1
                file_get_contents($path)
127
            )
128
        );
129
130 1
        return true;
131
    }
132
133
    /**
134
     * Display the key.
135
     *
136
     * @param string $connection
137
     */
138 2
    protected function displayConnection(string $connection): void
139
    {
140 2
        $this->laravel['config']['sms.default'] = $connection;
141
142 2
        $this->info("sms default connection switch to [{$connection}] successfully.");
143 2
    }
144
145
    /**
146
     * Check if the modification is confirmed.
147
     *
148
     * @return bool
149
     */
150 1
    protected function isConfirmed(): bool
151
    {
152 1
        if ($this->option('force')) {
153
            return true;
154
        }
155
156 1
        return $this->confirm(
157 1
            'This maybe invalidate existing sms feature. Are you sure you want to override the sms default connection?'
158
        );
159
    }
160
161
    /**
162
     * Get the .env file path.
163
     *
164
     * @return string
165
     */
166 2
    protected function envPath(): string
167
    {
168 2
        if (method_exists($this->laravel, 'environmentFilePath')) {
169 2
            return $this->laravel->environmentFilePath();
170
        }
171
172
        return $this->laravel->basePath('.env');
173
    }
174
}
175