Passed
Pull Request — master (#23)
by Prateek
07:40
created

Api::generate()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 17
Code Lines 13

Duplication

Lines 0
Ratio 0 %

Importance

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