Skip to content

Commit baaf634

Browse files
feat: Add Resource Generate and use in API Controller (InfyOmLabs#917)
* Add Resource Generate and use in API Controller * refactor: removed commented line * refactor: make resources default false Co-authored-by: Vishal Ribdiya <[email protected]>
1 parent 45217de commit baaf634

10 files changed

+510
-0
lines changed

config/laravel_generator.php

+6
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@
3131

3232
'api_controller' => app_path('Http/Controllers/API/'),
3333

34+
'api_resource' => app_path('Http/Resources/'),
35+
3436
'repository_test' => base_path('tests/Repositories/'),
3537

3638
'api_test' => base_path('tests/APIs/'),
@@ -71,6 +73,8 @@
7173

7274
'api_controller' => 'App\Http\Controllers\API',
7375

76+
'api_resource' => 'App\Http\Resources',
77+
7478
'request' => 'App\Http\Requests',
7579

7680
'api_request' => 'App\Http\Requests\API',
@@ -134,6 +138,8 @@
134138

135139
'repository_pattern' => true,
136140

141+
'resources' => false,
142+
137143
'excluded_fields' => ['id'], // Array of columns that doesn't required while creating module
138144
],
139145

src/Commands/BaseCommand.php

+6
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use InfyOm\Generator\Common\CommandData;
88
use InfyOm\Generator\Generators\API\APIControllerGenerator;
99
use InfyOm\Generator\Generators\API\APIRequestGenerator;
10+
use InfyOm\Generator\Generators\API\APIResourceGenerator;
1011
use InfyOm\Generator\Generators\API\APIRoutesGenerator;
1112
use InfyOm\Generator\Generators\API\APITestGenerator;
1213
use InfyOm\Generator\Generators\FactoryGenerator;
@@ -113,6 +114,10 @@ public function generateAPIItems()
113114
$apiTestGenerator = new APITestGenerator($this->commandData);
114115
$apiTestGenerator->generate();
115116
}
117+
if ($this->commandData->getOption('resources')) {
118+
$apiResourceGenerator = new APIResourceGenerator($this->commandData);
119+
$apiResourceGenerator->generate();
120+
}
116121
}
117122

118123
public function generateScaffoldItems()
@@ -306,6 +311,7 @@ public function getOptions()
306311
['seeder', null, InputOption::VALUE_NONE, 'To generate seeder'],
307312
['localized', null, InputOption::VALUE_NONE, 'Localize files.'],
308313
['repositoryPattern', null, InputOption::VALUE_REQUIRED, 'Repository Pattern'],
314+
['resources', null, InputOption::VALUE_REQUIRED, 'Resources'],
309315
['connection', null, InputOption::VALUE_REQUIRED, 'Specify connection name'],
310316
['jqueryDT', null, InputOption::VALUE_NONE, 'Generate listing screen into JQuery Datatables'],
311317
];

src/Common/GeneratorConfig.php

+14
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ class GeneratorConfig
1717
public $nsFactory;
1818

1919
public $nsApiController;
20+
public $nsApiResource;
2021
public $nsApiRequest;
2122

2223
public $nsRequest;
@@ -39,6 +40,7 @@ class GeneratorConfig
3940
public $pathViewProvider;
4041

4142
public $pathApiController;
43+
public $pathApiResource;
4244
public $pathApiRequest;
4345
public $pathApiRoutes;
4446
public $pathApiTests;
@@ -96,6 +98,7 @@ class GeneratorConfig
9698
'factory',
9799
'seeder',
98100
'repositoryPattern',
101+
'resources',
99102
'localized',
100103
'connection',
101104
'jqueryDT',
@@ -156,6 +159,10 @@ public function loadNamespaces(CommandData &$commandData)
156159
'infyom.laravel_generator.namespace.api_controller',
157160
'App\Http\Controllers\API'
158161
).$prefix;
162+
$this->nsApiResource = config(
163+
'infyom.laravel_generator.namespace.api_resource',
164+
'App\Http\Resources'
165+
).$prefix;
159166
$this->nsApiRequest = config('infyom.laravel_generator.namespace.api_request', 'App\Http\Requests\API').$prefix;
160167

161168
$this->nsRequest = config('infyom.laravel_generator.namespace.request', 'App\Http\Requests').$prefix;
@@ -199,6 +206,11 @@ public function loadPaths()
199206
app_path('Http/Controllers/API/')
200207
).$prefix;
201208

