Skip to content

Commit cb9e33c

Browse files
feat: Add Resource Generate and use in API Controller (#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 14fee1b commit cb9e33c

10 files changed

+510
-0
lines changed

config/laravel_generator.php

Lines changed: 6 additions & 0 deletions
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',
@@ -130,6 +134,8 @@
130134

131135
'repository_pattern' => true,
132136

137+
'resources' => false,
138+
133139
'excluded_fields' => ['id'], // Array of columns that doesn't required while creating module
134140
],
135141

src/Commands/BaseCommand.php

Lines changed: 6 additions & 0 deletions
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;
@@ -114,6 +115,10 @@ public function generateAPIItems()
114115
$apiTestGenerator = new APITestGenerator($this->commandData);
115116
$apiTestGenerator->generate();
116117
}
118+
if ($this->commandData->getOption('resources')) {
119+
$apiResourceGenerator = new APIResourceGenerator($this->commandData);
120+
$apiResourceGenerator->generate();
121+
}
117122
}
118123

119124
public function generateScaffoldItems()
@@ -307,6 +312,7 @@ public function getOptions()
307312
['seeder', null, InputOption::VALUE_NONE, 'To generate seeder'],
308313
['localized', null, InputOption::VALUE_NONE, 'Localize files.'],
309314
['repositoryPattern', null, InputOption::VALUE_REQUIRED, 'Repository Pattern'],
315+
['resources', null, InputOption::VALUE_REQUIRED, 'Resources'],
310316
['connection', null, InputOption::VALUE_REQUIRED, 'Specify connection name'],
311317
['jqueryDT', null, InputOption::VALUE_NONE, 'Generate listing screen into JQuery Datatables'],
312318
];

src/Common/GeneratorConfig.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ class GeneratorConfig
1414
public $nsModelExtend;
1515

1616
public $nsApiController;
17+
public $nsApiResource;
1718
public $nsApiRequest;
1819

1920
public $nsRequest;
@@ -36,6 +37,7 @@ class GeneratorConfig
3637
public $pathViewProvider;
3738

3839
public $pathApiController;
40+
public $pathApiResource;
3941
public $pathApiRequest;
4042
public $pathApiRoutes;
4143
public $pathApiTests;
@@ -93,6 +95,7 @@ class GeneratorConfig
9395
'factory',
9496
'seeder',
9597
'repositoryPattern',
98+
'resources',
9699
'localized',
97100
'connection',
98101
'jqueryDT',
@@ -151,6 +154,10 @@ public function loadNamespaces(CommandData &$commandData)
151154
'infyom.laravel_generator.namespace.api_controller',
152155
'App\Http\Controllers\API'
153156
).$prefix;
157+
$this->nsApiResource = config(
158+
'infyom.laravel_generator.namespace.api_resource',
159+
'App\Http\Resources'
160+
).$prefix;
154161
$this->nsApiRequest = config('infyom.laravel_generator.namespace.api_request', 'App\Http\Requests\API').$prefix;
155162

156163
$this->nsRequest = config('infyom.laravel_generator.namespace.request', 'App\Http\Requests').$prefix;
@@ -194,6 +201,11 @@ public function loadPaths()
194201
app_path('Http/Controllers/API/')
195202
).$prefix;
196203

204+
$this->pathApiResource = config(
205+
'infyom.laravel_generator.path.api_resource',
206+
app_path('Http/Resources/')
207+
).$prefix;
208+
197209
$this->pathApiRequest = config(
198210
'infyom.laravel_generator.path.api_request',
199211
app_path('Http/Requests/API/')
@@ -245,6 +257,7 @@ public function loadDynamicVariables(CommandData &$commandData)
245257
$commandData->addDynamicVariable('$NAMESPACE_MODEL_EXTEND$', $this->nsModelExtend);
246258

247259
$commandData->addDynamicVariable('$NAMESPACE_API_CONTROLLER$', $this->nsApiController);
260+
$commandData->addDynamicVariable('$NAMESPACE_API_RESOURCE$', $this->nsApiResource);
248261
$commandData->addDynamicVariable('$NAMESPACE_API_REQUEST$', $this->nsApiRequest);
249262

250263
$commandData->addDynamicVariable('$NAMESPACE_BASE_CONTROLLER$', $this->nsBaseController);
@@ -387,6 +400,7 @@ public function prepareOptions(CommandData &$commandData)
387400

388401
$this->options['softDelete'] = config('infyom.laravel_generator.options.softDelete', false);
389402
$this->options['repositoryPattern'] = config('infyom.laravel_generator.options.repository_pattern', true);
403+
$this->options['resources'] = config('infyom.laravel_generator.options.resources', true);
390404
if (!empty($this->options['skip'])) {
391405
$this->options['skip'] = array_map('trim', explode(',', $this->options['skip']));
392406
}

src/Generators/API/APIControllerGenerator.php

Lines changed: 4 additions & 0 deletions
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);
Lines changed: 61 additions & 0 deletions
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+
}
Lines changed: 112 additions & 0 deletions
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+
}
Lines changed: 91 additions & 0 deletions
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)