Completed
Push — master ( efdc7e...8e7c5b )
by Maarten
01:54 queued 12s
created

CreateMigrationAction   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 101
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Importance

Changes 0
Metric Value
wmc 8
lcom 1
cbo 4
dl 0
loc 101
rs 10
c 0
b 0
f 0

6 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
A execute() 0 12 3
A createRelationMigration() 0 24 1
A createModelMigration() 0 19 1
A getLocalKey() 0 4 1
A getForeignKey() 0 5 1
1
<?php
2
3
namespace Mtolhuys\LaravelSchematics\Actions\Migration;
4
5
use Illuminate\Support\Str;
6
use Illuminate\Support\Facades\File;
7
use Illuminate\Support\Facades\Artisan;
8
use Mtolhuys\LaravelSchematics\Services\RuleParser;
9
use Mtolhuys\LaravelSchematics\Http\Requests\CreateRelationRequest;
10
11
class CreateMigrationAction
12
{
13
    public
14
        $autoMigrate,
15
        $filename,
16
        $path;
17
18
    public function __construct()
19
    {
20
        $this->autoMigrate = config('schematics.auto-migrate');
21
        $this->path = base_path('database/migrations/');
22
    }
23
24
    /**
25
     * @param $request
26
     */
27
    public function execute($request)
28
    {
29
        if ($request instanceof CreateRelationRequest) {
30
            $this->createRelationMigration($request);
31
        } else {
32
            $this->createModelMigration($request);
33
        }
34
35
        if ($this->autoMigrate) {
36
            Artisan::call('migrate');
37
        }
38
    }
39
40
    /**
41
     * @param $request
42
     * @return bool|int
43
     */
44
    private function createRelationMigration($request)
45
    {
46
        $source = app($request['source'])->getTable();
47
        $target = app($request['target'])->getTable();
48
        $foreignKey = $this->getForeignKey($request);
49
        $stub = __DIR__ . '/../../../resources/stubs/migration/relation.stub';
50
        $this->filename = 'database/migrations/'
51
            . date('Y_m_d_His')
52
            . "_create_{$source}_{$target}_relation.php";
53
54
        return File::put(base_path($this->filename), str_replace([
55
            '$source$',
56
            '$target$',
57
            '$classname$',
58
            '$column$',
59
            '$foreignKey$'
60
        ], [
61
            $source,
62
            $target,
63
            'Create' . ucfirst($source) . ucfirst($target) . 'Relation',
64
            "\$table->foreign('$foreignKey')->references('{$this->getLocalKey($request)}')->on('$target');",
65
            $foreignKey
66
        ], File::get($stub)));
67
    }
68
69
    /**
70
     * @param $request
71
     * @return bool|int
72
     */
73
    private function createModelMigration($request)
74
    {
75
        $model = ucfirst($request['name']);
76
        $table = Str::plural(Str::snake($model));
77
        $stub = __DIR__ . '/../../../resources/stubs/migration/model.stub';
78
        $this->filename = 'database/migrations/'
79
            . date('Y_m_d_His')
80
            . "_create_{$table}_table.php";
81
82
        return File::put(base_path($this->filename), str_replace([
83
            '$classname$',
84
            '$table$',
85
            '$columns$'
86
        ], [
87
            'Create' . Str::plural($model) . 'Table',
88
            $table,
89
            RuleParser::rulesToMigrationColumns($request['fields'])
90
        ], File::get($stub)));
91
    }
92
93
    /**
94
     * @param $request
95
     * @return string
96
     */
97
    private function getLocalKey($request): string
98
    {
99
        return $request['method']['localKey'] ?? 'id';
100
    }
101
102
    /**
103
     * @param $request
104
     * @return string
105
     */
106
    private function getForeignKey($request): string
107
    {
108
        return $request['method']['foreignKey']
109
            ?? strtolower(substr(strrchr($request['target'], "\\"), 1) . '_id');
110
    }
111
}
112