209+
$this->pathApiResource = config(
210+
'infyom.laravel_generator.path.api_resource',
211+
app_path('Http/Resources/')
212+
).$prefix;
213+
202214
$this->pathApiRequest = config(
203215
'infyom.laravel_generator.path.api_request',
204216
app_path('Http/Requests/API/')
@@ -253,6 +265,7 @@ public function loadDynamicVariables(CommandData &$commandData)
253265
$commandData->addDynamicVariable('$NAMESPACE_FACTORY$', $this->nsFactory);
254266

255267
$commandData->addDynamicVariable('$NAMESPACE_API_CONTROLLER$', $this->nsApiController);
268+
$commandData->addDynamicVariable('$NAMESPACE_API_RESOURCE$', $this->nsApiResource);
256269
$commandData->addDynamicVariable('$NAMESPACE_API_REQUEST$', $this->nsApiRequest);
257270

258271
$commandData->addDynamicVariable('$NAMESPACE_BASE_CONTROLLER$', $this->nsBaseController);
@@ -395,6 +408,7 @@ public function prepareOptions(CommandData &$commandData)
395408

396409
$this->options['softDelete'] = config('infyom.laravel_generator.options.softDelete', false);
397410
$this->options['repositoryPattern'] = config('infyom.laravel_generator.options.repository_pattern', true);
411+
$this->options['resources'] = config('infyom.laravel_generator.options.resources', true);
398412
if (!empty($this->options['skip'])) {
399413
$this->options['skip'] = array_map('trim', explode(',', $this->options['skip']));
400414
}

src/Generators/API/APIControllerGenerator.php

+4
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@ public function generate()
3636
$templateName .= '_locale';
3737
}
3838

39+
if ($this->commandData->getOption('resources')) {
40+
$templateName .= '_resource';
41+
}
42+
3943
$templateData = get_template("api.controller.$templateName", 'laravel-generator');
4044

