DbHelper::runAction()   B
last analyzed

Complexity

Conditions 6
Paths 7

Size

Total Lines 45
Code Lines 27

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 45
rs 8.439
cc 6
eloc 27
nc 7
nop 4
1
<?php
2
3
namespace App\Console\Traits;
4
5
use Illuminate\Database\Capsule\Manager as Capsule;
6
use Symfony\Component\Console\Output\OutputInterface;
7
use Symfony\Component\Finder\Finder;
8
9
trait DbHelper
10
{
11
    /**
12
     * @var string Table name where migrations info is kept
13
     */
14
    private $migrationsTable = 'migrations';
15
16
    /**
17
     * @var string Table name where seeds info is kept
18
     */
19
    private $seedsTable = 'seeds';
20
21
    /**
22
     * Return class name by file basename
23
     * @param string $baseName
24
     *
25
     * @return string
26
     */
27
    private function getClassName($baseName)
28
    {
29
        $filenameParts = explode('_', $baseName);
30
        $class         = '';
31
32
        array_shift($filenameParts);
33
34
        foreach ($filenameParts as $key => $filenamePart) {
35
            $class .= ucfirst($filenamePart);
36
        }
37
38
        return $class;
39
    }
40
41
    /**
42
     * @param string $tableName
43
     */
44
    private function safeCreateTable($tableName)
45
    {
46
        if (!Capsule::schema()->hasTable($tableName)) {
47
            Capsule::schema()->create($tableName, function($table) {
48
                $table->string('version');
49
                $table->timestamp('apply_time')->useCurrent();
50
                $table->primary('version');
51
            });
52
        }
53
    }
54
55
    /**
56
     * @param string $name
57
     * @param string $table
58
     * @return bool
59
     */
60
    private function isRowExist($name, $table)
61
    {
62
        $item = Capsule::table($table)->where('version', $name)->first();
63
        return !is_null($item);
64
    }
65
66
    /**
67
     * @param string $name
68
     * @param string $table
69
     */
70
    private function insertRow($name, $table)
71
    {
72
        Capsule::table($table)->insert([
73
            'version' => $name,
74
        ]);
75
    }
76
77
    /**
78
     * @param string $name
79
     * @param string $table
80
     */
81
    private function deleteRow($name, $table)
82
    {
83
        Capsule::table($table)->where([
84
            'version' => $name,
85
        ])->delete();
86
    }
87
88
    /**
89
     * Run list of commands in files
90
     *
91
     * @param string          $path
92
     * @param OutputInterface $output
93
     * @param string          $tableName
94
     * @param string          $method
95
     *
96
     * @return void
97
     */
98
    private function runAction($path, OutputInterface $output, $tableName, $method)
99
    {
100
        if (!is_dir($path) || !is_readable($path)) {
101
            throw new \RunTimeException(sprintf('Path `%s` is not good', $path));
102
        }
103
104
        $output->writeln([
105
            '<info>Run command</info>',
106
            sprintf('Ensure table `%s` presence', $tableName)
107
        ]);
108
109
        try {
110
            $this->safeCreateTable($tableName);
111
        } catch (\Exception $e) {
112
            $output->writeln([
113
                sprintf('Can\'t ensure table `%s` presence. Please verify DB connection params and presence of database named', $tableName),
114
                sprintf('Error: `%s`', $e->getMessage()),
115
            ]);
116
        }
117
118
        $finder = new Finder();
119
        $finder->files()->name('*.php')->in($path);
120
121
        foreach ($finder as $file) {
122
            $baseName = $file->getBasename('.php');
123
            $class    = $this->getClassName($baseName);
124
125
            if ($this->isRowExist($baseName, $tableName)) {
126
                $output->writeln([sprintf('`%s` - already exists.', $baseName)]);
127
                continue;
128
            }
129
130
            require_once($file);
131
132
            $obj = new $class();
133
            $obj->$method();
134
135
            $this->insertRow($baseName, $tableName);
136
            $output->writeln([sprintf('`%s` - done.', $baseName)]);
137
        }
138
139
        $output->writeln(['<info>Completed.</info>']);
140
141
        return;
142
    }
143
}
144