Api::getForeignData()   A
last analyzed

Complexity

Conditions 3
Paths 3

Size

Total Lines 12
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 3
eloc 9
c 1
b 0
f 0
nc 3
nop 0
dl 0
loc 12
rs 9.9666
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
    protected $destination = "laragen/app/Http/Controllers/Backend/Api";
10
    protected $namespace  = "Laragen\App\Http\Controllers\Backend\Api";
11
    protected $template  = "backend/Api";
12
    protected $fileSuffix  = "ApiController";
13
14
    protected $childDestination = "app/Http/Controllers/Backend/Api";
15
    protected $childNamespace  = "App\Http\Controllers\Backend\Api";
16
17
    public function generate()
18
    {
19
        $apiControllerTemplate = $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($apiControllerTemplate);
33
    }
34
35
    protected function getCreateRelated() {
36
        $relatedUpdates = "";
37
        $relatedTypes = $this->module->getFilteredColumns(['hasPivot']);
38
39
        if (empty($relatedTypes)) {
40
            return "";
41
        }
42
        if (count($relatedTypes) > 1) {
43
            $relatedUpdates .= $this->buildTemplate('backend/fragments/related-create', [
44
                '{{modelNameLowercase}}' => $this->module->getModelNameLowercase(),
45
                '{{relatedTypes}}'         => implode('", "', $this->module->getFilteredColumns(['hasPivot', 'hasModel'], true)),
46
            ]);
47
        } else {
48
            $type = $relatedTypes[0];
49
            $relatedUpdates .= 'if ($request->has("'.$type->getColumn().'")) {'.PHP_EOL;
50
            $relatedUpdates .= $this->getTabs(3).'$'.$this->module->getModelNameLowercase().'->'.$type->getColumn().'()->attach($request->input("'.$type->getColumn().'"));'.PHP_EOL;
51
            $relatedUpdates .= $this->getTabs(2).'}'.PHP_EOL;
52
        }
53
        return $relatedUpdates;
54
    }
55
56
    protected function getRelatedUpdates() {
57
        $relatedUpdates = "";
58
        $relatedTypes = $this->module->getFilteredColumns(['hasPivot']);
59
        if (empty($relatedTypes)) {
60
            return "";
61
        }
62
        if (count($relatedTypes) > 1) {
63
            $relatedUpdates .= $this->buildTemplate('backend/fragments/related-process', [
64
                '{{modelNameLowercase}}' => $this->module->getModelNameLowercase(),
65
                '{{relatedTypes}}'         => implode('", "', $this->module->getFilteredColumns(['hasPivot'], true)),
66
            ]);
67
        } else {
68
            $type = $relatedTypes[0];
69
            $relatedUpdates .= 'if ($request->has("'.$type->getColumn().'")) {'.PHP_EOL;
70
            $relatedUpdates .= $this->getTabs(3).'$'.$this->module->getModelNameLowercase().'->'.$type->getColumn().'()->sync($request->input("'.$type->getColumn().'"));'.PHP_EOL;
71
            $relatedUpdates .= $this->getTabs(2).'}'.PHP_EOL;
72
        }
73
        return $relatedUpdates;
74
    }
75
76
    protected function getFileUploads() {
77
        $fileUploads = "";
78
        $fileFields = $this->module->getFilteredColumns(['hasFile']);
79
        if (empty($fileFields)) {
80
            return "";
81
        }
82
        if (count($fileFields) > 1) {
83
            $fileUploads .= $this->buildTemplate('backend/fragments/upload-process', [
84
                '{{modelNameLowercase}}' => $this->module->getModelNameLowercase(),
85
                '{{fileFields}}'         => implode('", "', $this->module->getFilteredColumns(['hasFile'], true)),
86
            ]);
87
        } else {
88
            $fileField = $fileFields[0];
89
            $fileUploads .= 'if ($request->has("'.$fileField->getColumn().'")) {'.PHP_EOL;
90
            $fileUploads .= $this->getTabs(3).'$this->uploader->process($request->input("'.$fileField->getColumn().'"), "category");'.PHP_EOL;
91
            $fileUploads .= $this->getTabs(2).'}'.PHP_EOL;
92
        }
93
        return $fileUploads;
94
    }
95
96
    protected function getForeignData() {
97
        $foreignData = "";
98
        $parents = $this->module->getFilteredColumns(['hasPivot', 'hasSingleRelation']);
99
        $columns = [];
100
        foreach ($parents as $type) {
101
            $column = $type->getRelatedModule();
102
            if (!in_array($column, $columns)) {
103
                $foreignData .= "'".$column."' => ".$type->getRelatedModel()."::all(),".PHP_EOL.$this->getTabs(3);
104
                $columns[] = $column;
105
            }
106
        }
107
        return $foreignData;
108
    }
109
110
    protected function getUsedModels() {
111
        $namespace = "App\\Models\\";
112
        $usedModels = "use ".$namespace.$this->module->getModelName().";";
113
114
        $classes = [$namespace.$this->module->getModelName()];
115
        foreach ($this->module->getFilteredColumns(['hasSingleRelation', 'hasPivot', 'hasModel']) as $type) {
116
            $model = $type->getRelatedModel();
117
            $class = ($model == 'User') ? config('laragen.options.user_model') : "App\\Models\\".$model;
118
            if (in_array($class, $classes)) {
119
                continue;
120
            }
121
            $classes[] = $class;
122
            $usedModels .= PHP_EOL."use ".$class.";";
123
        }
124
        return $usedModels;
125
    }
126
}
127