Completed
Push — master ( cb42fc...412120 )
by CodexShaper
04:43
created

CrudController::all()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 24
Code Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 12

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 3
eloc 14
c 2
b 0
f 0
nc 3
nop 1
dl 0
loc 24
ccs 0
cts 19
cp 0
crap 12
rs 9.7998
1
<?php
2
3
namespace CodexShaper\DBM\Http\Controllers;
4
5
use CodexShaper\DBM\Database\Drivers\MongoDB\Type;
6
use CodexShaper\DBM\Database\Schema\Table;
7
use CodexShaper\DBM\Facades\Driver;
8
use DBM;
0 ignored issues
show
Bug introduced by
The type DBM was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
9
use Illuminate\Http\Request;
10
use Illuminate\Support\Str;
11
12
class CrudController extends Controller
13
{
14
15
    public function index()
16
    {
17
        return view('dbm::app');
18
    }
19
20
    public function all(Request $request)
21
    {
22
        if ($request->ajax()) {
23
24
            if (($response = DBM::authorize('crud.browse')) !== true) {
25
                return $response;
26
            }
27
28
            $perPage = (int) $request->perPage;
29
            $query   = $request->q;
30
31
            $userPermissions = DBM::userPermissions();
32
            $tables          = Table::paginate($perPage, null, [], $query);
33
            $newTables       = $this->filterCrudTables($tables);
34
35
            return response()->json([
36
                'success'         => true,
37
                'tables'          => $newTables,
38
                'userPermissions' => $userPermissions,
39
                'pagination'      => $tables,
40
            ]);
41
        }
42
43
        return response()->json(['success' => false]);
44
    }
45
46
    public function filterCrudTables($tables)
47
    {
48
        $objects   = DBM::Object()->all();
49
        $newTables = [];
50
51
        foreach ($tables as $table) {
52
            foreach ($objects as $object) {
53
                if ($table == $object->name) {
54
                    $newTables[] = [
55
                        'name'   => $table,
56
                        'isCrud' => true,
57
                    ];
58
                    continue 2;
59
                }
60
            }
61
62
            $newTables[] = [
63
                'name'   => $table,
64
                'isCrud' => false,
65
            ];
66
        }
67
68
        return $newTables;
69
    }
70
71
    public function getObjectDetails(Request $request)
72
    {
73
        if ($request->ajax()) {
74
75
            try
76
            {
77
                if (!Table::exists($request->table)) {
78
                    throw new \Exception("Sorry! There is no table", 1);
79
                }
80
81
                $tableName           = $request->table;
82
                $relationship_tables = Table::all();
83
84
                $details    = $this->getObject($tableName);
85
                $permission = $details['isCrudExists'] ? 'update' : 'create';
86
87
                if (($response = DBM::authorize("crud.{$permission}")) !== true) {
88
                    return $response;
89
                }
90
91
                $relationshipDetails = (object) [
92
                    'type'                => 'hasOne',
93
                    'foreignTableDetails' => Table::getTable($relationship_tables[0]),
94
                    'localTableDetails'   => Table::getTable($tableName),
95
                ];
96
97
                return response()->json([
98
                    'success'              => true,
99
                    'relationship_tables'  => $relationship_tables,
100
                    'relationship_details' => $relationshipDetails,
101
                    'object'               => $details['object'],
102
                    'fields'               => $details['fields'],
103
                    'isCrudExists'         => $details['isCrudExists'],
104
                    'userPermissions'      => DBM::userPermissions(),
105
                    'driver'               => Driver::getConnectionName(),
106
                ]);
107
108
            } catch (\Exception $e) {
109
                return $this->generateError([$e->getMessage()]);
110
            }
111
        }
112
113
        return response()->json(['success' => false]);
114
    }
115
116
    public function getObject($tableName)
117
    {
118
        $isCrudExists = false;
119
        $fields       = [];
120
121
        if ($object = DBM::Object()->where('name', $tableName)->first()) {
122
            $isCrudExists = true;
123
            if (!$object->model) {
124
                $object->model = DBM::generateModelName($object->name);
125
            }
126
            $fields = $object->fields()->orderBy('order', 'ASC')->get();
127
        }
128
129
        if (!$object) {
130
            $table = Table::getTable($tableName);
131
132
            $object               = new \stdClass;
133
            $object->name         = $table['name'];
134
            $object->slug         = Str::slug($table['name']);
135
            $object->display_name = ucfirst($table['name']);
136
            $object->model        = DBM::generateModelName($table['name']);
137
            $object->controller   = '';
138
139
            $fields = $this->prepareFields($table);
140
        }
141
142
        $object->makeModel = false;
143
144
        return ['object' => $object, 'fields' => $fields, 'isCrudExists' => $isCrudExists];
145
146
    }
147
148
    public function prepareFields($table)
149
    {
150
        $fields = [];
151
        $order  = 1;
152
153
        foreach ($table['columns'] as $column) {
154
155
            $fields[] = (object) [
156
                'name'          => $column->name,
157
                'display_name'  => ucfirst($column->name),
158
                'type'          => DatabaseController::getInputType($column->type['name']),
159
                'create'        => ($column->autoincrement) ? false : true,
160
                'read'          => ($column->autoincrement) ? false : true,
161
                'edit'          => ($column->autoincrement) ? false : true,
162
                'delete'        => ($column->autoincrement) ? false : true,
163
                'function_name' => '',
164
                'order'         => $order,
165
                'settings'      => '{ }',
166
            ];
167
168
            $order++;
169
        }
170
171
        return $fields;
172
    }
173
174
    public function storeOrUpdate(Request $request)
175
    {
176
        if ($request->ajax()) {
177
178
            $table      = $request->object;
179
            $columns    = $request->fields;
180
            $permission = $request->isCrudExists ? 'update' : 'create';
181
182
            if (($response = DBM::authorize('crud.' . $permission)) !== true) {
183
                return $response;
184
            }
185
186
            if (($response = $this->makeModel($table)) !== true) {
187
                return $response;
188
            }
189
190
            if (!class_exists($table['controller'])) {
191
                \DBM::makeController($table['controller']);
192
            }
193
194
            try
195
            {
196
                if ($object = $this->addOrUpdateObject($table)) {
197
                    foreach ($columns as $column) {
198
                        $this->addOrUpdateField($column, $object);
199
                    }
200
                }
201
202
                return response()->json(['success' => true, 'object' => $request->object, 'fields' => $request->fields]);
203
204
            } catch (\Exception $e) {
205
                return $this->generateError([$e->getMessage()]);
206
            }
207
        }
208
209
        return response()->json(['success' => false]);
210
    }
211
212
    public function makeModel($table)
213
    {
214
        if (empty($table['model'])) {
215
            return $this->generateError(["Model Must be provided"]);
216
        }
217
218
        if ($table['makeModel'] && !class_exists($table['model'])) {
219
            \DBM::makeModel($table['model'], $table['name']);
220
        }
221
222
        if (!$table['makeModel'] && !class_exists($table['model'])) {
223
            $error = "Create model {$table['model']} first or checked create model option";
224
            return $this->generateError([$error]);
225
        }
226
227
        return true;
228
    }
229
230
    public function addOrUpdateObject($table)
231
    {
232
        $object = DBM::Object()->where('name', $table['name'])->first();
233
        $action = 'update';
234
        if (!$object) {
235
            $object       = DBM::Object();
236
            $object->name = $table['name'];
237
            $action       = 'save';
238
        }
239
        $object->slug         = Str::slug($table['slug']);
240
        $object->display_name = ucfirst($table['display_name']);
241
        $object->model        = $table['model'];
242
        $object->controller   = $table['controller'];
243
        $object->details      = [
244
            'findColumn'         => $table['findColumn'],
245
            'searchColumn'       => $table['searchColumn'],
246
            'perPage'            => $table['perPage'],
247
            'orderColumn'        => $table['orderColumn'],
248
            'orderDisplayColumn' => $table['orderDisplayColumn'],
249
            'orderDirection'     => $table['orderDirection'],
250
        ];
251
252
        if ($object->{$action}()) {
253
            return $object;
254
        }
255
256
        return false;
257
    }
258
259
    public function addOrUpdateField($column, $object)
260
    {
261
        $field = DBM::Field()->where([
262
            'dbm_object_id' => $object->id,
263
            'name'          => $column['name'],
264
        ])->first();
265
266
        $action = 'update';
267
268
        if (!$field) {
269
            $field                = DBM::Field();
270
            $field->dbm_object_id = $object->id;
271
            $field->name          = $column['name'];
272
            $action               = 'save';
273
        }
274
275
        $field->display_name  = ucfirst($column['display_name']);
276
        $field->type          = $column['type'];
277
        $field->create        = isset($column['create']) ? $column['create'] : false;
278
        $field->read          = isset($column['read']) ? $column['read'] : false;
279
        $field->edit          = isset($column['edit']) ? $column['edit'] : false;
280
        $field->delete        = isset($column['delete']) ? $column['delete'] : false;
281
        $field->order         = $column['order'];
282
        $field->function_name = isset($column['function_name']) ? $column['function_name'] : "";
283
        $field->settings      = json_decode($column['settings']);
284
285
        $field->{$action}();
286
    }
287
288
    public function delete(Request $request)
289
    {
290
        if ($request->ajax()) {
291
292
            if (($response = DBM::authorize('crud.delete')) !== true) {
293
                return $response;
294
            }
295
296
            $object = DBM::Object()->where('name', $request->table)->first();
297
            if ($object) {
298
                $object->fields()->delete();
299
                $object->delete();
300
                return response()->json(['success' => true]);
301
            }
302
        }
303
304
        return response()->json(['success' => false]);
305
    }
306
307
    protected function generateError($errors)
308
    {
309
        return response()->json([
310
            'success' => false,
311
            'errors'  => $errors,
312
        ], 400);
313
    }
314
}
315