4145
$templateData = fill_template($this->commandData->dynamicVars, $templateData);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
<?php
2+
3+
namespace InfyOm\Generator\Generators\API;
4+
5+
use InfyOm\Generator\Common\CommandData;
6+
use InfyOm\Generator\Generators\BaseGenerator;
7+
use InfyOm\Generator\Utils\FileUtil;
8+
9+
class APIResourceGenerator extends BaseGenerator
10+
{
11+
/** @var CommandData */
12+
private $commandData;
13+
14+
/** @var string */
15+
private $path;
16+
17+
/** @var string */
18+
private $fileName;
19+
20+
public function __construct(CommandData $commandData)
21+
{
22+
$this->commandData = $commandData;
23+
$this->path = $commandData->config->pathApiResource;
24+
$this->fileName = $this->commandData->modelName.'Resource.php';
25+
}
26+
27+
public function generate()
28+
{
29+
$templateData = get_template('api.resource.api_resource', 'laravel-generator');
30+
31+
$templateData = fill_template($this->commandData->dynamicVars, $templateData);
32+
33+
$templateData = str_replace(
34+
'$RESOURCE_FIELDS$',
35+
implode(','.infy_nl_tab(1, 3), $this->generateResourceFields()),
36+
$templateData
37+
);
38+
39+
FileUtil::createFile($this->path, $this->fileName, $templateData);
40+
41+
$this->commandData->commandComment("\nAPI Resource created: ");
42+
$this->commandData->commandInfo($this->fileName);
43+
}
44+
45+
private function generateResourceFields()
46+
{
47+
$resourceFields = [];
48+
foreach ($this->commandData->fields as $field) {
49+
$resourceFields[] = "'".$field->name."' => \$this->".$field->name;
50+
}
51+
52+
return $resourceFields;
53+
}
54+
55+
public function rollback()
56+
{
57+
if ($this->rollbackFile($this->path, $this->fileName)) {
58+
$this->commandData->commandComment('API Resource file deleted: '.$this->fileName);
59+
}
60+
}
61+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
<?php
2+
3+
namespace $NAMESPACE_API_CONTROLLER$;
4+
5+
use $NAMESPACE_API_REQUEST$\Create$MODEL_NAME$APIRequest;
6+
use $NAMESPACE_API_REQUEST$\Update$MODEL_NAME$APIRequest;
7+
use $NAMESPACE_MODEL$\$MODEL_NAME$;
8+
use $NAMESPACE_REPOSITORY$\$MODEL_NAME$Repository;
9+
use Illuminate\Http\Request;
10+
use $NAMESPACE_APP$\Http\Controllers\AppBaseController;
11+
use $NAMESPACE_API_RESOURCE$\$MODEL_NAME$Resource;
12+
use Response;
13+
14+
$DOC_CONTROLLER$
15+
class $MODEL_NAME$APIController extends AppBaseController
16+
{
17+
/** @var $MODEL_NAME$Repository */
18+
private $$MODEL_NAME_CAMEL$Repository;
19+
20+
public function __construct($MODEL_NAME$Repository $$MODEL_NAME_CAMEL$Repo)
21+
{
22+
$this->$MODEL_NAME_CAMEL$Repository = $$MODEL_NAME_CAMEL$Repo;
23+
}
24+
25+
$DOC_INDEX$
26+
public function index(Request $request)
27+
{
28+
$$MODEL_NAME_PLURAL_CAMEL$ = $this->$MODEL_NAME_CAMEL$Repository->all(
29+
$request->except(['skip', 'limit']),
30+
$request->get('skip'),
31+
$request->get('limit')
32+
);
33+
34+
return $this->sendResponse(
35+
$MODEL_NAME$Resource::collection($$MODEL_NAME_PLURAL_CAMEL$),
36+
__('messages.retrieved', ['model' => __('models/$MODEL_NAME_PLURAL_CAMEL$.plural')])
37+
);
38+
}
39+
40+
$DOC_STORE$
41+
public function store(Create$MODEL_NAME$APIRequest $request)
42+
{
43+
$input = $request->all();
44+
45+
$$MODEL_NAME_CAMEL$ = $this->$MODEL_NAME_CAMEL$Repository->create($input);
46+
47+
return $this->sendResponse(
48+
new $MODEL_NAME$Resource($$MODEL_NAME_CAMEL$),
49+
__('messages.saved', ['model' => __('models/$MODEL_NAME_PLURAL_CAMEL$.singular')])
50+
);
51+
}
52+
53+
$DOC_SHOW$
54+
public function show($id)
55+
{
56+
/** @var $MODEL_NAME$ $$MODEL_NAME_CAMEL$ */
57+
$$MODEL_NAME_CAMEL$ = $this->$MODEL_NAME_CAMEL$Repository->find($id);
58+
59+
if (empty($$MODEL_NAME_CAMEL$)) {
60+
return $this->sendError(
61+
__('messages.not_found', ['model' => __('models/$MODEL_NAME_PLURAL_CAMEL$.singular')])
62+
);
63+
}
64+
65+
return $this->sendResponse(
66+
new $MODEL_NAME$Resource($$MODEL_NAME_CAMEL$),
67+
__('messages.retrieved', ['model' => __('models/$MODEL_NAME_PLURAL_CAMEL$.singular')])
68+
);
69+
}
70+
71+
$DOC_UPDATE$
72+
public function update($id, Update$MODEL_NAME$APIRequest $request)
73+
{
74+
$input = $request->all();
75+
76+
/** @var $MODEL_NAME$ $$MODEL_NAME_CAMEL$ */
77+
$$MODEL_NAME_CAMEL$ = $this->$MODEL_NAME_CAMEL$Repository->find($id);
78+
79+
if (empty($$MODEL_NAME_CAMEL$)) {
80+
return $this->sendError(
81+
__('messages.not_found', ['model' => __('models/$MODEL_NAME_PLURAL_CAMEL$.singular')])
82+
);
83+
}
84+
85+
$$MODEL_NAME_CAMEL$ = $this->$MODEL_NAME_CAMEL$Repository->update($input, $id);
86+
87+
return $this->sendResponse(
88+
new $MODEL_NAME$Resource($$MODEL_NAME_CAMEL$),
89+
__('messages.updated', ['model' => __('models/$MODEL_NAME_PLURAL_CAMEL$.singular')])
90+
);
91+
}
92+
93+
$DOC_DESTROY$
94+
public function destroy($id)
95+
{
96+
/** @var $MODEL_NAME$ $$MODEL_NAME_CAMEL$ */
97+
$$MODEL_NAME_CAMEL$ = $this->$MODEL_NAME_CAMEL$Repository->find($id);
98+
99+
if (empty($$MODEL_NAME_CAMEL$)) {
100+
return $this->sendError(
101+
__('messages.not_found', ['model' => __('models/$MODEL_NAME_PLURAL_CAMEL$.singular')])
102+
);
103+
}
104+
105+
$$MODEL_NAME_CAMEL$->delete();
106+
107+
return $this->sendResponse(
108+
$id,
109+
__('messages.deleted', ['model' => __('models/$MODEL_NAME_PLURAL_CAMEL$.singular')])
110+
);
111+
}
112+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
<?php
2+
3+
namespace $NAMESPACE_API_CONTROLLER$;
4+
5+
use $NAMESPACE_API_REQUEST$\Create$MODEL_NAME$APIRequest;
6+
use $NAMESPACE_API_REQUEST$\Update$MODEL_NAME$APIRequest;
7+
use $NAMESPACE_MODEL$\$MODEL_NAME$;
8+
use $NAMESPACE_REPOSITORY$\$MODEL_NAME$Repository;
9+
use Illuminate\Http\Request;
10+
use $NAMESPACE_APP$\Http\Controllers\AppBaseController;
11+
use $NAMESPACE_API_RESOURCE$\$MODEL_NAME$Resource;
12+
use Response;
13+
14+
$DOC_CONTROLLER$
15+
class $MODEL_NAME$APIController extends AppBaseController
16+
{
17+
/** @var $MODEL_NAME$Repository */
18+
private $$MODEL_NAME_CAMEL$Repository;
19+
20+
public function __construct($MODEL_NAME$Repository $$MODEL_NAME_CAMEL$Repo)
21+
{
22+
$this->$MODEL_NAME_CAMEL$Repository = $$MODEL_NAME_CAMEL$Repo;
23+
}
24+
25+
$DOC_INDEX$
26+
public function index(Request $request)
27+
{
28+
$$MODEL_NAME_PLURAL_CAMEL$ = $this->$MODEL_NAME_CAMEL$Repository->all(
29+
$request->except(['skip', 'limit']),
30+
$request->get('skip'),
31+
$request->get('limit')
32+
);
33+
34+
return $this->sendResponse($MODEL_NAME$Resource::collection($$MODEL_NAME_PLURAL_CAMEL$), '$MODEL_NAME_PLURAL_HUMAN$ retrieved successfully');
35+
}
36+
37+
$DOC_STORE$
38+
public function store(Create$MODEL_NAME$APIRequest $request)
39+
{
40+
$input = $request->all();
41+
42+
$$MODEL_NAME_CAMEL$ = $this->$MODEL_NAME_CAMEL$Repository->create($input);
43+
44+
return $this->sendResponse(new $MODEL_NAME$Resource($$MODEL_NAME_CAMEL$), '$MODEL_NAME_HUMAN$ saved successfully');
45+
}
46+
47+
$DOC_SHOW$
48+
public function show($id)
49+
{
50+
/** @var $MODEL_NAME$ $$MODEL_NAME_CAMEL$ */
51+
$$MODEL_NAME_CAMEL$ = $this->$MODEL_NAME_CAMEL$Repository->find($id);
52+
53+
if (empty($$MODEL_NAME_CAMEL$)) {
54+
return $this->sendError('$MODEL_NAME_HUMAN$ not found');
55+
}
56+
57+
return $this->sendResponse(new $MODEL_NAME$Resource($$MODEL_NAME_CAMEL$), '$MODEL_NAME_HUMAN$ retrieved successfully');
58+
}
59+
60+
$DOC_UPDATE$
61+
public function update($id, Update$MODEL_NAME$APIRequest $request)
62+
{
63+
$input = $request->all();
64+
65+
/** @var $MODEL_NAME$ $$MODEL_NAME_CAMEL$ */
66+
$$MODEL_NAME_CAMEL$ = $this->$MODEL_NAME_CAMEL$Repository->find($id);
67+
68+
if (empty($$MODEL_NAME_CAMEL$)) {
69+
return $this->sendError('$MODEL_NAME_HUMAN$ not found');
70+
}
71+
72+
$$MODEL_NAME_CAMEL$ = $this->$MODEL_NAME_CAMEL$Repository->update($input, $id);
73+
74+
return $this->sendResponse(new $MODEL_NAME$Resource($$MODEL_NAME_CAMEL$), '$MODEL_NAME$ updated successfully');
75+
}
76+
77+
$DOC_DESTROY$
78+
public function destroy($id)
79+
{
80+
/** @var $MODEL_NAME$ $$MODEL_NAME_CAMEL$ */
81+
$$MODEL_NAME_CAMEL$ = $this->$MODEL_NAME_CAMEL$Repository->find($id);
82+
83+
if (empty($$MODEL_NAME_CAMEL$)) {
84+
return $this->sendError('$MODEL_NAME_HUMAN$ not found');
85+
}
86+
87+
$$MODEL_NAME_CAMEL$->delete();
88+
89+
return $this->sendSuccess('$MODEL_NAME_HUMAN$ deleted successfully');
90+
}
91+
}

0 commit comments

Comments
 (0)