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
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
+ }