Passed
Push — main ( 01ca09...73ffad )
by Celso
05:57 queued 02:52
created

DatabaseService::execute()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 11
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 2
eloc 6
c 1
b 0
f 0
nc 2
nop 1
dl 0
loc 11
rs 10
1
<?php
2
3
namespace App\Services;
4
5
use Illuminate\Process\Pipe;
6
use Illuminate\Support\Facades\Log;
7
use Illuminate\Support\Facades\Process;
8
9
class DatabaseService
10
{
11
    public function __construct(
12
        private string $pgHost = '',
13
        private string $pgUser = ''
14
    )
15
    {
16
        $this->pgHost = env('PGHOST');
17
        $this->pgUser = env('PGUSERNAME');
18
    }
19
20
    public function index(): array
21
    {
22
        logs()->debug('Iniciando busca por databases');
23
        $result = Process::pipe(function (Pipe $pipe) {
24
            $pipe->command("/usr/bin/psql -h {$this->pgHost} -U {$this->pgUser} -l");
25
            $pipe->command("awk '{print $1}'");
26
            $pipe->command("egrep -v 'List|Name|--|\||\(|dev|hml|__|_2'");
27
        });
28
29
        $total = preg_split('/\n/', $result->output());
30
        $total = array_filter($total);
31
32
        logs()->debug('Total de databases encontrados em prod: ' . count($total));
33
34
        return $total;
35
    }
36
37
    public function execute(string $database): string
38
    {
39
        logs()->debug("Inciando sincronização da base: {$database}");
40
41
        if ($this->dropOrCreate($database)) {
42
            $this->sync($database);
43
        }
44
45
        return redirect()->back()
46
            ->with([
47
                'message' => "Datadase {$database} sincronizao com {$database}_dev com sucesso!"
48
            ]);
49
    }
50
51
    private function dropOrCreate(string $database): bool
52
    {
53
        Log::debug("Procurando se banco {$database}_dev já existe...");
54
55
        $process = Process::pipe(function (Pipe $pipe) use ($database) {
56
            $pipe->command("/usr/bin/psql -h {$this->pgHost} -U {$this->pgUser} -l");
57
            $pipe->command("grep {$database}_dev");
58
        });
59
60
        if ($process->successful()) {
61
            logs()->debug('Database encontrado, removendo!: ' . $process->output());
62
            Process::run("/usr/bin/psql -h {$this->pgHost} -U {$this->pgUser} -c \"DROP DATABASE {$database}_dev with (force)\"");
63
        }
64
65
        logs()->debug('Criando Database: ' . $process->output());
66
        $result = Process::run("/usr/bin/psql -h {$this->pgHost} -U {$this->pgUser} -c \"CREATE DATABASE {$database}_dev\"");
67
        return $result->successful();
68
69
        return false;
0 ignored issues
show
Unused Code introduced by
return false is not reachable.

This check looks for unreachable code. It uses sophisticated control flow analysis techniques to find statements which will never be executed.

Unreachable code is most often the result of return, die or exit statements that have been added for debug purposes.

function fx() {
    try {
        doSomething();
        return true;
    }
    catch (\Exception $e) {
        return false;
    }

    return false;
}

In the above example, the last return false will never be executed, because a return statement has already been met in every possible execution path.

Loading history...
70
    }
71
72
    private function sync(string $database): void
73
    {
74
        $process = Process::pipe(function (Pipe $pipe) use ($database) {
75
            $pipe->command("/usr/bin/pg_dump -h {$this->pgHost} -U {$this->pgUser} -v {$database}");
76
            $pipe->command("/usr/bin/psql -h {$this->pgHost} -U {$this->pgUser} {$database}_dev");
77
        });
78
79
        $process->successful()
80
            ? logs()->debug('Sincronização executada com sucesso')
81
            : logs()->debug('Erro ao tentar sincronizar!');
82
    }
83
}
84