Controller::getCreateRelated()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 18
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 3
eloc 14
nc 3
nop 0
dl 0
loc 18
rs 9.7998
c 0
b 0
f 0
1
<?php
2
namespace Prateekkarki\Laragen\Generators\Backend;
3
4
use Prateekkarki\Laragen\Generators\BaseGenerator;
5
use Prateekkarki\Laragen\Generators\GeneratorInterface;
6
7
class Controller extends BaseGenerator implements GeneratorInterface
8
{
9
    protected $destination = "laragen/app/Http/Controllers/Backend";
10
    protected $namespace  = "Laragen\App\Http\Controllers\Backend";
11
    protected $template  = "backend/Controller";
12
    protected $fileSuffix  = "Controller";
13
14
    protected $childDestination = "app/Http/Controllers/Backend";
15
    protected $childNamespace  = "App\Http\Controllers\Backend";
16
17
    public function generate()
18
    {
19
        $controllerTemplate = $this->buildTemplate($this->template, [
20
            '{{namespace}}'          => $this->namespace,
21
            '{{modelName}}'          => $this->module->getModelName(),
22
            '{{moduleName}}'         => $this->module->getModuleName(),
23
            '{{modelNameLowercase}}' => $this->module->getModelNameLowercase(),
24
            '{{fileUploads}}'        => $this->getFileUploads(),
25
            '{{relatedUpdates}}'     => $this->getRelatedUpdates(),
26
            '{{createRelated}}'      => $this->getCreateRelated(),
27
            '{{foreignData}}'        => $this->getForeignData(),
28
            '{{usedModels}}'         => $this->getUsedModels(),
29
            '{{perPage}}'            => config("laragen.options.listing_per_page")
30
        ]);
31
32
        return  $this->generateFile($controllerTemplate);
33
    }
34
35
    protected function getCreateRelated() {
36
        $relatedUpdates = "";
37
        $relatedTypes = $this->module->getFilteredColumns(['hasPivot']);
38
        if (empty($relatedTypes)) {
39
            return "";
40
        }
41
        if (count($relatedTypes) > 1) {
42
            $relatedUpdates .= $this->buildTemplate('backend/fragments/related-create', [
43
                '{{modelNameLowercase}}' => $this->module->getModelNameLowercase(),
44
                '{{relatedTypes}}'         => implode('", "', $this->module->getFilteredColumns(['hasPivot', 'hasModel'], true)),
45
            ]);
46
        } else {
47
            $type = $relatedTypes[0];
48
            $relatedUpdates .= 'if ($request->has("'.$type->getColumn().'")) {'.PHP_EOL;
49
            $relatedUpdates .= $this->getTabs(3).'$'.$this->module->getModelNameLowercase().'->'.$type->getColumn().'()->attach($request->input("'.$type->getColumn().'"));'.PHP_EOL;
50
            $relatedUpdates .= $this->getTabs(2).'}'.PHP_EOL;
51
        }
52
        return $relatedUpdates;
53
    }
54
55
    protected function getRelatedUpdates() {
56
        $relatedUpdates = "";
57
        $relatedTypes = $this->module->getFilteredColumns(['hasPivot']);
58
        if (empty($relatedTypes)) {
59
            return "";
60
        }
61
        if (count($relatedTypes) > 1) {
62
            $relatedUpdates .= $this->buildTemplate('backend/fragments/related-process', [
63
                '{{modelNameLowercase}}' => $this->module->getModelNameLowercase(),
64
                '{{relatedTypes}}'         => implode('", "', $this->module->getFilteredColumns(['hasPivot'], true)),
65
            ]);
66
        } else {
67
            $type = $relatedTypes[0];
68
            $relatedUpdates .= $this->getTabs(2).'if ($request->has("'.$type->getColumn().'")) {'.PHP_EOL;
69
            $relatedUpdates .= $this->getTabs(3).'$'.$this->module->getModelNameLowercase().'->'.$type->getColumn().'()->sync($request->input("'.$type->getColumn().'"));'.PHP_EOL;
70
            $relatedUpdates .= $this->getTabs(2).'}'.PHP_EOL;
71
        }
72
        return $relatedUpdates;
73
    }
74
75
    protected function getFileUploads() {
76
        $fileUploads = "";
77
        $fileFields = $this->module->getFilteredColumns(['hasImage', 'hasFile']);
78
        foreach ($fileFields as $fileField) {
79
            $processMethod = $fileField->hasFile() ? 'process' : 'processImage';
80
            $fileUploads .= $this->getTabs(2).'if ($request->has("'.$fileField->getColumn().'")) {'.PHP_EOL;
81
            if ($fileField->hasMultipleFiles()) {
82
                $fileUploads .= $this->getTabs(3).'$'.$fileField->getColumn().'=[];'.PHP_EOL;
83
                $fileUploads .= $this->getTabs(3).'foreach($request->input("'.$fileField->getColumn().'") as $input){'.PHP_EOL;
84
                $fileUploads .= $this->getTabs(4).'$uploadData = $this->uploader->'.$processMethod.'($input, "'.$this->module->getModelNameLowercase().'");'.PHP_EOL;
85
                $fileUploads .= $this->getTabs(4).'$'.$fileField->getColumn().'[] = new '.$fileField->getRelatedModel().'($uploadData);'.PHP_EOL;
86
                $fileUploads .= $this->getTabs(3).'}'.PHP_EOL;
87
                $fileUploads .= $this->getTabs(3).'$'.$this->module->getModelNameLowercase().'->'.$fileField->getColumn().'()->saveMany($'.$fileField->getColumn().');'.PHP_EOL;
88
89
            } else {
90
                $fileUploads .= $this->getTabs(3).'$uploadData = $this->uploader->'.$processMethod.'($request->input("'.$fileField->getColumn().'"), "'.$this->module->getModelNameLowercase().'");'.PHP_EOL;
91
                $fileUploads .= $this->getTabs(3).'if (empty($uploadData["errors"])) {'.PHP_EOL;
92
                $fileUploads .= $this->getTabs(4).'$updateData["'.$fileField->getColumn().'"] = $uploadData["filename"];'.PHP_EOL;
93
                $fileUploads .= $this->getTabs(3).'}'.PHP_EOL;
94
            }
95
            $fileUploads .= $this->getTabs(2).'}'.PHP_EOL;
96
        }
97
        return $fileUploads;
98
    }
99
100
    protected function getForeignData() {
101
        $foreignData = "";
102
        $parents = $this->module->getFilteredColumns(['hasPivot', 'hasSingleRelation']);
103
        $columns = [];
104
        foreach ($parents as $type) {
105
            $column = $type->getRelatedModule();
106
            if (!in_array($column, $columns)) {
107
                $foreignData .= "'".$column."' => ".$type->getRelatedModel()."::all(),".PHP_EOL.$this->getTabs(3);
108
                $columns[] = $column;
109
            }
110
        }
111
        return $foreignData;
112
    }
113
114
    protected function getUsedModels() {
115
        $namespace = "App\\Models\\";
116
        $usedModels = "use ".$namespace.$this->module->getModelName().";";
117
118
        $classes = [$namespace.$this->module->getModelName()];
119
        foreach ($this->module->getFilteredColumns(['hasSingleRelation', 'hasPivot', 'hasModel']) as $type) {
120
            $model = $type->getRelatedModel();
121
            $class = ($model == 'User') ? config('laragen.options.user_model') : "App\\Models\\".$model;
122
            if (in_array($class, $classes)) {
123
                continue;
124
            }
125
            $classes[] = $class;
126
            $usedModels .= PHP_EOL."use ".$class.";";
127
        }
128
        return $usedModels;
129
    }
130
}
131