bmd-extension 1.6.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/.vscode/launch.json +14 -0
  2. package/.vscode/settings.json +1 -0
  3. package/CHANGELOG.md +9 -0
  4. package/DEPLOY.md +4 -0
  5. package/README.md +17 -0
  6. package/README_PRIVATE.md +1 -0
  7. package/build.sh +5 -0
  8. package/logo.png +0 -0
  9. package/media/dark/add.svg +40 -0
  10. package/media/dark/block.svg +1 -0
  11. package/media/dark/checklist-1.svg +1 -0
  12. package/media/dark/checklist.svg +1 -0
  13. package/media/dark/control.svg +1 -0
  14. package/media/dark/create.svg +1 -0
  15. package/media/dark/delete-1.svg +1 -0
  16. package/media/dark/delete.svg +1 -0
  17. package/media/dark/deploy-1.svg +2 -0
  18. package/media/dark/deploy.svg +2 -0
  19. package/media/dark/documents.svg +66 -0
  20. package/media/dark/earth.svg +68 -0
  21. package/media/dark/exe.svg +15 -0
  22. package/media/dark/export.svg +1 -0
  23. package/media/dark/function.svg +1 -0
  24. package/media/dark/game-controller.svg +77 -0
  25. package/media/dark/get.svg +1 -0
  26. package/media/dark/id-card.svg +59 -0
  27. package/media/dark/identity.svg +81 -0
  28. package/media/dark/import.svg +1 -0
  29. package/media/dark/information.svg +1 -0
  30. package/media/dark/interface.svg +1 -0
  31. package/media/dark/layout.svg +41 -0
  32. package/media/dark/leaf.svg +54 -0
  33. package/media/dark/list.svg +13 -0
  34. package/media/dark/logo.svg +249 -0
  35. package/media/dark/mockup.svg +1 -0
  36. package/media/dark/needle.svg +1 -0
  37. package/media/dark/pass.svg +46 -0
  38. package/media/dark/plus.svg +1 -0
  39. package/media/dark/post.svg +1 -0
  40. package/media/dark/quit.svg +1 -0
  41. package/media/dark/rocket.svg +28 -0
  42. package/media/dark/service.svg +1 -0
  43. package/media/dark/settings.svg +98 -0
  44. package/media/dark/social.svg +1 -0
  45. package/media/dark/spaceship-1.svg +1 -0
  46. package/media/dark/spaceship-2.svg +1 -0
  47. package/media/dark/spaceship.svg +1 -0
  48. package/media/dark/support.svg +88 -0
  49. package/media/dark/transfer.svg +1 -0
  50. package/media/dark/transform.svg +92 -0
  51. package/media/dark/update.svg +45 -0
  52. package/media/dark/upload-1.svg +1 -0
  53. package/media/dark/upload.svg +41 -0
  54. package/media/dark/vaccine.svg +1 -0
  55. package/media/dark/vr-gaming.svg +1 -0
  56. package/media/light/add.svg +40 -0
  57. package/media/light/block.svg +1 -0
  58. package/media/light/checklist-1.svg +1 -0
  59. package/media/light/checklist.svg +1 -0
  60. package/media/light/control.svg +1 -0
  61. package/media/light/create.svg +1 -0
  62. package/media/light/delete-1.svg +1 -0
  63. package/media/light/delete.svg +1 -0
  64. package/media/light/deploy-1.svg +2 -0
  65. package/media/light/deploy.svg +2 -0
  66. package/media/light/documents.svg +66 -0
  67. package/media/light/earth.svg +68 -0
  68. package/media/light/exe.svg +15 -0
  69. package/media/light/export.svg +1 -0
  70. package/media/light/function.svg +1 -0
  71. package/media/light/game-controller.svg +77 -0
  72. package/media/light/get.svg +1 -0
  73. package/media/light/id-card.svg +59 -0
  74. package/media/light/identity.svg +81 -0
  75. package/media/light/import.svg +1 -0
  76. package/media/light/information.svg +1 -0
  77. package/media/light/interface.svg +1 -0
  78. package/media/light/layout.svg +41 -0
  79. package/media/light/leaf.svg +54 -0
  80. package/media/light/list.svg +13 -0
  81. package/media/light/logo.svg +249 -0
  82. package/media/light/mockup.svg +1 -0
  83. package/media/light/needle.svg +1 -0
  84. package/media/light/pass.svg +46 -0
  85. package/media/light/plus.svg +1 -0
  86. package/media/light/post.svg +1 -0
  87. package/media/light/quit.svg +1 -0
  88. package/media/light/rocket.svg +28 -0
  89. package/media/light/service.svg +1 -0
  90. package/media/light/settings.svg +98 -0
  91. package/media/light/social.svg +1 -0
  92. package/media/light/spaceship-1.svg +1 -0
  93. package/media/light/spaceship-2.svg +1 -0
  94. package/media/light/spaceship.svg +1 -0
  95. package/media/light/support.svg +88 -0
  96. package/media/light/transfer.svg +1 -0
  97. package/media/light/transform.svg +92 -0
  98. package/media/light/update.svg +45 -0
  99. package/media/light/upload-1.svg +1 -0
  100. package/media/light/upload.svg +41 -0
  101. package/media/light/vaccine.svg +1 -0
  102. package/media/light/vr-gaming.svg +1 -0
  103. package/package-lock.json +6430 -0
  104. package/package.json +540 -0
  105. package/snippets-tsr.json +512 -0
  106. package/snippets.json +761 -0
  107. package/src/API.ts +14 -0
  108. package/src/FsProvider.ts +105 -0
  109. package/src/Request.ts +24 -0
  110. package/src/assets/api/api.txt +27 -0
  111. package/src/assets/configuration/AdminConfigurationController.ts.txt +72 -0
  112. package/src/assets/configuration/Configuration.ts.txt +37 -0
  113. package/src/assets/configuration/ConfigurationService.ts.txt +26 -0
  114. package/src/assets/contentDefine/AdminContentDefineController.ts.txt +91 -0
  115. package/src/assets/contentDefine/ContentDefine.ts.txt +45 -0
  116. package/src/assets/contentDefine/ContentDefineService.ts.txt +19 -0
  117. package/src/assets/contentDefine/CustomerContentDefineController.ts.txt +34 -0
  118. package/src/assets/controller/controller.txt +46 -0
  119. package/src/assets/controller/controllerResource.txt +103 -0
  120. package/src/assets/entity/entity.txt +22 -0
  121. package/src/assets/entity-request/entity-request.txt +18 -0
  122. package/src/assets/init/.env.example.txt +37 -0
  123. package/src/assets/init/.env.production.txt +37 -0
  124. package/src/assets/init/.gitignore.txt +8 -0
  125. package/src/assets/init/config.ts.txt +55 -0
  126. package/src/assets/init/deploy.sh.txt +46 -0
  127. package/src/assets/init/package-lock.json.txt +4184 -0
  128. package/src/assets/init/package.json.txt +79 -0
  129. package/src/assets/init/src/Server.ts.txt +167 -0
  130. package/src/assets/init/src/controllers/admin/AuthController.ts.txt +96 -0
  131. package/src/assets/init/src/controllers/admin/CustomerController.ts.txt +107 -0
  132. package/src/assets/init/src/controllers/admin/RoleController.ts.txt +143 -0
  133. package/src/assets/init/src/controllers/admin/StaffController.ts.txt +192 -0
  134. package/src/assets/init/src/controllers/customer/AuthController.ts.txt +170 -0
  135. package/src/assets/init/src/controllers/customer/CustomerController.ts.txt +32 -0
  136. package/src/assets/init/src/core/entity/CoreEntity.ts.txt +70 -0
  137. package/src/assets/init/src/core/services/CoreService.ts.txt +21 -0
  138. package/src/assets/init/src/entity/Customer.ts.txt +68 -0
  139. package/src/assets/init/src/entity/Permission.ts.txt +29 -0
  140. package/src/assets/init/src/entity/Role.ts.txt +36 -0
  141. package/src/assets/init/src/entity/Staff.ts.txt +54 -0
  142. package/src/assets/init/src/entity-request/CustomerInsert.ts.txt +42 -0
  143. package/src/assets/init/src/entity-request/CustomerUpdate.ts.txt +40 -0
  144. package/src/assets/init/src/entity-request/PermissionImport.ts.txt +12 -0
  145. package/src/assets/init/src/entity-request/StaffUpdate.ts.txt +33 -0
  146. package/src/assets/init/src/index.ts.txt +13 -0
  147. package/src/assets/init/src/middleware/auth/Verification.ts.txt +16 -0
  148. package/src/assets/init/src/middleware/auth/VerificationJWT.ts.txt +16 -0
  149. package/src/assets/init/src/middleware/auth/strategy/AuthStrategy.ts.txt +5 -0
  150. package/src/assets/init/src/middleware/auth/strategy/JWT.ts.txt +147 -0
  151. package/src/assets/init/src/middleware/error/handleError.ts.txt +22 -0
  152. package/src/assets/init/src/middleware/error/handleNotFound.ts.txt +7 -0
  153. package/src/assets/init/src/middleware/response/CustomSendResponse.ts.txt +35 -0
  154. package/src/assets/init/src/middleware/response/responseAPI.ts.txt +76 -0
  155. package/src/assets/init/src/middleware/validator/Validator.ts.txt +103 -0
  156. package/src/assets/init/src/services/CustomerService.ts.txt +79 -0
  157. package/src/assets/init/src/services/InitService.ts.txt +11 -0
  158. package/src/assets/init/src/services/MailService.ts.txt +271 -0
  159. package/src/assets/init/src/services/RoleService.ts.txt +66 -0
  160. package/src/assets/init/src/services/StaffService.ts.txt +104 -0
  161. package/src/assets/init/src/ssl/certificate-ca.crt +0 -0
  162. package/src/assets/init/src/ssl/certificate.crt +0 -0
  163. package/src/assets/init/src/ssl/private.key +0 -0
  164. package/src/assets/init/src/types/express.d.ts.txt +97 -0
  165. package/src/assets/init/src/util/expo.ts.txt +53 -0
  166. package/src/assets/init/src/util/helper.ts.txt +321 -0
  167. package/src/assets/init/src/util/language.ts.txt +8 -0
  168. package/src/assets/init/src/util/logger.ts.txt +47 -0
  169. package/src/assets/init/src/util/mailer.ts.txt +32 -0
  170. package/src/assets/init/src/util/password.ts.txt +13 -0
  171. package/src/assets/init/tsconfig.json.txt +26 -0
  172. package/src/assets/service/service.txt +34 -0
  173. package/src/constant.ts +83 -0
  174. package/src/extension.ts +459 -0
  175. package/src/provider/codeAction/controller/addPathParams.ts +65 -0
  176. package/src/provider/codeAction/controller/addTokenParam.ts +43 -0
  177. package/src/provider/codeAction/controller/addValidation.ts +47 -0
  178. package/src/provider/codeAction/controller/codeAction.ts +34 -0
  179. package/src/provider/codeAction/controller/util.ts +48 -0
  180. package/src/provider/codeAction/entity/codeAction.ts +48 -0
  181. package/src/provider/codeAction/entity/handleBuilder.ts +87 -0
  182. package/src/provider/codeAction/entity/handleFunction.ts +487 -0
  183. package/src/provider/codeAction/entity/handleProperty.ts +32 -0
  184. package/src/provider/codeAction/entity/handleRelation.ts +72 -0
  185. package/src/provider/codeAction/entity/helper.ts +132 -0
  186. package/src/provider/codeAction/entity-request/codeAction.ts +178 -0
  187. package/src/provider/codeAction/enum/codeAction.ts +95 -0
  188. package/src/provider/codeAction/service/codeAction.ts +232 -0
  189. package/src/provider/completion/CompletionProvider.ts +108 -0
  190. package/src/provider/errorChecking/checkHeaderToken.ts +60 -0
  191. package/src/provider/errorChecking/checkPathParam.ts +64 -0
  192. package/src/provider/errorChecking/checkRequired.ts +56 -0
  193. package/src/provider/errorChecking/errorChecking.ts +35 -0
  194. package/src/provider/errorChecking/util.ts +56 -0
  195. package/src/provider/treeDataProvider/Dependency.ts +26 -0
  196. package/src/provider/treeDataProvider/TreeProviderCommand.ts +60 -0
  197. package/src/provider/treeDataProvider/TreeProviderProject.ts +65 -0
  198. package/src/provider/treeDataProvider/api/createApi.ts +106 -0
  199. package/src/provider/treeDataProvider/controller/command/createController.ts +99 -0
  200. package/src/provider/treeDataProvider/controller/command/handleMethod.ts +363 -0
  201. package/src/provider/treeDataProvider/controller/treeData.ts +81 -0
  202. package/src/provider/treeDataProvider/deploy/command/handleDeploy.ts +70 -0
  203. package/src/provider/treeDataProvider/deploy/treeData.ts +21 -0
  204. package/src/provider/treeDataProvider/entity/command/addProperty.ts +144 -0
  205. package/src/provider/treeDataProvider/entity/command/addRelation.ts +125 -0
  206. package/src/provider/treeDataProvider/entity/command/createEntity.ts +53 -0
  207. package/src/provider/treeDataProvider/entity/command/createEntityRequest.ts +65 -0
  208. package/src/provider/treeDataProvider/entity/command/exportInterface.ts +130 -0
  209. package/src/provider/treeDataProvider/entity/treeData.ts +49 -0
  210. package/src/provider/treeDataProvider/module/command/configuration.ts +34 -0
  211. package/src/provider/treeDataProvider/module/command/contentDefine.ts +36 -0
  212. package/src/provider/treeDataProvider/module/command/initProject.ts +155 -0
  213. package/src/provider/treeDataProvider/module/treeData.ts +28 -0
  214. package/src/provider/treeDataProvider/project/command/addEnum.ts +0 -0
  215. package/src/provider/treeDataProvider/project/command/addProjectName.ts +23 -0
  216. package/src/provider/treeDataProvider/project/command/getProjectDetails.ts +284 -0
  217. package/src/provider/treeDataProvider/project/treeData.ts +28 -0
  218. package/src/provider/treeDataProvider/service/command/createService.ts +70 -0
  219. package/src/provider/treeDataProvider/service/command/handleConstructor.ts +134 -0
  220. package/src/provider/treeDataProvider/service/treeData.ts +25 -0
  221. package/src/types/project.d.ts +7 -0
  222. package/src/util.ts +145 -0
  223. package/src/utils/Password.ts +19 -0
  224. package/tsconfig.json +18 -0
  225. package/tslint.json +15 -0
  226. package/vsc-extension-quickstart.md +42 -0
