Passed
Pull Request — master (#159)
by Zing
13:10
created

SmsSwitchConnectionCommand   A

Complexity

Total Complexity 15

Size/Duplication

Total Lines 156
Duplicated Lines 0 %

Test Coverage

Coverage 98.28%

Importance

Changes 9
Bugs 1 Features 0
Metric Value
wmc 15
eloc 53
c 9
b 1
f 0
dl 0
loc 156
ccs 57
cts 58
cp 0.9828
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 putEnvToFile() 0 30 4
A displayConnection() 0 5 1
A envPath() 0 7 2
A isConfirmed() 0 4 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()
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()
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($connection, $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 2
            return true;
106
        }
107
108 2
        if ($this->option('always-no')) {
109 1
            $this->comment('Sms default connection already exists. Skipping...');
110
111 1
            return false;
112
        }
113
114 1
        if (! $this->isConfirmed()) {
115 1
            $this->comment('Phew... No changes were made to your sms default connection.');
116
117 1
            return false;
118
        }
119
120 1
        file_put_contents(
121 1
            $path,
122 1
            str_replace(
123 1
                'SMS_CONNECTION=' . $this->laravel['config']['sms.default'],
124 1
                'SMS_CONNECTION=' . $connection,
125 1
                file_get_contents($path)
126
            )
127
        );
128
129 1
        return true;
130
    }
131
132
    /**
133
     * Display the key.
134
     *
135
     * @param string $connection
136
     */
137 2
    protected function displayConnection($connection): void
138
    {
139 2
        $this->laravel['config']['sms.default'] = $connection;
140
141 2
        $this->info("sms default connection switch to [{$connection}] successfully.");
142 2
    }
143
144
    /**
145
     * Check if the modification is confirmed.
146
     *
147
     * @return bool
148
     */
149 1
    protected function isConfirmed()
150
    {
151 1
        return $this->option('force') ? true : $this->confirm(
152 1
            'This maybe invalidate existing sms feature. Are you sure you want to override the sms default connection?'
153
        );
154
    }
155
156
    /**
157
     * Get the .env file path.
158
     *
159
     * @return string
160
     */
161 2
    protected function envPath()
162
    {
163 2
        if (method_exists($this->laravel, 'environmentFilePath')) {
164 2
            return $this->laravel->environmentFilePath();
165
        }
166
167
        return $this->laravel->basePath('.env');
168
    }
169
}
170