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
package/snippets.json
ADDED
@@ -0,0 +1,761 @@
|
|
1
|
+
{
|
2
|
+
"Service: validateDupliCate": {
|
3
|
+
"prefix": "validateDuplicate",
|
4
|
+
"body": [
|
5
|
+
"async validate(${1}: ${1/(.*)/${1:/capitalize}/}, ${1}Id = null) {",
|
6
|
+
" const {",
|
7
|
+
" username",
|
8
|
+
" } = ${1};",
|
9
|
+
"",
|
10
|
+
" let where = '${1}.isDeleted = 0'",
|
11
|
+
"",
|
12
|
+
" if (${1}Id) {",
|
13
|
+
" where += ` AND ${1}.id != :${1}Id`",
|
14
|
+
" }",
|
15
|
+
"",
|
16
|
+
" const exist${1/(.*)/${1:/capitalize}/} = await ${1/(.*)/${1:/capitalize}/}.createQueryBuilder('${1}')",
|
17
|
+
" .where(where, { ${1}Id })",
|
18
|
+
" .getOne();",
|
19
|
+
"",
|
20
|
+
" if (exist${1/(.*)/${1:/capitalize}/}) {",
|
21
|
+
" let msg = '';",
|
22
|
+
"",
|
23
|
+
" if (exist${1/(.*)/${1:/capitalize}/}.username == username) {",
|
24
|
+
" msg = 'Username'",
|
25
|
+
" }",
|
26
|
+
"",
|
27
|
+
" if (msg) {",
|
28
|
+
" throw new BadRequest(`${msg} đã được đăng ký`);",
|
29
|
+
" }",
|
30
|
+
" }",
|
31
|
+
" }"
|
32
|
+
],
|
33
|
+
"description": "validateDupliCate"
|
34
|
+
},
|
35
|
+
"Entity: assign many": {
|
36
|
+
"prefix": "assignMany",
|
37
|
+
"body": [
|
38
|
+
" public async assign${1/(.*)/${1:/capitalize}/}s(${1}Ids: number[]) {",
|
39
|
+
" const ${1}s = await ${1/(.*)/${1:/capitalize}/}.findByIds(${1}Ids);",
|
40
|
+
" this.${1}s = ${1}s",
|
41
|
+
" }"
|
42
|
+
],
|
43
|
+
"description": "assign many"
|
44
|
+
},
|
45
|
+
"Controller: controller find one": {
|
46
|
+
"prefix": "controllerFindOne",
|
47
|
+
"body": [
|
48
|
+
"@Get('/:${1}Id')",
|
49
|
+
" @UseAuth(VerificationJWT)",
|
50
|
+
" @Validator({",
|
51
|
+
" ${1}Id: Joi.required()",
|
52
|
+
" })",
|
53
|
+
" async findOne(",
|
54
|
+
" @HeaderParams(\"token\") token: string,",
|
55
|
+
" @Req() req: Request,",
|
56
|
+
" @Res() res: Response,",
|
57
|
+
" @PathParams('${1}Id') ${1}Id: number",
|
58
|
+
" ) {",
|
59
|
+
" const ${1} = await this.${1}Service.getOne(${1}Id)",
|
60
|
+
" return res.sendOK(${1})",
|
61
|
+
" }"
|
62
|
+
],
|
63
|
+
"description": ""
|
64
|
+
},
|
65
|
+
"Entity: find one or throw by id": {
|
66
|
+
"prefix": "findOneOrderThrowId",
|
67
|
+
"body": [
|
68
|
+
"const ${1} = await ${1/(.*)/${1:/capitalize}/}.findOneOrThrowId(${1})"
|
69
|
+
],
|
70
|
+
"description": "find one or throw by id"
|
71
|
+
},
|
72
|
+
"Controller: controller empty": {
|
73
|
+
"prefix": "controller",
|
74
|
+
"body": [
|
75
|
+
"@${1}('${2}')",
|
76
|
+
"@UseAuth(VerificationJWT)",
|
77
|
+
"@Validator({",
|
78
|
+
" ${3} ",
|
79
|
+
"})",
|
80
|
+
"async ${4}(",
|
81
|
+
" @HeaderParams(\"token\") token: string,",
|
82
|
+
" @Req() req: Request,",
|
83
|
+
" @Res() res: Response,",
|
84
|
+
") {",
|
85
|
+
" return res.sendOK({})",
|
86
|
+
"}"
|
87
|
+
],
|
88
|
+
"description": ""
|
89
|
+
},
|
90
|
+
"Sql: createQueryBuild": {
|
91
|
+
"prefix": "createQueryBuild",
|
92
|
+
"body": [
|
93
|
+
"const ${1} = await ${1/(.*)/${1:/capitalize}/}.createQueryBuilder('${1}')"
|
94
|
+
],
|
95
|
+
"description": "createQueryBuild"
|
96
|
+
},
|
97
|
+
"Sql: ifId": {
|
98
|
+
"prefix": "if:Id",
|
99
|
+
"body": ["if (${1}Id) {", " where += ` AND ${1}.id = :${1}Id`", "}"],
|
100
|
+
"description": ""
|
101
|
+
},
|
102
|
+
"Controller: controller-delete": {
|
103
|
+
"prefix": "controller-delete",
|
104
|
+
"body": [
|
105
|
+
"@Delete('/:${1}Id')",
|
106
|
+
"@UseAuth(VerificationJWT)",
|
107
|
+
"@Validator({",
|
108
|
+
" ${1}Id: Joi.number().required()",
|
109
|
+
"})",
|
110
|
+
"async delete(",
|
111
|
+
" @HeaderParams(\"token\") token: string,",
|
112
|
+
" @Req() req: Request,",
|
113
|
+
" @Res() res: Response,",
|
114
|
+
" @PathParams(\"${1}Id\") ${1}Id: number,",
|
115
|
+
" ) {",
|
116
|
+
" const ${1} = await ${1/(.*)/${1:/capitalize}/}.findOneOrThrowId(${1}Id)",
|
117
|
+
" ${1}.isDeleted = true",
|
118
|
+
"",
|
119
|
+
" await ${1}.save()",
|
120
|
+
"",
|
121
|
+
" return res.sendOK(${1})",
|
122
|
+
"}"
|
123
|
+
],
|
124
|
+
"description": ""
|
125
|
+
},
|
126
|
+
"Controller: controller-update": {
|
127
|
+
"prefix": "controller-update",
|
128
|
+
"body": [
|
129
|
+
"@Patch('/:${1}Id')",
|
130
|
+
"@UseAuth(VerificationJWT)",
|
131
|
+
"@Validator({",
|
132
|
+
" ${1}: Joi.required(),",
|
133
|
+
" ${1}Id: Joi.number().required()",
|
134
|
+
"})",
|
135
|
+
"async update(",
|
136
|
+
" @HeaderParams(\"token\") token: string,",
|
137
|
+
" @Req() req: Request,",
|
138
|
+
" @Res() res: Response,",
|
139
|
+
" @BodyParams(\"${1}\") ${1}: ${1/(.*)/${1:/capitalize}/},",
|
140
|
+
" @PathParams(\"${1}Id\") ${1}Id: number,",
|
141
|
+
" ) {",
|
142
|
+
" await ${1/(.*)/${1:/capitalize}/}.findOneOrThrowId(${1}Id)",
|
143
|
+
" ${1}.id = +${1}Id;",
|
144
|
+
"",
|
145
|
+
" await ${1}.save()",
|
146
|
+
"",
|
147
|
+
" return res.sendOK(${1})",
|
148
|
+
"}"
|
149
|
+
],
|
150
|
+
"description": ""
|
151
|
+
},
|
152
|
+
"Controller: controller-create": {
|
153
|
+
"prefix": "controller-create",
|
154
|
+
"body": [
|
155
|
+
"@Post('${1}')",
|
156
|
+
" @UseAuth(VerificationJWT)",
|
157
|
+
" @Validator({",
|
158
|
+
" ${2}: Joi.required(),",
|
159
|
+
" })",
|
160
|
+
" async create(",
|
161
|
+
" @HeaderParams(\"token\") token: string,",
|
162
|
+
" @Req() req: Request,",
|
163
|
+
" @Res() res: Response,",
|
164
|
+
" @BodyParams(\"${2}\") ${2}: ${2},",
|
165
|
+
" ) {",
|
166
|
+
"",
|
167
|
+
" await ${2}.save();",
|
168
|
+
"",
|
169
|
+
" return res.sendOK(${2})",
|
170
|
+
" }"
|
171
|
+
],
|
172
|
+
"description": ""
|
173
|
+
},
|
174
|
+
"Controller: result get many and count": {
|
175
|
+
"prefix": "resultGetManyAndCount",
|
176
|
+
"body": [
|
177
|
+
"const { ${1}s, total } = await this.${1}Service.getManyAndCount({",
|
178
|
+
" limit,",
|
179
|
+
" search,",
|
180
|
+
" page",
|
181
|
+
" })",
|
182
|
+
" return res.sendOK({ ${1}s, total });"
|
183
|
+
],
|
184
|
+
"description": ""
|
185
|
+
},
|
186
|
+
"Controller: inject private service": {
|
187
|
+
"prefix": "privateService",
|
188
|
+
"body": ["private ${1}Service: ${1/(.*)/${1:/capitalize}/}Service"],
|
189
|
+
"description": ""
|
190
|
+
},
|
191
|
+
"Service: get many and count": {
|
192
|
+
"prefix": "getManyAndCountFunc",
|
193
|
+
"body": [
|
194
|
+
"async getManyAndCount({",
|
195
|
+
" page,",
|
196
|
+
" limit,",
|
197
|
+
" search = ''",
|
198
|
+
" }: ${1/(.*)/${1:/capitalize}/}Query) {",
|
199
|
+
" let where = `${1}.name LIKE :search AND ${1}.isDeleted = false`",
|
200
|
+
" const [${1}s, total] = await ${1/(.*)/${1:/capitalize}/}.createQueryBuilder('${1}')",
|
201
|
+
" .where(where, { search: `%\\${search}%` })",
|
202
|
+
" .skip((page - 1) * limit)",
|
203
|
+
" .take(limit)",
|
204
|
+
" .orderBy('${1}.id', 'DESC')",
|
205
|
+
" .getManyAndCount()",
|
206
|
+
"",
|
207
|
+
" return { ${1}s, total }",
|
208
|
+
" }"
|
209
|
+
],
|
210
|
+
"description": ""
|
211
|
+
},
|
212
|
+
"Interface: query interface": {
|
213
|
+
"prefix": "query-interface",
|
214
|
+
"body": [
|
215
|
+
"interface ${1/(.*)/${1:/capitalize}/}Query {",
|
216
|
+
" page: number;",
|
217
|
+
" limit: number",
|
218
|
+
" search?: string",
|
219
|
+
"}"
|
220
|
+
],
|
221
|
+
"description": ""
|
222
|
+
},
|
223
|
+
"Entity: relation one to one": {
|
224
|
+
"prefix": "one-to-one",
|
225
|
+
"body": [
|
226
|
+
"@OneToOne(() => ${1/(.*)/${1:/capitalize}/}, ${1} => ${1})",
|
227
|
+
"${1}: ${1/(.*)/${1:/capitalize}/};"
|
228
|
+
],
|
229
|
+
"description": ""
|
230
|
+
},
|
231
|
+
"Entity: relation many to many": {
|
232
|
+
"prefix": "many-to-many",
|
233
|
+
"body": [
|
234
|
+
"@ManyToMany(() => ${1/(.*)/${1:/capitalize}/}, ${1} => ${1})",
|
235
|
+
"${1}s: ${1/(.*)/${1:/capitalize}/}[];"
|
236
|
+
],
|
237
|
+
"description": ""
|
238
|
+
},
|
239
|
+
"Entity: relation many to one": {
|
240
|
+
"prefix": "many-to-one",
|
241
|
+
"body": [
|
242
|
+
"@ManyToOne(() => ${1/(.*)/${1:/capitalize}/}, ${1} => ${1})",
|
243
|
+
"${1}: ${1/(.*)/${1:/capitalize}/};"
|
244
|
+
],
|
245
|
+
"description": ""
|
246
|
+
},
|
247
|
+
"Entity: relation many to one 2": {
|
248
|
+
"prefix": "many-to-one-2",
|
249
|
+
"body": [
|
250
|
+
"@ManyToOne(() => ${1/(.*)/${1:/capitalize}/})",
|
251
|
+
"${1}: ${1/(.*)/${1:/capitalize}/};"
|
252
|
+
],
|
253
|
+
"description": ""
|
254
|
+
},
|
255
|
+
"Entity: relation one to many": {
|
256
|
+
"prefix": "one-to-many",
|
257
|
+
"body": [
|
258
|
+
"@OneToMany(() => ${1/(.*)/${1:/capitalize}/}, ${1} => ${1})",
|
259
|
+
"${1}s: ${1/(.*)/${1:/capitalize}/}[];"
|
260
|
+
],
|
261
|
+
"description": ""
|
262
|
+
},
|
263
|
+
"Entity add decorator column property": {
|
264
|
+
"prefix": "column-property",
|
265
|
+
"body": ["@Column({ default: ${1} })", "@Property()", "${2}: ${3};"],
|
266
|
+
"description": ""
|
267
|
+
},
|
268
|
+
"Controller: control upload": {
|
269
|
+
"prefix": "controller-upload",
|
270
|
+
"body": [
|
271
|
+
"@Post('/upload')",
|
272
|
+
" @UseAuth(VerificationJWT)",
|
273
|
+
" uploadFile(",
|
274
|
+
" @HeaderParams(\"token\") token: string,",
|
275
|
+
" @Req() req: Request,",
|
276
|
+
" @Res() res: Response,",
|
277
|
+
" @MultipartFile('file') file: Express.Multer.File,",
|
278
|
+
" ) {",
|
279
|
+
" file.path = file.path.replace(CONFIG.UPLOAD_DIR, '');",
|
280
|
+
" return res.sendOK(file)",
|
281
|
+
" }"
|
282
|
+
],
|
283
|
+
"description": ""
|
284
|
+
},
|
285
|
+
"Common: fetch function": {
|
286
|
+
"prefix": "fetchFunc",
|
287
|
+
"body": [
|
288
|
+
"async fetch$1(){",
|
289
|
+
" const { data } =await $2Api.findAll();",
|
290
|
+
"",
|
291
|
+
" }"
|
292
|
+
],
|
293
|
+
"description": ""
|
294
|
+
},
|
295
|
+
"Common: try finally": {
|
296
|
+
"prefix": "tryf",
|
297
|
+
"body": ["try{", "$0", "} finally{", "", "}"]
|
298
|
+
},
|
299
|
+
"jsonStringify": {
|
300
|
+
"prefix": "jsy",
|
301
|
+
"body": ["JSON.stringify(${1})"],
|
302
|
+
"description": ""
|
303
|
+
},
|
304
|
+
"Assign entity: ifAssignOrMany": {
|
305
|
+
"prefix": "ifAssignOrMany",
|
306
|
+
"body": [
|
307
|
+
"if (${1}Ids?.length) {",
|
308
|
+
" await ${2}.assign${1/(.*)/${1:/capitalize}/}s(${1}Ids)",
|
309
|
+
" } else if (${1}Ids?.length == 0) {",
|
310
|
+
" ${2}.${1}s= [];",
|
311
|
+
"}"
|
312
|
+
],
|
313
|
+
"description": "ifAssignOrMany"
|
314
|
+
},
|
315
|
+
"Assign entity: ifAssignOrDelete": {
|
316
|
+
"prefix": "ifAssignOrDelete",
|
317
|
+
"body": [
|
318
|
+
"if (${1}Id) {",
|
319
|
+
" await ${2}.assign${1/(.*)/${1:/capitalize}/}(${1}Id)",
|
320
|
+
" } else if (${1}Id == 0) {",
|
321
|
+
" ${2}.${1}= null;",
|
322
|
+
"}"
|
323
|
+
],
|
324
|
+
"description": "ifAssignOrDelete"
|
325
|
+
},
|
326
|
+
"Sql: ifWhereBool": {
|
327
|
+
"prefix": "ifWhereBool",
|
328
|
+
"body": [
|
329
|
+
"if (typeof ${1} == 'boolean') {",
|
330
|
+
" where += ' AND ${2}.${1} = :${1}'",
|
331
|
+
"}"
|
332
|
+
],
|
333
|
+
"description": "ifWhereBool"
|
334
|
+
},
|
335
|
+
"Sql: ifWhere": {
|
336
|
+
"prefix": "ifWhere",
|
337
|
+
"body": ["if (${1}) {", " where += ' AND ${2}.${1} = :${1}'", "}"],
|
338
|
+
"description": "ifWhere"
|
339
|
+
},
|
340
|
+
"Sql: If from to at": {
|
341
|
+
"prefix": "ifFromToAt",
|
342
|
+
"body": [
|
343
|
+
"if (fromAt && toAt) {",
|
344
|
+
" where += ` AND ${1}.createdAt BETWEEN \\${fromAt} AND \\${toAt}`",
|
345
|
+
"}"
|
346
|
+
],
|
347
|
+
"description": "if frome date"
|
348
|
+
},
|
349
|
+
"ifWhereIn": {
|
350
|
+
"prefix": "ifWhereIn",
|
351
|
+
"body": [
|
352
|
+
"if (${1}s?.length) {",
|
353
|
+
" where += ' AND ${2}.${1} IN (:...${1}s)'",
|
354
|
+
"}"
|
355
|
+
],
|
356
|
+
"description": "ifWhereIn"
|
357
|
+
},
|
358
|
+
"getOneInService": {
|
359
|
+
"prefix": "getOne",
|
360
|
+
"body": [
|
361
|
+
"async getOne(${1}Id: number) {",
|
362
|
+
" const ${1} = await ${1/(.*)/${1:/capitalize}/}.findOneOrThrowId(${1}Id, {",
|
363
|
+
" relations: []",
|
364
|
+
" })",
|
365
|
+
" return ${1}",
|
366
|
+
" }"
|
367
|
+
],
|
368
|
+
"description": "getOnInService"
|
369
|
+
},
|
370
|
+
"multiLang": {
|
371
|
+
"prefix": "multiLang",
|
372
|
+
"body": ["Multilingual.__('${1}', ${2})"],
|
373
|
+
"description": "multiLang"
|
374
|
+
},
|
375
|
+
"Dashboard: Summary by date": {
|
376
|
+
"prefix": "dashboardSummaryByDate",
|
377
|
+
"body": [
|
378
|
+
"async summary${1/(.*)/${1:/capitalize}/}ByDate({",
|
379
|
+
" fromAt,",
|
380
|
+
" toAt,",
|
381
|
+
" timezone = '+7:00'",
|
382
|
+
" }: DashboardQuery) {",
|
383
|
+
" let where = '${1}.isDeleted = 0'",
|
384
|
+
"",
|
385
|
+
" if (fromAt && toAt) {",
|
386
|
+
" where += ` AND ${1}.createdAt BETWEEN \\${fromAt} AND \\${toAt}`",
|
387
|
+
" }",
|
388
|
+
"",
|
389
|
+
" const ${1}s = await ${1/(.*)/${1:/capitalize}/}.createQueryBuilder('${1}')",
|
390
|
+
" .select('COUNT(*)', 'total')",
|
391
|
+
" .addSelect(`DATE_FORMAT(CONVERT_TZ(FROM_UNIXTIME(${1}.createdAt), @@session.time_zone, '\\${timezone}'),'%Y-%m-%d')`, 'date')",
|
392
|
+
" .groupBy('date')",
|
393
|
+
" .orderBy('date')",
|
394
|
+
" .getRawMany()",
|
395
|
+
"",
|
396
|
+
" return ${1}s;",
|
397
|
+
"",
|
398
|
+
"}"
|
399
|
+
],
|
400
|
+
"description": "Dashboard: Summary by date"
|
401
|
+
},
|
402
|
+
"Create api": {
|
403
|
+
"prefix": "createApi",
|
404
|
+
"body": [
|
405
|
+
"import { request } from \"@/utils/request\";",
|
406
|
+
"import { AxiosPromise } from \"axios\";",
|
407
|
+
"",
|
408
|
+
"",
|
409
|
+
"export const ${1}Api = {",
|
410
|
+
" findAll: (params?:any):AxiosPromise<any> => request({",
|
411
|
+
" url: '/v1/${2}/${1}',",
|
412
|
+
" params",
|
413
|
+
" }),",
|
414
|
+
" create: (data:any):AxiosPromise<any> => request({",
|
415
|
+
" url: '/v1/${2}/${1}',",
|
416
|
+
" data,",
|
417
|
+
" method: 'post'",
|
418
|
+
" }),",
|
419
|
+
" update: (id:number, data:any):AxiosPromise<any> => request({",
|
420
|
+
" url: `/v1/${2}/${1}/\\${id}`,",
|
421
|
+
" method: 'patch',",
|
422
|
+
" data",
|
423
|
+
" }),",
|
424
|
+
" delete: (id:number):AxiosPromise<any> => request({",
|
425
|
+
" url: `/v1/${2}/${1}/\\${id}`,",
|
426
|
+
" method: 'delete'",
|
427
|
+
" }),",
|
428
|
+
"}",
|
429
|
+
""
|
430
|
+
],
|
431
|
+
"description": ""
|
432
|
+
},
|
433
|
+
"createHook": {
|
434
|
+
"prefix": "createHook",
|
435
|
+
"body": [
|
436
|
+
"import { ${1}Api } from \"api/${1}.api\"",
|
437
|
+
"import { useState } from \"react\"",
|
438
|
+
"import { ${1/(.*)/${1:/capitalize}/} } from \"types/${1}\"",
|
439
|
+
"import { QueryParam } from \"types/query\"",
|
440
|
+
"",
|
441
|
+
"export interface ${1/(.*)/${1:/capitalize}/}Query extends QueryParam {",
|
442
|
+
"",
|
443
|
+
"}",
|
444
|
+
"",
|
445
|
+
"interface Use${1/(.*)/${1:/capitalize}/}Props {",
|
446
|
+
" initQuery: ${1/(.*)/${1:/capitalize}/}Query;",
|
447
|
+
"}",
|
448
|
+
"",
|
449
|
+
"export const use${1/(.*)/${1:/capitalize}/} = ({ initQuery }: Use${1/(.*)/${1:/capitalize}/}Props) => {",
|
450
|
+
" const [data, setData] = useState<${1/(.*)/${1:/capitalize}/}[]>([])",
|
451
|
+
" const [total, setTotal] = useState(0)",
|
452
|
+
" const [query, setQuery] = useState<${1/(.*)/${1:/capitalize}/}Query>(initQuery);",
|
453
|
+
" const [loading, setLoading] = useState(false);",
|
454
|
+
"",
|
455
|
+
" const fetchData = async () => {",
|
456
|
+
" setLoading(true);",
|
457
|
+
" try {",
|
458
|
+
" const { data } = await ${1}Api.findAll(query)",
|
459
|
+
"",
|
460
|
+
" setData(data.${1}s)",
|
461
|
+
" setTotal(data.total)",
|
462
|
+
" } finally {",
|
463
|
+
" setLoading(false);",
|
464
|
+
" }",
|
465
|
+
" }",
|
466
|
+
"",
|
467
|
+
" return { ${1}s: data, total${1/(.*)/${1:/capitalize}/}: total, fetch${1/(.*)/${1:/capitalize}/}: fetchData, loading${1/(.*)/${1:/capitalize}/}: loading, setQuery${1/(.*)/${1:/capitalize}/}: setQuery, query${1/(.*)/${1:/capitalize}/}: query }",
|
468
|
+
"}"
|
469
|
+
],
|
470
|
+
"description": "createHook"
|
471
|
+
},
|
472
|
+
"type of entity": {
|
473
|
+
"prefix": "et",
|
474
|
+
"body": ["export enum ${TM_FILENAME_BASE}Type {", "$2 = '$3'", "}"],
|
475
|
+
"description": "Export enum type"
|
476
|
+
},
|
477
|
+
"status of entity": {
|
478
|
+
"prefix": "es",
|
479
|
+
"body": [
|
480
|
+
"export enum ${TM_FILENAME_BASE}Status {",
|
481
|
+
"Pending = 'PENDING',",
|
482
|
+
"Complete = 'COMPLETE'",
|
483
|
+
"}"
|
484
|
+
],
|
485
|
+
"description": "Export enum status"
|
486
|
+
},
|
487
|
+
"body param id": {
|
488
|
+
"prefix": "bid",
|
489
|
+
"body": ["@BodyParams('$1Id') $1Id: number,"],
|
490
|
+
"description": "Body params Id field"
|
491
|
+
},
|
492
|
+
"body param number": {
|
493
|
+
"prefix": "bn",
|
494
|
+
"body": ["@BodyParams('$1') $1: number,"],
|
495
|
+
"description": "Body params Id field"
|
496
|
+
},
|
497
|
+
"body param string": {
|
498
|
+
"prefix": "bs",
|
499
|
+
"body": ["@BodyParams('$1') $1: string,"],
|
500
|
+
"description": "Body params Id field"
|
501
|
+
},
|
502
|
+
"body param boolean": {
|
503
|
+
"prefix": "bb",
|
504
|
+
"body": ["@BodyParams('$1') $1: boolean,"],
|
505
|
+
"description": "Body params Id field"
|
506
|
+
},
|
507
|
+
"body params": {
|
508
|
+
"prefix": "bids",
|
509
|
+
"body": ["@BodyParams('$1Ids', Number) $1Ids: number[],"],
|
510
|
+
"description": "Body params Ids field"
|
511
|
+
},
|
512
|
+
"query param": {
|
513
|
+
"prefix": "qid",
|
514
|
+
"body": ["@QueryParams('$1Id') $1Id: number,"],
|
515
|
+
"description": "Query params Id field"
|
516
|
+
},
|
517
|
+
"path param": {
|
518
|
+
"prefix": "pid",
|
519
|
+
"body": ["@PathParams('$1Id') $1Id: number,"],
|
520
|
+
"description": "Path params Id field"
|
521
|
+
},
|
522
|
+
"query param number": {
|
523
|
+
"prefix": "qn",
|
524
|
+
"body": ["@QueryParams('$1') $1: number,"],
|
525
|
+
"description": "Query params Id field"
|
526
|
+
},
|
527
|
+
"query param string": {
|
528
|
+
"prefix": "qs",
|
529
|
+
"body": ["@QueryParams('$1') $1: string,"],
|
530
|
+
"description": "Query params Id field"
|
531
|
+
},
|
532
|
+
"query param boolean": {
|
533
|
+
"prefix": "qb",
|
534
|
+
"body": ["@QueryParams('$1') $1: boolean,"],
|
535
|
+
"description": "Query params Id field"
|
536
|
+
},
|
537
|
+
"condition id_find_one": {
|
538
|
+
"prefix": "iff1",
|
539
|
+
"body": [
|
540
|
+
"if (${1}Id) {",
|
541
|
+
"\tconst ${1} = await ${1/(.*)/${1:/capitalize}/}.findOneOrThrowId(${1}Id,null, '')",
|
542
|
+
"\t${2}.${1} = ${1}",
|
543
|
+
"}"
|
544
|
+
],
|
545
|
+
"description": "If exist and find one"
|
546
|
+
},
|
547
|
+
"id_find_one": {
|
548
|
+
"prefix": "f1",
|
549
|
+
"body": [
|
550
|
+
"const ${1} = await ${1/(.*)/${1:/capitalize}/}.findOneOrThrowId(${1}Id,null, '')"
|
551
|
+
],
|
552
|
+
"description": "Find one"
|
553
|
+
},
|
554
|
+
"id_find_in": {
|
555
|
+
"prefix": "fin",
|
556
|
+
"body": [
|
557
|
+
"const ${1}s = await ${1/(.*)/${1:/capitalize}/}.createQueryBuilder('${1}')",
|
558
|
+
".where(`${1}.id IN (:...${1}Ids)`, { ${1}Ids })",
|
559
|
+
".getMany()"
|
560
|
+
],
|
561
|
+
"description": "Find in"
|
562
|
+
},
|
563
|
+
"where in": {
|
564
|
+
"prefix": "win",
|
565
|
+
"body": [".where(`$2id IN (:...$1)`, { $1 })"],
|
566
|
+
"description": "Where in"
|
567
|
+
},
|
568
|
+
"ass": {
|
569
|
+
"prefix": "assign",
|
570
|
+
"body": [
|
571
|
+
"public async assign${1/(.*)/${1:/capitalize}/}(${1}Id: number) {",
|
572
|
+
"\tconst ${1} = await ${1/(.*)/${1:/capitalize}/}.findOneOrThrowId(${1}Id, undefined, '')",
|
573
|
+
"\tthis.${1} = ${1}",
|
574
|
+
"}"
|
575
|
+
],
|
576
|
+
"description": "Assign to entity"
|
577
|
+
},
|
578
|
+
"ifassign": {
|
579
|
+
"prefix": "ifassign",
|
580
|
+
"body": [
|
581
|
+
"if (${1}Id) await ${2}.assign${1/(.*)/${1:/capitalize}/}(${1}Id)"
|
582
|
+
],
|
583
|
+
"description": "Assign to entity"
|
584
|
+
},
|
585
|
+
"geneCode": {
|
586
|
+
"prefix": "geneCode",
|
587
|
+
"body": [
|
588
|
+
"async generateCode() {",
|
589
|
+
"\tconst { start, end } = getThisMonthInterval()",
|
590
|
+
"\tconst count = await ${1/(.*)/${1:/capitalize}/}.createQueryBuilder('${1}')",
|
591
|
+
"\t\t.where(`${1}.createdAt BETWEEN \\${start} AND \\${end}`)",
|
592
|
+
"\t\t.getCount()",
|
593
|
+
"",
|
594
|
+
"\tthis.code = `\\${code}\\${getCurrentDateMMYY()}/\\${leftPad(count + 1, 4)}`",
|
595
|
+
"}"
|
596
|
+
],
|
597
|
+
"description": "Generate code"
|
598
|
+
},
|
599
|
+
"gmac": {
|
600
|
+
"prefix": "gmac",
|
601
|
+
"body": [
|
602
|
+
"async getManyAndCount({ search, page, limit }): Promise<{ ${1}s: ${1/(.*)/${1:/capitalize}/}[], total: number }> {",
|
603
|
+
"\tlet where = `CONCAT(${1}.code, ' ') LIKE '%\\${search}%' AND ${1}.isDeleted = false`",
|
604
|
+
"",
|
605
|
+
"\tconst [${1}s, total] = await ${1/(.*)/${1:/capitalize}/}.createQueryBuilder('${1}')",
|
606
|
+
"\t\t.where(where)",
|
607
|
+
"\t\t.skip((page - 1) * limit)",
|
608
|
+
"\t\t.take(limit)",
|
609
|
+
"\t\t.orderBy('${1}.id', 'DESC')",
|
610
|
+
"\t\t.getManyAndCount()",
|
611
|
+
"",
|
612
|
+
"\treturn {${1}s, total}",
|
613
|
+
"}"
|
614
|
+
],
|
615
|
+
"description": "Get many and count"
|
616
|
+
},
|
617
|
+
"fromTo": {
|
618
|
+
"prefix": "fromTo",
|
619
|
+
"body": ["const { start, end } = getIntervalFromToDate(from, to)"],
|
620
|
+
"description": "Convert from, to into start, end"
|
621
|
+
},
|
622
|
+
"updateStatus": {
|
623
|
+
"prefix": "upS",
|
624
|
+
"body": [
|
625
|
+
"public async updateStatus(status: ${TM_FILENAME_BASE}Status) {",
|
626
|
+
"this.status = status",
|
627
|
+
"await this.save()",
|
628
|
+
"}"
|
629
|
+
],
|
630
|
+
"description": "Function update status"
|
631
|
+
},
|
632
|
+
"importJimp": {
|
633
|
+
"prefix": "jimp",
|
634
|
+
"body": ["import Jimp from 'jimp'"],
|
635
|
+
"description": "Import package jimp"
|
636
|
+
},
|
637
|
+
"pageLimitSearch": {
|
638
|
+
"prefix": "pls",
|
639
|
+
"body": [
|
640
|
+
"@QueryParams('page') page: number = 1,",
|
641
|
+
"@QueryParams('limit') limit: number = 0,",
|
642
|
+
"@QueryParams('search') search: string = '',"
|
643
|
+
],
|
644
|
+
"description": "Add query page, limit, search"
|
645
|
+
},
|
646
|
+
"Tạo query dạng phân trang": {
|
647
|
+
"prefix": "queryPagination",
|
648
|
+
"body": [
|
649
|
+
"const query = ${1/(.*)/${1:/capitalize}/}.createQueryBuilder('${1}')",
|
650
|
+
" .where(where);",
|
651
|
+
"",
|
652
|
+
" const limit = 100;",
|
653
|
+
" const total = await query.getCount();",
|
654
|
+
" const totalPage = Math.ceil(total / limit);",
|
655
|
+
"",
|
656
|
+
" for (let i = 1; i <= totalPage; i++) {",
|
657
|
+
" const ${1}s = await query",
|
658
|
+
" .skip((i - 1) * limit)",
|
659
|
+
" .take(limit)",
|
660
|
+
" .getMany();",
|
661
|
+
"",
|
662
|
+
" }",
|
663
|
+
""
|
664
|
+
],
|
665
|
+
"description": "Tạo query dạng phân trang"
|
666
|
+
},
|
667
|
+
"SQL Where Condition with Month": {
|
668
|
+
"prefix": "ifdate",
|
669
|
+
"body": [
|
670
|
+
"if (${1:month}) {",
|
671
|
+
" const startMonth = dayjs(${1:month}, 'YYYY-MM').startOf('month').unix();",
|
672
|
+
" const endMonth = dayjs(${1:month}, 'YYYY-MM').endOf('month').unix();",
|
673
|
+
" where += ` AND ${3}.${2} BETWEEN \\${startMonth} AND \\${endMonth}`;",
|
674
|
+
"}"
|
675
|
+
],
|
676
|
+
"description": "Generates a SQL WHERE condition based on a month"
|
677
|
+
},
|
678
|
+
"SQL Where Condition from QueryObject": {
|
679
|
+
"prefix": "ifqueryobject",
|
680
|
+
"body": [
|
681
|
+
"if (queryObject) {",
|
682
|
+
" const object = JSON.parse(queryObject) as QueryObject[];",
|
683
|
+
"",
|
684
|
+
" if (!Array.isArray(object)) {",
|
685
|
+
" throw new BadRequest(\"Query object is not valid\");",
|
686
|
+
" }",
|
687
|
+
"",
|
688
|
+
" for (const item of object) {",
|
689
|
+
" if (item.type == 'sort') {",
|
690
|
+
" query.orderBy(`${item.field}`, item.value);",
|
691
|
+
" }",
|
692
|
+
"",
|
693
|
+
" else if (item.type == 'single-filter') {",
|
694
|
+
" const value = escape(item.value);",
|
695
|
+
" query.andWhere(`${item.field} = ${value}`);",
|
696
|
+
" }",
|
697
|
+
"",
|
698
|
+
" else if (item.type == 'multi-filter') {",
|
699
|
+
" const value = item.value.map(e => `${escape(e)}`).join(', ');",
|
700
|
+
" query.andWhere(`${item.field} IN (${value})`);",
|
701
|
+
" }",
|
702
|
+
" }",
|
703
|
+
"}"
|
704
|
+
],
|
705
|
+
"description": "Generates dynamic SQL WHERE from queryObject JSON"
|
706
|
+
},
|
707
|
+
"customImport": {
|
708
|
+
"prefix": "customImport",
|
709
|
+
"body": [
|
710
|
+
"// Custom",
|
711
|
+
"@Property()",
|
712
|
+
"rowNum: number;",
|
713
|
+
"",
|
714
|
+
"isError: boolean = false;",
|
715
|
+
"msg: string = '';"
|
716
|
+
],
|
717
|
+
"description": "Custom import statement for TypeScript"
|
718
|
+
},
|
719
|
+
"ImportApi": {
|
720
|
+
"prefix": "import-api",
|
721
|
+
"body": [
|
722
|
+
"const results: {",
|
723
|
+
" msg: string;",
|
724
|
+
" status: 'error' | 'ok';",
|
725
|
+
" rowNum: number;",
|
726
|
+
" ${1}: ${1/(.*)/${1:/capitalize}/} | null;",
|
727
|
+
"}[] = [];",
|
728
|
+
"",
|
729
|
+
"for (const ${1}Insert of ${1}Inserts) {",
|
730
|
+
" try {",
|
731
|
+
" const ${1} = await ${1}Insert.to${1/(.*)/${1:/capitalize}/}();",
|
732
|
+
"",
|
733
|
+
" await this.${1}Service.validate(${1}, ${1}.id);",
|
734
|
+
" if (!${1}.id) {",
|
735
|
+
" ${1}.createdBy = req.staff;",
|
736
|
+
" }",
|
737
|
+
" ${1}.updatedBy = req.staff;",
|
738
|
+
"",
|
739
|
+
" await ${1}.save();",
|
740
|
+
"",
|
741
|
+
" results.push({",
|
742
|
+
" msg: '',",
|
743
|
+
" rowNum: ${1}Insert.rowNum,",
|
744
|
+
" status: 'ok',",
|
745
|
+
" ${1},",
|
746
|
+
" });",
|
747
|
+
" } catch (error: any) {",
|
748
|
+
" results.push({",
|
749
|
+
" msg: error?.message ?? 'Unknown error',",
|
750
|
+
" rowNum: ${1}Insert.rowNum,",
|
751
|
+
" status: 'error',",
|
752
|
+
" ${1}: null,",
|
753
|
+
" });",
|
754
|
+
" }",
|
755
|
+
"}",
|
756
|
+
"",
|
757
|
+
"return res.sendOK(results);"
|
758
|
+
],
|
759
|
+
"description": "Import API for handling provider data in TypeScript"
|
760
|
+
}
|
761
|
+
}
|