@@ -0,0 +1,60 @@
1
+ import * as vscode from 'vscode';
2
+ import { entityDependencies } from './entity/treeData';
3
+ import { Dependency } from './Dependency';
4
+ import { controllerDependencies } from './controller/treeData';
5
+ import { serviceDependencies } from './service/treeData';
6
+ import { moduleDependencies } from './module/treeData';
7
+ import { deployDependencies } from './deploy/treeData';
8
+
9
+ export interface ItemCommand {
10
+ id: string
11
+ title: string
12
+ icon: string
13
+ }
14
+
15
+ export class TreeProviderCommand implements vscode.TreeDataProvider<any> {
16
+
17
+ private _onDidChangeTreeData: vscode.EventEmitter<Dependency | undefined | void> = new vscode.EventEmitter<Dependency | undefined | void>();
18
+ readonly onDidChangeTreeData: vscode.Event<Dependency | undefined | void> = this._onDidChangeTreeData.event;
19
+
20
+ constructor(private workspaceRoot: any) { }
21
+
22
+ refresh(): void {
23
+ this._onDidChangeTreeData.fire();
24
+ }
25
+
26
+ getTreeItem(element: Dependency): vscode.TreeItem {
27
+ return element;
28
+ }
29
+
30
+ getChildren(element?: Dependency): Thenable<Dependency[]> {
31
+ function divide(part: string, icon: string = '') {
32
+ const totalLetter = 32
33
+ const remainSeparator = totalLetter - part.length
34
+
35
+ const separator = `:`.repeat(parseInt((remainSeparator / 2) + ''))
36
+
37
+ return new Dependency(
38
+ `${separator}${part.toUpperCase()}${separator}`,
39
+ vscode.TreeItemCollapsibleState.None,
40
+ undefined,
41
+ undefined,
42
+ icon ? icon : 'none'
43
+ );
44
+ }
45
+
46
+ return Promise.resolve([
47
+ divide('entity'),
48
+ ...entityDependencies,
49
+ divide('service'),
50
+ ...serviceDependencies,
51
+ divide('controller'),
52
+ ...controllerDependencies,
53
+ divide('module'),
54
+ ...moduleDependencies,
55
+ divide('deploy'),
56
+ ...deployDependencies,
57
+ ]);
58
+ }
59
+ }
60
+
@@ -0,0 +1,65 @@
1
+ import Axios from 'axios';
2
+ import * as vscode from 'vscode';
3
+ import { Request } from '../../Request';
4
+ import { API } from '../../API';
5
+ import { Dependency } from './Dependency';
6
+
7
+ export interface Project {
8
+ id: number
9
+ createdAt: number
10
+ updatedAt: number
11
+ name: string
12
+ icon: string
13
+ isDeleted: boolean
14
+ }
15
+
16
+ export interface ItemCommand {
17
+ id: string
18
+ title: string
19
+ icon: string
20
+ }
21
+
22
+ export class TreeProviderProject implements vscode.TreeDataProvider<any> {
23
+
24
+ private _onDidChangeTreeData: vscode.EventEmitter<Dependency | undefined | void> = new vscode.EventEmitter<Dependency | undefined | void>();
25
+ readonly onDidChangeTreeData: vscode.Event<Dependency | undefined | void> = this._onDidChangeTreeData.event;
26
+
27
+ constructor(private workspaceRoot: any) { }
28
+
29
+ refresh(): void {
30
+ this._onDidChangeTreeData.fire();
31
+ }
32
+
33
+ getTreeItem(element: Dependency): vscode.TreeItem {
34
+ return element;
35
+ }
36
+
37
+ async getChildren(element?: Dependency) {
38
+ let projects: Project[] = []
39
+
40
+ const data = await Request.get(API.Project.get)
41
+
42
+ if (data) {
43
+ projects = data.data.projects
44
+ }
45
+
46
+ const projectDependencies = projects.map(p => {
47
+ return new Dependency(
48
+ p.name,
49
+ vscode.TreeItemCollapsibleState.None,
50
+ {
51
+ command: 'bmdextension.getProjectDetails',
52
+ title: '',
53
+ arguments: [p.name]
54
+ },
55
+ undefined,
56
+ p.icon ? p.icon : 'none'
57
+ );
58
+ })
59
+
60
+ return Promise.resolve([
61
+ ...projectDependencies,
62
+ ]);
63
+ }
64
+ }
65
+
@@ -0,0 +1,106 @@
1
+ import * as vscode from 'vscode';
2
+ import { Uri, commands } from "vscode";
3
+ import { FSProvider } from '../../../FsProvider';
4
+ import { Confirmation, OTHER } from '../../../constant';
5
+ import { getFullTextType } from '../../../util';
6
+ import { Request } from '../../../Request';
7
+ import { API } from '../../../API';
8
+ import { Project } from '../../../types/project';
9
+ import { fetchInterfaces } from '../../../provider/treeDataProvider/project/command/getProjectDetails'
10
+
11
+ export async function createApi(fsPath: string) {
12
+ if (fsPath != undefined && !fsPath.includes('services')) {
13
+ return vscode.window.showInformationMessage("Please select 'services' folder")
14
+ }
15
+
16
+ //fetch projects
17
+ vscode.window.showInformationMessage("Fetching projects");
18
+ const projects = await Request.get(API.Project.get).then<Project[]>(data => data.data.projects);
19
+
20
+ const projectSelected = await vscode.window.showQuickPick(
21
+ [...projects.map(e => e.name)],
22
+ { ignoreFocusOut: true }
23
+ );
24
+
25
+ //select project
26
+ let project = ''
27
+ if (projectSelected) {
28
+ project = projectSelected
29
+ }
30
+
31
+ if (!project) {
32
+ return vscode.window.showInformationMessage("Cancel!");
33
+ }
34
+ //*end - select project
35
+
36
+ //* select entity
37
+ vscode.window.showInformationMessage("Fetching interfaces");
38
+ const interfaces = await fetchInterfaces({ projectName: project });
39
+
40
+ const selectedInterface = await vscode.window.showQuickPick(
41
+ [...interfaces.map(e => e.name), OTHER],
42
+ { ignoreFocusOut: true }
43
+ );
44
+
45
+
46
+ let entity = ''
47
+ if (selectedInterface == OTHER) {
48
+ const input = await vscode.window.showInputBox({
49
+ placeHolder: "Enter name: ",
50
+ ignoreFocusOut: true
51
+ });
52
+
53
+ entity = input as string;
54
+
55
+ } else {
56
+ entity = selectedInterface as string;
57
+ }
58
+
59
+ if (!entity) {
60
+ return vscode.window.showInformationMessage("Cancel!");
61
+ }
62
+ //* end select entity
63
+
64
+
65
+ //select module
66
+ const module = await vscode.window.showInputBox({
67
+ placeHolder: "Enter name: ",
68
+ ignoreFocusOut: true
69
+ })
70
+
71
+ if (!module) {
72
+ return vscode.window.showInformationMessage("Cancel!");
73
+ }
74
+ //end - select module
75
+
76
+
77
+ const serviceTextTypes = getFullTextType(project);
78
+
79
+ const distPath = `src/api/${serviceTextTypes.classifyCase}.api.ts`
80
+ if (FSProvider.checkExist(distPath)) {
81
+ const confirm = await vscode.window.showQuickPick(
82
+ [Confirmation.Yes, Confirmation.No],
83
+ {
84
+ placeHolder: "This file already exist in this folder. Do you want to replace it?",
85
+ ignoreFocusOut: true
86
+ }
87
+ )
88
+ if (!confirm || confirm == Confirmation.No) {
89
+ return vscode.window.showInformationMessage("Cancel create api!.");
90
+ }
91
+ }
92
+
93
+ FSProvider.copyAndReplaceFile(
94
+ 'api/api.txt',
95
+ distPath,
96
+ [
97
+ { regex: /{{entity}}/g, value: serviceTextTypes.camelCase },
98
+ { regex: /{{module}}/g, value: module },
99
+ ])
100
+
101
+
102
+ let uri = Uri.file(FSProvider.getFullPath(distPath))
103
+ await commands.executeCommand('vscode.openFolder', uri)
104
+
105
+ return vscode.window.showInformationMessage("Create API successfully!");
106
+ }
@@ -0,0 +1,99 @@
1
+ import { FSProvider } from "../../../../FsProvider"
2
+ import * as vscode from 'vscode';
3
+ import { getFullTextType, getLastFolderFromPath } from "../../../../util";
4
+ import { Confirmation, OTHER } from "../../../../constant";
5
+ import { Uri, commands } from "vscode";
6
+
7
+ async function createController(fsPath: string, assetPath: string) {
8
+ vscode.window.showInformationMessage(`[createController] fsPath: ${fsPath}`);
9
+
10
+ if (!FSProvider.isValidStructure()) {
11
+ return vscode.window.showInformationMessage("Cancel!. Wrong project's structure.");
12
+ }
13
+
14
+ if (fsPath != undefined && !fsPath.includes('controllers')) {
15
+ return vscode.window.showInformationMessage("Please select 'controllers' folder")
16
+ }
17
+
18
+ let lastFolder = ''
19
+
20
+ if (fsPath.endsWith('controllers')) {
21
+ const folders = FSProvider.getAllFileInFolder('src/controllers/')
22
+ const subfolder = await vscode.window.showQuickPick(
23
+ [...folders],
24
+ { placeHolder: "Please select subfolder!", ignoreFocusOut: true }
25
+ )
26
+ if (!subfolder) return vscode.window.showErrorMessage("Please select subfolder in 'controllers'")
27
+ lastFolder = subfolder
28
+ } else {
29
+ lastFolder = getLastFolderFromPath(fsPath)
30
+ }
31
+
32
+ vscode.window.showInformationMessage(`[createController] lastFolder: ${lastFolder}`);
33
+
34
+ const entities = FSProvider.getAllFileInFolder('/src/entity');
35
+
36
+ const entitySelected = await vscode.window.showQuickPick([...entities, OTHER], { ignoreFocusOut: true })
37
+ let controller = ''
38
+ if (entitySelected && entitySelected != OTHER) {
39
+ controller = entitySelected
40
+ } else {
41
+ let input = await vscode.window.showInputBox({
42
+ placeHolder: "Enter controller name: ",
43
+ ignoreFocusOut: true
44
+ })
45
+ if (!input)
46
+ return vscode.window.showInformationMessage("Cancel!. Do not input service name.");
47
+
48
+ controller = input.replace('service', '').replace('Service', '')
49
+ }
50
+
51
+ controller = controller.replace('controller', '').replace('Controller', '')
52
+ const controllerTextTypes = getFullTextType(controller)
53
+ const lastFolderTextTypes = getFullTextType(lastFolder)
54
+
55
+ const distPath = `src/controllers/${lastFolder}/${controllerTextTypes.classifyCase}Controller.ts`
56
+ if (FSProvider.checkExist(distPath)) {
57
+ const confirm = await vscode.window.showQuickPick(
58
+ [Confirmation.Yes, Confirmation.No],
59
+ {
60
+ placeHolder: "This file already exist in this folder. Do you want to replace it.",
61
+ ignoreFocusOut: true
62
+ }
63
+ )
64
+
65
+ if (!confirm || confirm == Confirmation.No) {
66
+ return vscode.window.showInformationMessage("Cancel: add CONTROLLER.");
67
+ }
68
+ }
69
+
70
+ const controllerPath = `/${lastFolderTextTypes.snakeCase}/${controllerTextTypes.camelCase}`
71
+
72
+
73
+ vscode.window.showInformationMessage(`[createController] distPath: ${distPath}`)
74
+
75
+ FSProvider.copyAndReplaceFile(
76
+ assetPath,
77
+ distPath,
78
+ [
79
+ { regex: /{{snake}}/g, value: controllerTextTypes.snakeCase },
80
+ { regex: /{{classify}}/g, value: controllerTextTypes.classifyCase },
81
+ { regex: /{{controller}}/g, value: controllerPath },
82
+ { regex: /{{docs}}/g, value: lastFolderTextTypes.snakeCase },
83
+ { regex: /{{camel}}/g, value: controllerTextTypes.camelCase },
84
+ { regex: /ys/g, value: 'ies' },
85
+ ])
86
+
87
+ let uri = Uri.file(FSProvider.getFullPath(distPath))
88
+ await commands.executeCommand('vscode.openFolder', uri)
89
+ }
90
+
91
+ export async function createControllerNormal(fsPath: string) {
92
+ await createController(fsPath, 'controller/controller.txt')
93
+ return vscode.window.showInformationMessage("Create CONTROLLER successfully!");
94
+ }
95
+
96
+ export async function createControllerResource(fsPath: string) {
97
+ await createController(fsPath, 'controller/controllerResource.txt')
98
+ return vscode.window.showInformationMessage("Create CONTROLLER RESOURCE successfully!");
99
+ }
@@ -0,0 +1,363 @@
1
+ import * as vscode from 'vscode';
2
+ import { getFullTextType } from '../../../../util';
3
+ import { ControllerAction } from '../../../../constant';
4
+
5
+
6
+ export function insertControllerFunc(typeFunc: ControllerAction, document: any): void {
7
+ if (!document || !document.uri) {
8
+ document = vscode.window.activeTextEditor?.document
9
+ }
10
+
11
+ if (!document) {
12
+ vscode.window.showInformationMessage("Cancel: Can not find open document to insert")
13
+ return
14
+ }
15
+
16
+ const edit = new vscode.WorkspaceEdit();
17
+ let entity = 'Entity'
18
+
19
+ for (let index = 0; index < document.lineCount; index++) {
20
+ const line = document.lineAt(index)
21
+
22
+ if (line.text.includes('Controller')) {
23
+ let words = line.text.split(' ')
24
+ words = words.filter((word: string) => word.includes('Controller'))
25
+ words = words.map((word: string) => word = word.replace('Controller', ''))
26
+ entity = words[0] || 'Entity'
27
+ }
28
+
29
+ if (line.text.includes('END FILE')) {
30
+
31
+ switch (typeFunc) {
32
+ case ControllerAction.GetListPagination:
33
+ edit.insert(document.uri, new vscode.Position(index - 1, 0), generatePagination(entity));
34
+ break
35
+
36
+ case ControllerAction.GetListAll:
37
+ edit.insert(document.uri, new vscode.Position(index - 1, 0), generateFindAll(entity));
38
+ break;
39
+
40
+ case ControllerAction.CreateItem:
41
+ edit.insert(document.uri, new vscode.Position(index - 1, 0), generateCreateItem(entity));
42
+ break;
43
+
44
+ case ControllerAction.UpdateItem:
45
+ edit.insert(document.uri, new vscode.Position(index - 1, 0), generateUpdateItem(entity));
46
+ break;
47
+
48
+ case ControllerAction.CreateItemEntityRequest:
49
+ edit.insert(document.uri, new vscode.Position(index - 1, 0), generateCreateItemRequest(entity));
50
+ break;
51
+
52
+ case ControllerAction.DeleteItemByRemove:
53
+ edit.insert(document.uri, new vscode.Position(index - 1, 0), generateDeleteByRemove(entity));
54
+ break;
55
+
56
+ case ControllerAction.DeleteItemByBlock:
57
+ edit.insert(document.uri, new vscode.Position(index - 1, 0), generateDeleteByHide(entity));
58
+ break;
59
+
60
+ case ControllerAction.Upload:
61
+ edit.insert(document.uri, new vscode.Position(index - 1, 0), generateUpload(entity));
62
+ break;
63
+
64
+ case ControllerAction.UploadResize:
65
+ edit.insert(document.uri, new vscode.Position(index - 1, 0), generateUploadResize(entity));
66
+ break;
67
+
68
+ case ControllerAction.Get:
69
+ edit.insert(document.uri, new vscode.Position(index - 1, 0), generateGet());
70
+ break;
71
+
72
+ case ControllerAction.Post:
73
+ edit.insert(document.uri, new vscode.Position(index - 1, 0), generatePost());
74
+ break;
75
+
76
+ default:
77
+ break;
78
+ }
79
+ }
80
+ }
81
+
82
+ vscode.workspace.applyEdit(edit)
83
+ vscode.commands.executeCommand('vscode.executeFormatDocumentProvider')
84
+ }
85
+
86
+ const generateGet = () => {
87
+ let template = `
88
+
89
+ // =====================METHOD=====================
90
+ @Get('/')
91
+ @UseAuth(VerificationJWT)
92
+ @Validator({})
93
+ async method(
94
+ @QueryParams('value') value: string,
95
+ @Res() res: Response,
96
+ @Req() req: Request,
97
+ ) {
98
+
99
+ return res.sendOK(null)
100
+ }
101
+ `
102
+ return template
103
+ }
104
+
105
+ const generatePost = () => {
106
+ let template = `
107
+
108
+ // =====================METHOD=====================
109
+ @Post('/')
110
+ @UseAuth(VerificationJWT)
111
+ @Validator({})
112
+ async method(
113
+ @BodyParams('value') value: string,
114
+ @Res() res: Response,
115
+ @Req() req: Request,
116
+ ) {
117
+
118
+ return res.sendOK(null)
119
+ }
120
+ `
121
+ return template
122
+ }
123
+
124
+ const generatePagination = (name: string) => {
125
+ const nameTextTypes = getFullTextType(name)
126
+ let template = `
127
+
128
+ // =====================GET LIST=====================
129
+ @Get('')
130
+ @UseAuth(VerificationJWT)
131
+ @Validator({
132
+ page: Joi.number().min(0),
133
+ limit: Joi.number().min(0)
134
+ })
135
+ async findAll(
136
+ @HeaderParams('token') token: string,
137
+ @Req() req: Request,
138
+ @Res() res: Response,
139
+ @QueryParams('page') page: number = 1,
140
+ @QueryParams('limit') limit: number = 0,
141
+ @QueryParams('search') search: string = '',
142
+ ) {
143
+ let where = {{backtick}}{{camel}}.name LIKE :search AND {{camel}}.isDeleted = false {{backtick}}
144
+ const [{{camel}}s, total] = await {{cap}}.createQueryBuilder('{{camel}}')
145
+ .where(where, {search: {{backtick}}%{{dollar}}{search}%{{backtick}} })
146
+ .skip((page - 1) * limit)
147
+ .take(limit)
148
+ .orderBy('{{camel}}.id', 'DESC')
149
+ .getManyAndCount()
150
+
151
+ return res.sendOK({ {{camel}}s, total });
152
+ }
153
+ `
154
+ template = template.replace(/{{camel}}/g, nameTextTypes.camelCase);
155
+ template = template.replace(/{{cap}}/g, nameTextTypes.classifyCase);
156
+ template = template.replace(/{{dollar}}/g, '$');
157
+ template = template.replace(/{{backtick}}/g, '`');
158
+ template = template.replace(/ys/g, 'ies');
159
+ return template
160
+ }
161
+
162
+ const generateFindAll = (name: string) => {
163
+ const nameTextTypes = getFullTextType(name)
164
+ let template = `
165
+
166
+ // =====================GET LIST=====================
167
+ @Get('')
168
+ @UseAuth(VerificationJWT)
169
+ @Validator({})
170
+ async findAll(
171
+ @HeaderParams('token') token: string,
172
+ @Req() req: Request,
173
+ @Res() res: Response
174
+ ) {
175
+ const {{camel}}s = await {{cap}}.find()
176
+ return res.sendOK({{camel}}s)
177
+ }
178
+ `
179
+ template = template.replace(/{{camel}}/g, nameTextTypes.camelCase);
180
+ template = template.replace(/{{cap}}/g, nameTextTypes.classifyCase);
181
+ template = template.replace(/ys/g, 'ies');
182
+ template = template.replace(/sss/g, 'sses');
183
+ return template
184
+ }
185
+
186
+ const generateCreateItem = (name: string) => {
187
+ const nameTextTypes = getFullTextType(name)
188
+ let template = `
189
+
190
+ // =====================CREATE ITEM=====================
191
+ @Post('')
192
+ @UseAuth(VerificationJWT)
193
+ @Validator({
194
+ {{camel}}: Joi.required()
195
+ })
196
+ async create(
197
+ @HeaderParams('token') token: string,
198
+ @Req() req: Request,
199
+ @Res() res: Response,
200
+ @BodyParams('{{camel}}') {{camel}}: {{cap}}
201
+ ) {
202
+ await {{camel}}.save();
203
+ return res.sendOK({{camel}})
204
+ }
205
+ `
206
+ template = template.replace(/{{camel}}/g, nameTextTypes.camelCase);
207
+ template = template.replace(/{{cap}}/g, nameTextTypes.classifyCase);
208
+ template = template.replace(/ys/g, 'ies');
209
+ template = template.replace(/sss/g, 'sses');
210
+ return template
211
+ }
212
+
213
+ const generateCreateItemRequest = (name: string): any => {
214
+ const nameTextTypes = getFullTextType(name)
215
+
216
+ let template = `
217
+
218
+ // =====================CREATE ITEM=====================
219
+ @Post('')
220
+ @UseAuth(VerificationJWT)
221
+ @Validator({
222
+ {{camel}}: Joi.required()
223
+ })
224
+ async create(
225
+ @HeaderParams('token') token: string,
226
+ @Req() req: Request,
227
+ @Res() res: Response,
228
+ @BodyParams('{{camel}}') {{camel}}: {{cap}}Insert
229
+ ) {
230
+ const new{{cap}} = {{camel}}.to{{cap}}();
231
+ await new{{cap}}.save();
232
+ return new{{cap}};
233
+ }
234
+ `
235
+ template = template.replace(/{{camel}}/g, nameTextTypes.camelCase);
236
+ template = template.replace(/{{cap}}/g, nameTextTypes.classifyCase);
237
+ return template
238
+ }
239
+
240
+ const generateDeleteByRemove = (name: string) => {
241
+ const nameTextTypes = getFullTextType(name)
242
+ let template = `
243
+
244
+ // =====================DELETE=====================
245
+ @Post('/:{{camel}}Id/delete')
246
+ @UseAuth(VerificationJWT)
247
+ @Validator({
248
+ })
249
+ async delete(
250
+ @HeaderParams("token") token: string,
251
+ @Req() req: Request,
252
+ @Res() res: Response,
253
+ @PathParams("{{camel}}Id") {{camel}}Id: number,
254
+ ) {
255
+ let {{camel}} = await {{cap}}.findOneOrThrowId({{camel}}Id)
256
+ await {{camel}}.remove()
257
+ return res.sendOK({{camel}})
258
+ }
259
+ `
260
+ template = template.replace(/{{camel}}/g, nameTextTypes.camelCase);
261
+ template = template.replace(/{{cap}}/g, nameTextTypes.classifyCase);
262
+ return template
263
+ }
264
+
265
+ const generateDeleteByHide = (name: string) => {
266
+ const nameTextTypes = getFullTextType(name)
267
+ let template = `
268
+
269
+ // =====================DELETE=====================
270
+ @Post('/:{{camel}}Id/delete')
271
+ @UseAuth(VerificationJWT)
272
+ @Validator({
273
+ })
274
+ async delete(
275
+ @HeaderParams("token") token: string,
276
+ @Req() req: Request,
277
+ @Res() res: Response,
278
+ @PathParams("{{camel}}Id") {{camel}}Id: number,
279
+ ) {
280
+ let {{camel}} = await {{cap}}.findOneOrThrowId({{camel}}Id)
281
+ {{camel}}.isDeleted = true
282
+ await {{camel}}.save()
283
+ return res.sendOK({{camel}})
284
+ }
285
+ `
286
+ template = template.replace(/{{camel}}/g, nameTextTypes.camelCase);
287
+ template = template.replace(/{{cap}}/g, nameTextTypes.classifyCase);
288
+ return template
289
+ }
290
+
291
+ const generateUpload = (name: string) => {
292
+ let template = `
293
+
294
+ // =====================UPLOAD IMAGE=====================
295
+ @Post('/upload')
296
+ @UseAuth(VerificationJWT)
297
+ uploadFile(
298
+ @HeaderParams("token") token: string,
299
+ @Req() req: Request,
300
+ @Res() res: Response,
301
+ @MultipartFile('file') file: Express.Multer.File,
302
+ ) {
303
+ file.path = file.path.replace(CONFIG.UPLOAD_DIR, '');
304
+ return res.sendOK(file)
305
+ }
306
+ `
307
+ return template
308
+ }
309
+
310
+ const generateUploadResize = (name: string) => {
311
+ let template = `
312
+
313
+ // =====================UPLOAD IMAGE=====================
314
+ @Post('/upload')
315
+ @UseAuth(VerificationJWT)
316
+ async uploadFile(
317
+ @HeaderParams("token") token: string,
318
+ @Req() req: Request,
319
+ @Res() res: Response,
320
+ @MultipartFile('file') file: Express.Multer.File,
321
+ ) {
322
+ const image = await Jimp.read(file.path)
323
+ image.resize(700, Jimp.AUTO);
324
+ image.quality(80)
325
+ image.writeAsync(file.path)
326
+
327
+ file.path = file.path.replace(CONFIG.UPLOAD_DIR, '');
328
+
329
+ return res.sendOK(file)
330
+ }
331
+ `
332
+ return template
333
+ }
334
+
335
+ const generateUpdateItem = (name: string) => {
336
+ const nameTextTypes = getFullTextType(name)
337
+ let template = `
338
+
339
+ // =====================UPDATE ITEM=====================
340
+ @Post('/:{{camel}}Id/update')
341
+ @UseAuth(VerificationJWT)
342
+ @Validator({
343
+ {{camel}}: Joi.required(),
344
+ {{camel}}Id: Joi.number().required()
345
+ })
346
+ async update(
347
+ @HeaderParams("token") token: string,
348
+ @Req() req: Request,
349
+ @Res() res: Response,
350
+ @BodyParams("{{camel}}") {{camel}}: {{classify}},
351
+ @PathParams("{{camel}}Id") {{camel}}Id: number,
352
+ ) {
353
+ await {{classify}}.findOneOrThrowId({{camel}}Id)
354
+ {{camel}}.id = +{{camel}}Id
355
+ await {{camel}}.save()
356
+
357
+ return res.sendOK({{camel}})
358
+ }
359
+ `
360
+ template = template.replace(/{{camel}}/g, nameTextTypes.camelCase);
361
+ template = template.replace(/{{classify}}/g, nameTextTypes.classifyCase);
362
+ return template
363
+ }