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.
- package/.vscode/launch.json +14 -0
- package/.vscode/settings.json +1 -0
- package/CHANGELOG.md +9 -0
- package/DEPLOY.md +4 -0
- package/README.md +17 -0
- package/README_PRIVATE.md +1 -0
- package/build.sh +5 -0
- package/logo.png +0 -0
- package/media/dark/add.svg +40 -0
- package/media/dark/block.svg +1 -0
- package/media/dark/checklist-1.svg +1 -0
- package/media/dark/checklist.svg +1 -0
- package/media/dark/control.svg +1 -0
- package/media/dark/create.svg +1 -0
- package/media/dark/delete-1.svg +1 -0
- package/media/dark/delete.svg +1 -0
- package/media/dark/deploy-1.svg +2 -0
- package/media/dark/deploy.svg +2 -0
- package/media/dark/documents.svg +66 -0
- package/media/dark/earth.svg +68 -0
- package/media/dark/exe.svg +15 -0
- package/media/dark/export.svg +1 -0
- package/media/dark/function.svg +1 -0
- package/media/dark/game-controller.svg +77 -0
- package/media/dark/get.svg +1 -0
- package/media/dark/id-card.svg +59 -0
- package/media/dark/identity.svg +81 -0
- package/media/dark/import.svg +1 -0
- package/media/dark/information.svg +1 -0
- package/media/dark/interface.svg +1 -0
- package/media/dark/layout.svg +41 -0
- package/media/dark/leaf.svg +54 -0
- package/media/dark/list.svg +13 -0
- package/media/dark/logo.svg +249 -0
- package/media/dark/mockup.svg +1 -0
- package/media/dark/needle.svg +1 -0
- package/media/dark/pass.svg +46 -0
- package/media/dark/plus.svg +1 -0
- package/media/dark/post.svg +1 -0
- package/media/dark/quit.svg +1 -0
- package/media/dark/rocket.svg +28 -0
- package/media/dark/service.svg +1 -0
- package/media/dark/settings.svg +98 -0
- package/media/dark/social.svg +1 -0
- package/media/dark/spaceship-1.svg +1 -0
- package/media/dark/spaceship-2.svg +1 -0
- package/media/dark/spaceship.svg +1 -0
- package/media/dark/support.svg +88 -0
- package/media/dark/transfer.svg +1 -0
- package/media/dark/transform.svg +92 -0
- package/media/dark/update.svg +45 -0
- package/media/dark/upload-1.svg +1 -0
- package/media/dark/upload.svg +41 -0
- package/media/dark/vaccine.svg +1 -0
- package/media/dark/vr-gaming.svg +1 -0
- package/media/light/add.svg +40 -0
- package/media/light/block.svg +1 -0
- package/media/light/checklist-1.svg +1 -0
- package/media/light/checklist.svg +1 -0
- package/media/light/control.svg +1 -0
- package/media/light/create.svg +1 -0
- package/media/light/delete-1.svg +1 -0
- package/media/light/delete.svg +1 -0
- package/media/light/deploy-1.svg +2 -0
- package/media/light/deploy.svg +2 -0
- package/media/light/documents.svg +66 -0
- package/media/light/earth.svg +68 -0
- package/media/light/exe.svg +15 -0
- package/media/light/export.svg +1 -0
- package/media/light/function.svg +1 -0
- package/media/light/game-controller.svg +77 -0
- package/media/light/get.svg +1 -0
- package/media/light/id-card.svg +59 -0
- package/media/light/identity.svg +81 -0
- package/media/light/import.svg +1 -0
- package/media/light/information.svg +1 -0
- package/media/light/interface.svg +1 -0
- package/media/light/layout.svg +41 -0
- package/media/light/leaf.svg +54 -0
- package/media/light/list.svg +13 -0
- package/media/light/logo.svg +249 -0
- package/media/light/mockup.svg +1 -0
- package/media/light/needle.svg +1 -0
- package/media/light/pass.svg +46 -0
- package/media/light/plus.svg +1 -0
- package/media/light/post.svg +1 -0
- package/media/light/quit.svg +1 -0
- package/media/light/rocket.svg +28 -0
- package/media/light/service.svg +1 -0
- package/media/light/settings.svg +98 -0
- package/media/light/social.svg +1 -0
- package/media/light/spaceship-1.svg +1 -0
- package/media/light/spaceship-2.svg +1 -0
- package/media/light/spaceship.svg +1 -0
- package/media/light/support.svg +88 -0
- package/media/light/transfer.svg +1 -0
- package/media/light/transform.svg +92 -0
- package/media/light/update.svg +45 -0
- package/media/light/upload-1.svg +1 -0
- package/media/light/upload.svg +41 -0
- package/media/light/vaccine.svg +1 -0
- package/media/light/vr-gaming.svg +1 -0
- package/package-lock.json +6430 -0
- package/package.json +540 -0
- package/snippets-tsr.json +512 -0
- package/snippets.json +761 -0
- package/src/API.ts +14 -0
- package/src/FsProvider.ts +105 -0
- package/src/Request.ts +24 -0
- package/src/assets/api/api.txt +27 -0
- package/src/assets/configuration/AdminConfigurationController.ts.txt +72 -0
- package/src/assets/configuration/Configuration.ts.txt +37 -0
- package/src/assets/configuration/ConfigurationService.ts.txt +26 -0
- package/src/assets/contentDefine/AdminContentDefineController.ts.txt +91 -0
- package/src/assets/contentDefine/ContentDefine.ts.txt +45 -0
- package/src/assets/contentDefine/ContentDefineService.ts.txt +19 -0
- package/src/assets/contentDefine/CustomerContentDefineController.ts.txt +34 -0
- package/src/assets/controller/controller.txt +46 -0
- package/src/assets/controller/controllerResource.txt +103 -0
- package/src/assets/entity/entity.txt +22 -0
- package/src/assets/entity-request/entity-request.txt +18 -0
- package/src/assets/init/.env.example.txt +37 -0
- package/src/assets/init/.env.production.txt +37 -0
- package/src/assets/init/.gitignore.txt +8 -0
- package/src/assets/init/config.ts.txt +55 -0
- package/src/assets/init/deploy.sh.txt +46 -0
- package/src/assets/init/package-lock.json.txt +4184 -0
- package/src/assets/init/package.json.txt +79 -0
- package/src/assets/init/src/Server.ts.txt +167 -0
- package/src/assets/init/src/controllers/admin/AuthController.ts.txt +96 -0
- package/src/assets/init/src/controllers/admin/CustomerController.ts.txt +107 -0
- package/src/assets/init/src/controllers/admin/RoleController.ts.txt +143 -0
- package/src/assets/init/src/controllers/admin/StaffController.ts.txt +192 -0
- package/src/assets/init/src/controllers/customer/AuthController.ts.txt +170 -0
- package/src/assets/init/src/controllers/customer/CustomerController.ts.txt +32 -0
- package/src/assets/init/src/core/entity/CoreEntity.ts.txt +70 -0
- package/src/assets/init/src/core/services/CoreService.ts.txt +21 -0
- package/src/assets/init/src/entity/Customer.ts.txt +68 -0
- package/src/assets/init/src/entity/Permission.ts.txt +29 -0
- package/src/assets/init/src/entity/Role.ts.txt +36 -0
- package/src/assets/init/src/entity/Staff.ts.txt +54 -0
- package/src/assets/init/src/entity-request/CustomerInsert.ts.txt +42 -0
- package/src/assets/init/src/entity-request/CustomerUpdate.ts.txt +40 -0
- package/src/assets/init/src/entity-request/PermissionImport.ts.txt +12 -0
- package/src/assets/init/src/entity-request/StaffUpdate.ts.txt +33 -0
- package/src/assets/init/src/index.ts.txt +13 -0
- package/src/assets/init/src/middleware/auth/Verification.ts.txt +16 -0
- package/src/assets/init/src/middleware/auth/VerificationJWT.ts.txt +16 -0
- package/src/assets/init/src/middleware/auth/strategy/AuthStrategy.ts.txt +5 -0
- package/src/assets/init/src/middleware/auth/strategy/JWT.ts.txt +147 -0
- package/src/assets/init/src/middleware/error/handleError.ts.txt +22 -0
- package/src/assets/init/src/middleware/error/handleNotFound.ts.txt +7 -0
- package/src/assets/init/src/middleware/response/CustomSendResponse.ts.txt +35 -0
- package/src/assets/init/src/middleware/response/responseAPI.ts.txt +76 -0
- package/src/assets/init/src/middleware/validator/Validator.ts.txt +103 -0
- package/src/assets/init/src/services/CustomerService.ts.txt +79 -0
- package/src/assets/init/src/services/InitService.ts.txt +11 -0
- package/src/assets/init/src/services/MailService.ts.txt +271 -0
- package/src/assets/init/src/services/RoleService.ts.txt +66 -0
- package/src/assets/init/src/services/StaffService.ts.txt +104 -0
- package/src/assets/init/src/ssl/certificate-ca.crt +0 -0
- package/src/assets/init/src/ssl/certificate.crt +0 -0
- package/src/assets/init/src/ssl/private.key +0 -0
- package/src/assets/init/src/types/express.d.ts.txt +97 -0
- package/src/assets/init/src/util/expo.ts.txt +53 -0
- package/src/assets/init/src/util/helper.ts.txt +321 -0
- package/src/assets/init/src/util/language.ts.txt +8 -0
- package/src/assets/init/src/util/logger.ts.txt +47 -0
- package/src/assets/init/src/util/mailer.ts.txt +32 -0
- package/src/assets/init/src/util/password.ts.txt +13 -0
- package/src/assets/init/tsconfig.json.txt +26 -0
- package/src/assets/service/service.txt +34 -0
- package/src/constant.ts +83 -0
- package/src/extension.ts +459 -0
- package/src/provider/codeAction/controller/addPathParams.ts +65 -0
- package/src/provider/codeAction/controller/addTokenParam.ts +43 -0
- package/src/provider/codeAction/controller/addValidation.ts +47 -0
- package/src/provider/codeAction/controller/codeAction.ts +34 -0
- package/src/provider/codeAction/controller/util.ts +48 -0
- package/src/provider/codeAction/entity/codeAction.ts +48 -0
- package/src/provider/codeAction/entity/handleBuilder.ts +87 -0
- package/src/provider/codeAction/entity/handleFunction.ts +487 -0
- package/src/provider/codeAction/entity/handleProperty.ts +32 -0
- package/src/provider/codeAction/entity/handleRelation.ts +72 -0
- package/src/provider/codeAction/entity/helper.ts +132 -0
- package/src/provider/codeAction/entity-request/codeAction.ts +178 -0
- package/src/provider/codeAction/enum/codeAction.ts +95 -0
- package/src/provider/codeAction/service/codeAction.ts +232 -0
- package/src/provider/completion/CompletionProvider.ts +108 -0
- package/src/provider/errorChecking/checkHeaderToken.ts +60 -0
- package/src/provider/errorChecking/checkPathParam.ts +64 -0
- package/src/provider/errorChecking/checkRequired.ts +56 -0
- package/src/provider/errorChecking/errorChecking.ts +35 -0
- package/src/provider/errorChecking/util.ts +56 -0
- package/src/provider/treeDataProvider/Dependency.ts +26 -0
- package/src/provider/treeDataProvider/TreeProviderCommand.ts +60 -0
- package/src/provider/treeDataProvider/TreeProviderProject.ts +65 -0
- package/src/provider/treeDataProvider/api/createApi.ts +106 -0
- package/src/provider/treeDataProvider/controller/command/createController.ts +99 -0
- package/src/provider/treeDataProvider/controller/command/handleMethod.ts +363 -0
- package/src/provider/treeDataProvider/controller/treeData.ts +81 -0
- package/src/provider/treeDataProvider/deploy/command/handleDeploy.ts +70 -0
- package/src/provider/treeDataProvider/deploy/treeData.ts +21 -0
- package/src/provider/treeDataProvider/entity/command/addProperty.ts +144 -0
- package/src/provider/treeDataProvider/entity/command/addRelation.ts +125 -0
- package/src/provider/treeDataProvider/entity/command/createEntity.ts +53 -0
- package/src/provider/treeDataProvider/entity/command/createEntityRequest.ts +65 -0
- package/src/provider/treeDataProvider/entity/command/exportInterface.ts +130 -0
- package/src/provider/treeDataProvider/entity/treeData.ts +49 -0
- package/src/provider/treeDataProvider/module/command/configuration.ts +34 -0
- package/src/provider/treeDataProvider/module/command/contentDefine.ts +36 -0
- package/src/provider/treeDataProvider/module/command/initProject.ts +155 -0
- package/src/provider/treeDataProvider/module/treeData.ts +28 -0
- package/src/provider/treeDataProvider/project/command/addEnum.ts +0 -0
- package/src/provider/treeDataProvider/project/command/addProjectName.ts +23 -0
- package/src/provider/treeDataProvider/project/command/getProjectDetails.ts +284 -0
- package/src/provider/treeDataProvider/project/treeData.ts +28 -0
- package/src/provider/treeDataProvider/service/command/createService.ts +70 -0
- package/src/provider/treeDataProvider/service/command/handleConstructor.ts +134 -0
- package/src/provider/treeDataProvider/service/treeData.ts +25 -0
- package/src/types/project.d.ts +7 -0
- package/src/util.ts +145 -0
- package/src/utils/Password.ts +19 -0
- package/tsconfig.json +18 -0
- package/tslint.json +15 -0
- 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
|
+
}
|