@simitgroup/simpleapp-generator 1.0.32 → 1.0.35

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 (281) hide show
  1. package/.vscode/settings.json +3 -0
  2. package/README.md +185 -16
  3. package/buildinschemas copy/autoincreament.autoinc.jsonschema.json +39 -0
  4. package/buildinschemas copy/branch.branch.jsonschema.json +41 -0
  5. package/buildinschemas copy/docnoformat.docno.jsonschema.json +41 -0
  6. package/buildinschemas copy/organization.org.jsonschema.json +50 -0
  7. package/buildinschemas copy/permission.perm.jsonschema.json +23 -0
  8. package/buildinschemas copy/permission.perm.jsonschema.try.json +25 -0
  9. package/buildinschemas copy/tenant.tenant.jsonschema.json +21 -0
  10. package/buildinschemas copy/tenant.tenant.jsonschema.try.json +27 -0
  11. package/buildinschemas copy/user.user.jsonschema.json +31 -0
  12. package/dist/buildinschemas/autoincreament.d.ts +3 -0
  13. package/dist/buildinschemas/autoincreament.d.ts.map +1 -0
  14. package/dist/buildinschemas/autoincreament.js +36 -0
  15. package/dist/buildinschemas/autoincreament.js.map +1 -0
  16. package/dist/buildinschemas/branch.d.ts +3 -0
  17. package/dist/buildinschemas/branch.d.ts.map +1 -0
  18. package/dist/buildinschemas/branch.js +41 -0
  19. package/dist/buildinschemas/branch.js.map +1 -0
  20. package/dist/buildinschemas/docnoformat.d.ts +3 -0
  21. package/dist/buildinschemas/docnoformat.d.ts.map +1 -0
  22. package/dist/buildinschemas/docnoformat.js +60 -0
  23. package/dist/buildinschemas/docnoformat.js.map +1 -0
  24. package/dist/buildinschemas/index.d.ts +8 -0
  25. package/dist/buildinschemas/index.d.ts.map +1 -0
  26. package/dist/buildinschemas/index.js +18 -0
  27. package/dist/buildinschemas/index.js.map +1 -0
  28. package/dist/buildinschemas/organization.d.ts +3 -0
  29. package/dist/buildinschemas/organization.d.ts.map +1 -0
  30. package/dist/buildinschemas/organization.js +34 -0
  31. package/dist/buildinschemas/organization.js.map +1 -0
  32. package/dist/buildinschemas/permission.d.ts +3 -0
  33. package/dist/buildinschemas/permission.d.ts.map +1 -0
  34. package/dist/buildinschemas/permission.js +34 -0
  35. package/dist/buildinschemas/permission.js.map +1 -0
  36. package/dist/buildinschemas/tenant.d.ts +3 -0
  37. package/dist/buildinschemas/tenant.d.ts.map +1 -0
  38. package/dist/buildinschemas/tenant.js +41 -0
  39. package/dist/buildinschemas/tenant.js.map +1 -0
  40. package/dist/buildinschemas/user.d.ts +3 -0
  41. package/dist/buildinschemas/user.d.ts.map +1 -0
  42. package/dist/buildinschemas/user.js +31 -0
  43. package/dist/buildinschemas/user.js.map +1 -0
  44. package/dist/constant.d.ts +4 -0
  45. package/dist/constant.d.ts.map +1 -0
  46. package/dist/constant.js +2 -1
  47. package/dist/constant.js.map +1 -1
  48. package/dist/framework.d.ts +10 -0
  49. package/dist/framework.d.ts.map +1 -0
  50. package/dist/framework.js +120 -68
  51. package/dist/framework.js.map +1 -1
  52. package/dist/generate-allow-changebackend.js +305 -0
  53. package/dist/generate-allow-changebackend.js.map +1 -0
  54. package/dist/generate.d.ts +2 -0
  55. package/dist/generate.d.ts.map +1 -0
  56. package/dist/generate.js +310 -230
  57. package/dist/generate.js.map +1 -1
  58. package/dist/index.d.ts +3 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +84 -20
  61. package/dist/index.js.map +1 -1
  62. package/dist/libs.d.ts +2 -0
  63. package/dist/libs.d.ts.map +1 -0
  64. package/dist/processors/groupsbuilder.js +2 -0
  65. package/dist/processors/groupsbuilder.js.map +1 -0
  66. package/dist/processors/jsonschemabuilder.d.ts +4 -0
  67. package/dist/processors/jsonschemabuilder.d.ts.map +1 -0
  68. package/dist/processors/jsonschemabuilder.js +146 -172
  69. package/dist/processors/jsonschemabuilder.js.map +1 -1
  70. package/dist/schematype/baseschema.js +25 -0
  71. package/dist/schematype/baseschema.js.map +1 -0
  72. package/dist/schematype/default.js +2 -0
  73. package/dist/schematype/default.js.map +1 -0
  74. package/dist/schematype/index.js +12 -0
  75. package/dist/schematype/index.js.map +1 -0
  76. package/dist/schematype/primarymasterdata.js +38 -0
  77. package/dist/schematype/primarymasterdata.js.map +1 -0
  78. package/dist/schematype/simple.js +24 -0
  79. package/dist/schematype/simple.js.map +1 -0
  80. package/dist/schematype/simplemasterdata.js +31 -0
  81. package/dist/schematype/simplemasterdata.js.map +1 -0
  82. package/dist/schematype/transaction.js +74 -0
  83. package/dist/schematype/transaction.js.map +1 -0
  84. package/dist/storage.d.ts +3 -0
  85. package/dist/storage.d.ts.map +1 -0
  86. package/dist/storage.js +2 -2
  87. package/dist/storage.js.map +1 -1
  88. package/dist/type.d.ts +164 -0
  89. package/dist/type.d.ts.map +1 -0
  90. package/dist/type.js +16 -1
  91. package/dist/type.js.map +1 -1
  92. package/dist/validation.d.ts +1 -0
  93. package/dist/validation.d.ts.map +1 -0
  94. package/documentation/designconcept.bpmn +349 -0
  95. package/documentation/documentation.png +0 -0
  96. package/documentation/infra.drawio +141 -0
  97. package/documentation/infra.png +0 -0
  98. package/documentation/management.drawio +57 -0
  99. package/documentation/stack.drawio +106 -0
  100. package/package.json +3 -1
  101. package/src/buildinschemas/autoincreament.ts +34 -0
  102. package/src/buildinschemas/branch.ts +39 -0
  103. package/src/buildinschemas/docnoformat.ts +58 -0
  104. package/src/buildinschemas/index.ts +7 -0
  105. package/src/buildinschemas/organization.ts +31 -0
  106. package/src/buildinschemas/permission.ts +31 -0
  107. package/src/buildinschemas/tenant.ts +38 -0
  108. package/src/buildinschemas/user.ts +28 -0
  109. package/src/constant.ts +2 -1
  110. package/src/framework.ts +126 -67
  111. package/src/generate.ts +327 -266
  112. package/src/generate.ts.backup +339 -0
  113. package/src/index.ts +93 -18
  114. package/src/processors/jsonschemabuilder.ts +199 -226
  115. package/src/processors/jsonschemabuilder.ts-old +383 -0
  116. package/src/storage.ts +1 -1
  117. package/src/type.ts +94 -27
  118. package/templates/basic/nest/controller.ts.eta +255 -0
  119. package/templates/basic/nest/default.ts.eta +42 -0
  120. package/templates/basic/{model.eta → nest/model.ts.eta} +18 -5
  121. package/templates/basic/nest/processor.ts.eta +129 -0
  122. package/templates/basic/nest/service.ts.eta +64 -0
  123. package/templates/basic/{type.eta → nest/type.ts.eta} +3 -3
  124. package/templates/basic/nuxt/default.ts.eta +42 -0
  125. package/templates/basic/{pageindex.vue.eta → nuxt/pages.crud.vue.eta} +85 -22
  126. package/templates/basic/nuxt/simpleapp.doc.ts.eta +11 -0
  127. package/templates/basic/nuxt/simpleapp.generate.client.ts.eta +212 -0
  128. package/templates/nest/.env.eta +31 -0
  129. package/templates/nest/.gitignore.eta +40 -0
  130. package/templates/nest/src/app.controller.ts.eta +19 -0
  131. package/templates/nest/src/app.module.ts.eta +77 -0
  132. package/templates/nest/src/app.service.ts.eta +9 -0
  133. package/templates/nest/src/main.ts.eta +58 -0
  134. package/templates/nest/src/simpleapp/generate/apischemas/index.ts.eta +16 -0
  135. package/templates/nest/src/simpleapp/generate/commons/decorators/appuser.decorator.ts.eta +8 -0
  136. package/templates/nest/src/simpleapp/generate/commons/dicts/foreignkeys.ts.eta +1 -0
  137. package/templates/nest/src/simpleapp/generate/commons/docnogenerator.service.ts.eta +101 -0
  138. package/templates/nest/src/simpleapp/generate/commons/exceptions/SimpleAppExceptionFilter.ts.eta +39 -0
  139. package/templates/nest/src/simpleapp/generate/commons/interceptors/response.interceptor.ts.eta +38 -0
  140. package/templates/nest/src/simpleapp/generate/commons/middlewares/tenant.middleware.ts.eta +88 -0
  141. package/templates/nest/{Workflow.eta → src/simpleapp/generate/commons/providers/workflow.provider.ts.etax} +20 -14
  142. package/templates/nest/src/simpleapp/generate/commons/roles/roles.decorator.ts.eta +6 -0
  143. package/templates/nest/src/simpleapp/generate/commons/roles/roles.enum.ts.eta +28 -0
  144. package/templates/nest/src/simpleapp/generate/commons/roles/roles.group.ts.eta +10 -0
  145. package/templates/nest/src/simpleapp/generate/commons/roles/roles.guard.ts.eta +34 -0
  146. package/templates/nest/src/simpleapp/generate/commons/user.context.ts.eta +391 -0
  147. package/templates/nest/src/simpleapp/generate/controllers/simpleapp.controller.ts.eta +71 -0
  148. package/templates/nest/src/simpleapp/generate/models/perm.model.ts.eta +53 -0
  149. package/templates/nest/src/simpleapp/generate/models/tenant.model.ts.eta +45 -0
  150. package/templates/nest/src/simpleapp/generate/models/user.model.ts.eta +57 -0
  151. package/templates/nest/src/simpleapp/generate/processors/simpleapp.processor.ts.eta +624 -0
  152. package/templates/nest/src/simpleapp/generate/types/index.ts.eta +19 -0
  153. package/templates/nest/src/simpleapp/profile/profile.apischema.ts.eta +74 -0
  154. package/templates/nest/src/simpleapp/profile/profile.controller.ts.eta +110 -0
  155. package/templates/nest/src/simpleapp/profile/profile.service.ts.eta +195 -0
  156. package/templates/nest/src/simpleapp/profile/profile.types.ts.eta +18 -0
  157. package/templates/nest/src/simpleapp/services/autoinc.service.ts.eta +89 -0
  158. package/templates/nest/src/simpleapp/services/branch.service.ts.eta +66 -0
  159. package/templates/nest/src/simpleapp/services/docno.service.ts.eta +93 -0
  160. package/templates/nest/src/simpleapp/services/org.service.ts.eta +67 -0
  161. package/templates/nest/src/simpleapp/services/perm.service.ts.eta +102 -0
  162. package/templates/nest/src/simpleapp/services/tenant.service.ts.eta +69 -0
  163. package/templates/nest/src/simpleapp/services/user.service.ts.eta +66 -0
  164. package/templates/nest/src/simpleapp/simpleapp.module.ts.eta +43 -0
  165. package/templates/nuxt/.env.eta +21 -0
  166. package/templates/nuxt/.gitignore.eta +28 -0
  167. package/templates/nuxt/app.vue.eta +5 -2
  168. package/templates/nuxt/assets/css/tailwind.css.eta +35 -0
  169. package/templates/nuxt/components/CrudNestedDoc.vue.eta +164 -0
  170. package/templates/nuxt/components/CrudSimple.vue.eta +179 -0
  171. package/templates/nuxt/{components.debugdocdata.vue.eta → components/DebugDocumentData.vue.eta} +4 -1
  172. package/templates/nuxt/{components.eventmonitor.vue.eta → components/EventMonitor.vue.eta} +27 -27
  173. package/templates/nuxt/components/Invitation.vue.eta +50 -0
  174. package/templates/nuxt/components/Menus.vue.eta +58 -0
  175. package/templates/nuxt/components/PermissionInfo.vue.eta +92 -0
  176. package/templates/nuxt/components/SimpleAppAutocomplete.vue.eta +131 -0
  177. package/templates/nuxt/components/SimpleAppAutocompletemulti.vue.eta +73 -0
  178. package/templates/nuxt/components/SimpleAppCalendar.vue.eta +55 -0
  179. package/templates/nuxt/components/SimpleAppCheckbox.vue.eta +29 -0
  180. package/templates/nuxt/components/SimpleAppChip.vue.eta +28 -0
  181. package/templates/nuxt/components/SimpleAppColor.vue.eta +41 -0
  182. package/templates/nuxt/components/SimpleAppDatatable.vue.eta +20 -0
  183. package/templates/nuxt/components/SimpleAppDocumentNo.vue.eta +90 -0
  184. package/templates/nuxt/components/SimpleAppDynamicInput.vue.eta +29 -0
  185. package/templates/nuxt/components/SimpleAppEditor.vue.eta +31 -0
  186. package/templates/nuxt/components/SimpleAppForm.vue.eta +131 -0
  187. package/templates/nuxt/components/SimpleAppInputTable.vue.eta +104 -0
  188. package/templates/nuxt/components/SimpleAppList.vue.eta +38 -0
  189. package/templates/nuxt/components/SimpleAppListmulti.vue.eta +41 -0
  190. package/templates/nuxt/components/SimpleAppNumber.vue.eta +32 -0
  191. package/templates/nuxt/components/SimpleAppPassword.vue.eta +41 -0
  192. package/templates/nuxt/components/SimpleAppRadio.vue.eta +42 -0
  193. package/templates/nuxt/components/SimpleAppRating.vue.eta +41 -0
  194. package/templates/nuxt/components/SimpleAppSelect.vue.eta +38 -0
  195. package/templates/nuxt/components/SimpleAppSelectmulti.vue.eta +39 -0
  196. package/templates/nuxt/components/SimpleAppSlider.vue.eta +42 -0
  197. package/templates/nuxt/components/SimpleAppSwitch.vue.eta +30 -0
  198. package/templates/nuxt/components/SimpleAppText.vue.eta +50 -0
  199. package/templates/nuxt/components/SimpleAppTextarea.vue.eta +30 -0
  200. package/templates/nuxt/components/SimpleAppValue.vue.eta +86 -0
  201. package/templates/nuxt/components/SimpleFieldContainer.vue.eta +102 -0
  202. package/templates/nuxt/components/XorgPicker.vue.eta +66 -0
  203. package/templates/nuxt/components/helper.ts.eta +90 -0
  204. package/templates/nuxt/components/type.ts.eta +32 -0
  205. package/templates/nuxt/composables/docformat.generate.ts.eta +5 -0
  206. package/templates/nuxt/{composables.getautocomplete.ts.eta → composables/getAutocomplete.generate.ts.eta} +4 -5
  207. package/templates/nuxt/{composables.getmenus.ts.eta → composables/getMenus.generate.ts.eta} +22 -7
  208. package/templates/nuxt/composables/getOpenApi.generate.ts.eta +6 -0
  209. package/templates/nuxt/composables/getTenant.generate.ts.eta +4 -0
  210. package/templates/nuxt/composables/getUserStore.generate.ts.eta +22 -0
  211. package/templates/nuxt/composables/logout.generate.ts.eta +22 -0
  212. package/templates/nuxt/composables/roles.generate.ts.eta +48 -0
  213. package/templates/nuxt/composables/stringHelper.generate.ts.eta +5 -0
  214. package/templates/nuxt/{layouts.default.vue.eta → layouts/default.vue.eta} +2 -0
  215. package/templates/nuxt/middleware/10.acl.global.ts.eta +38 -0
  216. package/templates/nuxt/nuxt.config.ts.eta +12 -2
  217. package/templates/nuxt/pages/[xorg]/branch/index.vue.eta +102 -0
  218. package/templates/nuxt/pages/[xorg]/docnoformat/[id].vue.eta +17 -0
  219. package/templates/nuxt/pages/[xorg]/docnoformat/index.vue.eta +269 -0
  220. package/templates/nuxt/pages/[xorg]/index.vue.eta +36 -0
  221. package/templates/nuxt/pages/[xorg]/organization/index.vue.eta +148 -0
  222. package/templates/nuxt/pages/[xorg]/permission/index.vue.eta +280 -0
  223. package/templates/nuxt/pages/[xorg]/tenant/index.vue.eta +93 -0
  224. package/templates/nuxt/pages/[xorg]/user/index.vue.eta +468 -0
  225. package/templates/nuxt/pages/index.vue.eta +191 -0
  226. package/templates/nuxt/pages/login.vue.eta +21 -0
  227. package/templates/nuxt/plugins/10.simpleapp-event.ts.eta +53 -0
  228. package/templates/nuxt/plugins/20.simpleapp-userstore.ts.eta +155 -0
  229. package/templates/nuxt/plugins/50.simpleapp-client.ts.eta +23 -0
  230. package/templates/nuxt/{server.api.ts.eta → server/api/[xorg]/[...].ts.eta} +5 -2
  231. package/templates/nuxt/server/api/auth/[...].ts.eta +68 -0
  232. package/templates/nuxt/{server.api.auth.logout.ts.eta → server/api/auth/logout.ts.eta} +1 -3
  233. package/templates/nuxt/server/api/profile/[...].ts.eta +150 -0
  234. package/templates/nuxt/server/api/profile/index.ts.eta +103 -0
  235. package/templates/nuxt/simpleapp/generate/clients/SimpleAppClient.ts.eta +187 -0
  236. package/templates/nuxt/simpleapp/generate/commons/documents.ts.eta +6 -0
  237. package/templates/nuxt/simpleapp/generate/commons/events.ts.eta +5 -0
  238. package/templates/nuxt/simpleapp/generate/commons/groups.ts.eta +11 -0
  239. package/templates/nuxt/simpleapp/generate/commons/roles.ts.eta +21 -0
  240. package/templates/nuxt/types/index.ts.eta +65 -0
  241. package/templates/project/README.md +11 -0
  242. package/templates/project/build.sh.eta +17 -0
  243. package/templates/project/config.json.eta +2 -0
  244. package/templates/project/generate.ts.eta +10 -0
  245. package/templates/project/schemas/category.ts.eta +26 -0
  246. package/templates/project/schemas/index.ts.eta +5 -0
  247. package/templates/project/schemas/product.ts.eta +59 -0
  248. package/templates/project/shares/hello.ts.eta +1 -0
  249. package/templates/project/shares/index.ts.eta +2 -0
  250. package/tsconfig.json +9 -2
  251. package/tsconfig.tsbuildinfo +1 -0
  252. package/definations/category.cat.jsonschema.json +0 -55
  253. package/definations/level.lvl.jsonschema.json +0 -48
  254. package/definations/product.prd.jsonschema.json +0 -46
  255. package/templates/basic/controller.eta +0 -152
  256. package/templates/basic/module.eta +0 -22
  257. package/templates/basic/service.eta +0 -62
  258. package/templates/basic/simpleappclient.eta +0 -120
  259. package/templates/nest/SimpleAppController.eta +0 -69
  260. package/templates/nest/SimpleAppService.eta +0 -366
  261. package/templates/nest/TenantMiddleware.eta +0 -34
  262. package/templates/nest/UserProvider.eta +0 -127
  263. package/templates/nest/app.controller.eta +0 -12
  264. package/templates/nest/app.module.eta +0 -64
  265. package/templates/nest/app.service.eta +0 -8
  266. package/templates/nest/inputvalidation-exception.eta +0 -6
  267. package/templates/nest/nest.env.eta +0 -28
  268. package/templates/nest/nest.main.eta +0 -31
  269. package/templates/nuxt/components.crudsimple.vue.eta +0 -124
  270. package/templates/nuxt/components.menus.vue.eta +0 -35
  271. package/templates/nuxt/env.eta +0 -17
  272. package/templates/nuxt/pages.[xorg].index.vue.eta +0 -20
  273. package/templates/nuxt/pages.index.vue.eta +0 -72
  274. package/templates/nuxt/pages.login.vue.eta +0 -20
  275. package/templates/nuxt/plugins.simpleapp.ts.eta +0 -88
  276. package/templates/nuxt/server.api.auth[...].ts.eta +0 -233
  277. package/templates/nuxt/tailwind.css.eta +0 -49
  278. /package/templates/basic/{apischema.eta → nest/apischema.ts.eta} +0 -0
  279. /package/templates/basic/{jsonschema.eta → nest/jsonschema.ts.eta} +0 -0
  280. /package/templates/basic/{pageindexwithid.vue.eta → nuxt/pages.[id].vue.eta} +0 -0
  281. /package/templates/nest/{oauth2-redirect.eta → public_html/oauth2-redirect.html.eta} +0 -0
@@ -1,366 +0,0 @@
1
- import { Injectable, Logger } from '@nestjs/common';
2
- import { InjectModel } from '@nestjs/mongoose';
3
- import { Model } from 'mongoose';
4
- import Ajv from 'ajv';
5
- import addFormats from 'ajv-formats';
6
- import addErrors from 'ajv-errors';
7
- import foreignkeys from '../dicts/foreignkeys.json';
8
- import { Workflow } from './Workflow';
9
- import {
10
- NotFoundException,
11
- InternalServerErrorException,
12
- } from '@nestjs/common/exceptions';
13
- import { UserProvider } from './UserProvider';
14
-
15
- export enum IsolationType {
16
- 'none' = 'none',
17
- 'org' = 'org',
18
- 'tenant' = 'tenant',
19
- 'branch' = 'branch',
20
- }
21
- export enum HookType {
22
- 'init' = 'init',
23
- 'beforeSearch' = 'beforeSearch',
24
- 'afterSearch' = 'afterSearch',
25
- 'beforeValidation' = 'beforeValidation',
26
- 'afterValidation' = 'afterValidation',
27
- 'beforeCreate' = 'beforeCreate',
28
- 'afterCreate' = 'afterCreate',
29
- 'beforeUpdate' = 'beforeUpdate',
30
- 'afterUpdate' = 'afterUpdate',
31
- 'beforeDelete' = 'beforeDelete',
32
- 'afterDelete' = 'afterDelete',
33
- 'beforeFetchRecord' = 'beforeFetchRecord',
34
- 'afterFetchRecord' = 'afterFetchRecord',
35
- }
36
- export type MoreProjectionType = {
37
- [key: string]: string;
38
- };
39
- @Injectable()
40
- export class SimpleAppService<T extends { _id?: string }> {
41
- protected logger = new Logger();
42
- protected jsonschema = { type: 'object', properties: {}, required: [] };
43
- protected documentIdentityCode = 'code';
44
- protected documentIdentityName = 'label';
45
- protected documentName = '-unknowndocname-';
46
- protected documentType = '-unknowndoctype-';
47
- protected LIMITPERPAGE = 20;
48
- protected moreAutoCompleteField: MoreProjectionType = {};
49
- protected isolationtype: IsolationType = IsolationType.org;
50
- protected isolationFilter: any = {};
51
- protected data: T = { _id: '' } as T;
52
- private doc: Model<T>; //set private to prevent developer break data isolation control
53
- protected errorlist = [];
54
- constructor(
55
- doctype: string,
56
- docname: string,
57
- newdoc: Model<T>,
58
- isolationtype: IsolationType = IsolationType.org,
59
- ) {
60
- this.documentType = doctype;
61
- this.documentName = docname;
62
- this.doc = newdoc;
63
- this.isolationtype = isolationtype;
64
- this.hook(HookType.init, this.documentName);
65
- // this.tenantdoc = tenantdoc
66
- }
67
- getRecordId = (): string => this.data._id;
68
- setSchema = (newschema) => (this.jsonschema = newschema);
69
- getSchema = () => this.doc.schema.obj;
70
- getData = () => {
71
- //console.log('thisdata', this.data);
72
- return this.data;
73
- };
74
- setData = (newdata: T) => {
75
- delete newdata._id;
76
- this.data = { ...newdata };
77
- return this;
78
- };
79
- getIsolationFilter = () => {
80
- let isolationFilter = {};
81
- switch (this.isolationtype) {
82
- case 'none':
83
- isolationFilter = {};
84
- break;
85
- case 'branch':
86
- isolationFilter = UserProvider.getInstance().getBranchFilter();
87
- break;
88
- case 'tenant':
89
- isolationFilter = UserProvider.getInstance().getTenantFilter();
90
- break;
91
- case 'org':
92
- default:
93
- isolationFilter = UserProvider.getInstance().getOrgFilter();
94
- break;
95
- }
96
- return isolationFilter;
97
- };
98
- async list() {
99
- try {
100
- //console.log("this.isolationFilter",this.getIsolationFilter())
101
- const products = await this.doc.find(this.getIsolationFilter());
102
- // console.log(products)
103
- const productlist = products.map((p: T) => {
104
- return p;
105
- });
106
- // console.log(products);
107
- return productlist;
108
- } catch (err) {
109
- throw new InternalServerErrorException(err.message);
110
- }
111
- }
112
- addAutoCompleteField = (morefield: MoreProjectionType) => {
113
- const props = Object.getOwnPropertyNames(morefield);
114
- console.log('addAutoCompleteField', props);
115
- for (let i = 0; i < props.length; i++) {
116
- const key = props[i];
117
- this.moreAutoCompleteField[key] = '$' + morefield[key];
118
- }
119
- console.log(this.moreAutoCompleteField);
120
- };
121
- async getAutoComplete(keyword: string) {
122
- try {
123
- const filter1 = {};
124
- const filter2 = {};
125
- filter1[this.documentIdentityCode] = { $regex: keyword, $options: 'i' };
126
- filter2[this.documentIdentityName] = { $regex: keyword, $options: 'i' };
127
- const filterobj = { $or: [filter1, filter2] };
128
-
129
- Object.assign(filterobj, this.getIsolationFilter());
130
- let projections = {
131
- id: `\$_id`,
132
- label: `\$${this.documentIdentityCode}`,
133
- name: `\$${this.documentIdentityName}`,
134
- };
135
- if (this.moreAutoCompleteField) {
136
- Object.assign(projections, this.moreAutoCompleteField);
137
- }
138
- const products = await this.doc.find(filterobj, projections, {
139
- limit: this.LIMITPERPAGE,
140
- });
141
- const productlist = products.map((p: T) => {
142
- return p;
143
- });
144
- return productlist;
145
- } catch (err) {
146
- throw new InternalServerErrorException(err.message);
147
- }
148
- }
149
- async search(filters: Object) {
150
- try {
151
- Object.assign(filters, this.getIsolationFilter());
152
- await this.hook(HookType.beforeSearch, filters);
153
- const products = await this.doc.find(filters);
154
- const productlist = products.map((p: T) => {
155
- return p;
156
- });
157
- await this.hook(HookType.afterSearch, productlist);
158
- // console.log(products);
159
- return productlist;
160
- } catch (err) {
161
- throw new InternalServerErrorException(err.message);
162
- }
163
- // return this;
164
- }
165
- async findById(id: string) {
166
- await this.hook(HookType.beforeFetchRecord, id);
167
- const data = await this.search({ _id: id });
168
- await this.hook(HookType.afterFetchRecord, data);
169
- if (data.length == 1) {
170
- // console.log('data0', data[0]);
171
- return data[0];
172
- } else {
173
- return null;
174
- }
175
- }
176
-
177
- async create() {
178
- let result;
179
-
180
- try {
181
- await this.hook(HookType.beforeCreate, this.data);
182
- Object.assign(this.data, UserProvider.getInstance().getCreateFilter());
183
- delete this.data._id;
184
- await this.validateData(this.data);
185
- const newdoc = new this.doc(this.data);
186
- result = await newdoc.save();
187
- await this.hook(HookType.afterCreate, result);
188
- } catch (err) {
189
- throw new InternalServerErrorException(err.message);
190
- }
191
- return result as T;
192
- }
193
- async update() {
194
- const id: string = this.getRecordId();
195
- Object.assign(this.data, UserProvider.getInstance().getUpdateFilter());
196
- await this.findIdThenUpdate(id, this.data);
197
- }
198
- async delete() {
199
- const id: string = this.getRecordId();
200
- const dependency = await this.getRelatedRecords(id);
201
- if (!dependency) {
202
- return await this.findIdThenDelete(id);
203
- } else {
204
- return dependency;
205
- }
206
- }
207
- hook = async (type: string, data?: any) => {
208
- // console.log('Default hook', data);
209
- return true;
210
- };
211
- async validateData(data: T) {
212
- const ajv = new Ajv({ allErrors: true });
213
- addFormats(ajv);
214
- addErrors(ajv);
215
-
216
- ajv.addFormat('x-document-no', /.*$/);
217
- ajv.addFormat('x-document-label', /.*$/);
218
- ajv.addFormat('tel', /^$|^\d{7,15}$/gm);
219
- ajv.addFormat('x-text', /.*$/);
220
- ajv.addFormat('x-html', /.*$/);
221
-
222
- ajv.addKeyword({ keyword: 'x-document-status', type: 'array' });
223
- ajv.addKeyword({ keyword: 'x-document-api', type: 'array' });
224
- ajv.addKeyword({ keyword: 'x-ignore-autocomplete', type: 'boolean' });
225
- ajv.addKeyword({ keyword: 'x-isolation-type', type: 'string' });
226
- ajv.addKeyword({ keyword: 'x-document-type', type: 'string' });
227
- ajv.addKeyword({ keyword: 'x-document-name', type: 'string' });
228
- ajv.addKeyword({ keyword: 'x-collection-name', type: 'string' });
229
- ajv.addKeyword({ keyword: 'x-autocomplete-field', type: 'boolean' });
230
- ajv.addKeyword({ keyword: 'x-foreignkey', type: 'string' });
231
-
232
- const issuccess = await this.hook(HookType.beforeValidation, data);
233
- if (!issuccess) {
234
- const erromsg: string[] = [];
235
- for (let i = 0; i < this.errorlist.length; i++) {
236
- erromsg.push(this.errorlist[i].message);
237
- }
238
- this.logger.log('run hook during validation');
239
- throw new InternalServerErrorException(erromsg.join('\n'));
240
- }
241
-
242
- let validate;
243
- try {
244
- validate = ajv.compile(this.jsonschema);
245
- } catch (err) {
246
- this.logger.error('compile error', err);
247
- }
248
-
249
- const valid = validate(data);
250
- if (!valid) {
251
- this.logger.error(validate.errors);
252
- const erromsg: string[] = [];
253
- for (let i = 0; i < ajv.errors.length; i++) {
254
- erromsg.push(ajv.errors[i].message);
255
- }
256
- this.logger.error('ajv erromsg: ', erromsg);
257
- throw new InternalServerErrorException(erromsg.join('\n'));
258
- }
259
- await this.hook(HookType.afterValidation, data);
260
- }
261
-
262
- async findIdThenDelete(id: string): Promise<any> {
263
- // const data = await this.findById(id);
264
- try {
265
- await this.hook(HookType.beforeDelete, id);
266
- //console.log('deletedeletedeletedelete');
267
- const dependency = await this.getRelatedRecords(id);
268
- if (!dependency) {
269
- let filter = this.getIsolationFilter();
270
- filter['_id'] = id;
271
- const deleteresult = await this.doc.deleteOne(filter);
272
- // this.doc.findByIdAndDelete(id)
273
- await this.hook(HookType.afterDelete, deleteresult);
274
- //this.doc.findByIdAndDelete(id);
275
- return deleteresult;
276
- } else {
277
- return Promise.reject(dependency);
278
- }
279
- } catch (err) {
280
- throw new InternalServerErrorException(err.message);
281
- }
282
- }
283
-
284
- updateOne = async (data: T) => {
285
- this.doc.updateOne(data);
286
- };
287
-
288
- findIdThenUpdate = async (id: string, data: T) => {
289
- const existingdata = await this.findById(id);
290
- await this.hook(HookType.beforeUpdate, data);
291
- try {
292
- Object.assign(data, UserProvider.getInstance().getUpdateFilter());
293
- Object.assign(existingdata, data);
294
- await this.validateData(data);
295
- let filter = this.getIsolationFilter();
296
- filter['_id'] = id;
297
- const result = await this.doc.findOneAndUpdate(filter, data);
298
- await this.hook(HookType.afterUpdate, data);
299
- return result;
300
- } catch (err) {
301
- throw new InternalServerErrorException(err.message);
302
- }
303
- };
304
-
305
- //find what foreign key constraint
306
- async getRelatedRecords(id: string) {
307
- const foreignkeysettings = foreignkeys[this.documentName];
308
- //console.log('foreignkeysettings', foreignkeysettings);
309
- const propkeys = Object.getOwnPropertyNames(foreignkeysettings);
310
-
311
- if (propkeys.length > 0) {
312
- //console.log('Have properties');
313
- for (let i = 0; i < propkeys.length; i++) {
314
- const collectionname = propkeys[i];
315
- //console.log('run ', i, collectionname);
316
- const fobjs = foreignkeysettings[propkeys[i]];
317
- const collection = this.doc.db.collection(collectionname);
318
- //single schema may have multiple foreign key link here, loop all
319
- for (let j = 0; j < fobjs.length; j++) {
320
- const fkey = fobjs[j] + '._id';
321
- const filter = {};
322
- filter[fkey] = id;
323
- //console.log('getRelatedRecords get filter', collectionname, filter);
324
- const result = await collection.findOne(filter);
325
- //console.log('getRelatedRecords', result);
326
- if (result) {
327
- return Promise.reject(result);
328
- }
329
- }
330
- }
331
- }
332
- return Promise.resolve(null);
333
- }
334
-
335
- /**
336
- * change property documentStatus for specific document, no workflow execution
337
- * @param id
338
- * @param docstatus
339
- * @returns Promise
340
- */
341
- async setDocumentStatus(id: string, docstatus: string) {
342
- const partialdata: T = {} as T;
343
- partialdata['documentStatus'] = docstatus;
344
- return this.findIdThenUpdate(id, partialdata);
345
- }
346
-
347
- /**
348
- * change property documentStatus for specific document, no workflow execution
349
- * @param id
350
- * @param docstatus
351
- * @returns Promise
352
- */
353
- async executeWorkFlow(id: string, bpmnname: string, docstatus: string) {
354
- const data = await this.findById(id);
355
- return Workflow.getInstance().executeWorkFlow(
356
- id,
357
- bpmnname,
358
- docstatus,
359
- data,
360
- );
361
- }
362
-
363
- async getMyUserTask() {
364
- return Workflow.getInstance().getMyUserTask();
365
- }
366
- }
@@ -1,34 +0,0 @@
1
- import { Injectable, NestMiddleware, Scope } from '@nestjs/common';
2
- import { Request, Response, NextFunction } from 'express';
3
- // import * as jwt from 'nestjs-jwt'
4
-
5
- import { UserProvider } from './UserProvider';
6
- // import {KeycloakConfigService} from "../keycloak/keycloak.service"
7
- @Injectable({
8
- scope: Scope.REQUEST,
9
- })
10
- export class TenantMiddleware implements NestMiddleware {
11
- use(req: Request, res: Response, next: NextFunction) {
12
- if (req.baseUrl == '/oauth2-redirect.html') {
13
- next();
14
- return;
15
- }
16
- if (!req.headers['authorization']) {
17
- return res.status(401).send('Undefine bearer token');
18
- }
19
- if (!req.headers['x-org']) {
20
- return res.status(401).send('undefine header string x-org');
21
- }
22
- const u = UserProvider.getInstance();
23
-
24
- try {
25
- u.setXorg(req.headers['x-org'].toString());
26
- let tokenstr: string = req.headers['authorization'];
27
- tokenstr = tokenstr.replace('Bearer ', '');
28
- u.setUserToken(tokenstr);
29
- next();
30
- } catch {
31
- return res.status(401).send('Invalid x-org or user info');
32
- }
33
- }
34
- }
@@ -1,127 +0,0 @@
1
- import { Injectable, Scope } from '@nestjs/common';
2
- import Base64URL from '@darkwolf/base64url';
3
- import * as jwt from 'jsonwebtoken';
4
-
5
- @Injectable({
6
- scope: Scope.REQUEST,
7
- })
8
- export class UserProvider {
9
- private static instance: UserProvider;
10
- protected uid: string = '';
11
- protected uname: string = '';
12
- protected email: string = '';
13
- protected fullname: string = '';
14
- protected xOrg: string = '';
15
- protected tenantId: number = 0;
16
- protected orgId: number = 0;
17
- protected branchId: number = 0;
18
- protected accessrights: any = {};
19
- protected token: string = '';
20
- protected refreshtoken: string = '';
21
- protected groups: string[] = [];
22
- constructor() {}
23
- public static getInstance(): UserProvider {
24
- if (!UserProvider.instance) {
25
- UserProvider.instance = new UserProvider();
26
- }
27
- return UserProvider.instance;
28
- }
29
- getUid = () => this.uid;
30
- getUname = () => this.uname;
31
- getFullname = () => this.fullname;
32
- getTenantId = () => this.tenantId;
33
- getOrgId = () => this.orgId;
34
- getBranchId = () => this.branchId;
35
- getEmail = () => this.email;
36
- getGroups = () => this.groups;
37
- setUserToken = (tokenstr: string) => {
38
- const tokeninfo = jwt.decode(tokenstr);
39
- // realm_access: {
40
- // roles: [
41
- // 'default-roles-simitdeveloper',
42
- // 'offline_access',
43
- // 'uma_authorization'
44
- // ]
45
- // },
46
- // resource_access: { account: { roles: [Array] } },
47
- // scope: 'openid email profile',
48
- // sid: '53192f53-d4af-413b-b8d7-1e186419fe53',
49
- // email_verified: false,
50
- // name: 'kstan kstan',
51
- // preferred_username: 'kstan',
52
- // given_name: 'kstan',
53
- // family_name: 'kstan',
54
- // email: 'kstan@simitgroup.com'
55
-
56
- const u = UserProvider.getInstance();
57
- u.token = tokenstr;
58
- u.uid = tokeninfo.sub;
59
- u.email = tokeninfo.email;
60
- u.uname = tokeninfo.preferred_username;
61
- u.fullname = tokeninfo.name;
62
- u.groups = ['superuser', 'accountant', 'directors'];
63
- u.accessrights = tokeninfo.resource_access;
64
- };
65
- getInfo = () => {
66
- return UserProvider.getInstance();
67
- };
68
- getBranchFilter = () => {
69
- return {
70
- tenantId: UserProvider.getInstance().tenantId,
71
- orgId: UserProvider.getInstance().orgId,
72
- branchId: UserProvider.getInstance().branchId,
73
- };
74
- };
75
- getTenantFilter = () => {
76
- return { tenantId: UserProvider.getInstance().tenantId };
77
- };
78
- getOrgFilter = () => {
79
- return {
80
- tenantId: UserProvider.getInstance().tenantId,
81
- orgId: UserProvider.getInstance().orgId,
82
- };
83
- };
84
- getWorkflowTaskFilter() {
85
- return {
86
- 'data.tenantId': UserProvider.getInstance().tenantId,
87
- 'assignments.assignee': UserProvider.getInstance().getUid(),
88
- // 'assignments.assignee': User.getInstance().getUid(),
89
- };
90
- }
91
- getCreateFilter = () => {
92
- const u = UserProvider.getInstance();
93
- return {
94
- tenantId: u.tenantId,
95
- orgId: u.orgId,
96
- branchId: u.branchId,
97
- createdby: u.uid,
98
- updatedby: u.uid,
99
- created: new Date().getTime().toString(),
100
- updated: new Date().getTime().toString(),
101
- };
102
- };
103
- getUpdateFilter = () => {
104
- const u = UserProvider.getInstance();
105
- return {
106
- updatedby: u.uid,
107
- updated: new Date().getTime().toString(),
108
- };
109
- };
110
- setXorg = (xorg) => {
111
- try {
112
- const decodedText: string = Base64URL.decodeText(xorg);
113
- const arrXorg = decodedText.split('-');
114
-
115
- if (arrXorg.length == 3) {
116
- const u = UserProvider.getInstance();
117
- u.tenantId = Number(arrXorg[0]);
118
- u.orgId = Number(arrXorg[1]);
119
- u.branchId = Number(arrXorg[2]);
120
- } else {
121
- throw 'invalid x-org';
122
- }
123
- } catch (err) {
124
- throw err;
125
- }
126
- };
127
- }
@@ -1,12 +0,0 @@
1
- import { Controller, Get } from '@nestjs/common';
2
- import { AppService } from './app.service';
3
-
4
- @Controller()
5
- export class AppController {
6
- constructor(private readonly appService: AppService) {}
7
-
8
- @Get('myworkflowtask')
9
- async getHello() {
10
- return await this.appService.getMyTask();
11
- }
12
- }
@@ -1,64 +0,0 @@
1
- import { Module,MiddlewareConsumer,NestModule } from '@nestjs/common';
2
- import { MongooseModule } from '@nestjs/mongoose';
3
- import { APP_GUARD } from '@nestjs/core';
4
- import {
5
- AuthGuard, KeycloakConnectModule,
6
- ResourceGuard,TokenValidation,
7
- RoleGuard,PolicyEnforcementMode
8
- } from 'nest-keycloak-connect';
9
- import { ConfigModule } from '@nestjs/config';
10
- import { ServeStaticModule } from '@nestjs/serve-static';
11
- import { join } from 'path';
12
- import {TenantMiddleware} from './class/TenantMiddleware'
13
- import {AppController} from './app.controller'
14
- import {AppService} from './app.service'
15
- <% for(let i=0;i<it.length; i++){ %>
16
- import {<%= it[i].docname %>Module} from './docs/<%= it[i].doctype %>/<%= it[i].doctype %>.module'
17
- <%}%>
18
-
19
- @Module({
20
- //define environment variables: MONGODB_URL='mongodb://<user>:<pass>@<host>:<port>/<db>?authMechanism=DEFAULT'
21
- imports: [
22
- ConfigModule.forRoot(),
23
- MongooseModule.forRoot(process.env.MONGODB_URL),
24
- ServeStaticModule.forRoot({
25
- rootPath: join(__dirname, '..', 'public_html'),
26
- exclude: ['/api/(.*)'],
27
- }),
28
- KeycloakConnectModule.register({
29
- authServerUrl: process.env.OAUTH2_BASEURL,
30
- realm: process.env.OAUTH2_REALM,
31
- clientId: process.env.OAUTH2_CLIENTID,
32
- secret: process.env.OAUTH2_CLIENTSECRET,
33
- policyEnforcement: PolicyEnforcementMode.PERMISSIVE,
34
- tokenValidation: TokenValidation.ONLINE,
35
- }),
36
- <% for(let i=0;i<it.length; i++){ %><%= it[i].docname %>Module,<%}%>],
37
- controllers: [AppController],
38
- providers: [
39
- AppService,
40
- {
41
- provide: APP_GUARD,
42
- useClass: AuthGuard,
43
- },
44
- {
45
- provide: APP_GUARD,
46
- useClass: ResourceGuard,
47
- },
48
- {
49
- provide: APP_GUARD,
50
- useClass: RoleGuard,
51
- },],
52
- })
53
- export class AppModule implements NestModule{
54
- configure(consumer: MiddlewareConsumer) {
55
- consumer
56
- .apply(TenantMiddleware)
57
- // .exclude('/api-yaml')
58
- // .exclude('/api-json')
59
- // .exclude('/api')
60
- .forRoutes('*')
61
-
62
-
63
- }
64
- }
@@ -1,8 +0,0 @@
1
- import { Injectable } from '@nestjs/common';
2
- import { Workflow } from './class/Workflow';
3
- @Injectable()
4
- export class AppService {
5
- async getMyTask() {
6
- return await Workflow.getInstance().getMyUserTask()
7
- }
8
- }
@@ -1,6 +0,0 @@
1
- import {HttpException,HttpStatus} from '@nestjs/common'
2
- export class InputValidationExceptions extends HttpException {
3
- constructor() {
4
- super('input error', HttpStatus.INTERNAL_SERVER_ERROR);
5
- }
6
- }
@@ -1,28 +0,0 @@
1
- MONGODB_URL=<%=it.mongoConnectStr%>
2
-
3
- HTTP_PORT=<%=it.backendPort%>
4
-
5
- PROJECT_NAME=SimpleApp Demo1
6
- PROJECT_DESCRIPTION=Try CRUD
7
- PROJECT_Version=1.0.0
8
-
9
- BPMN_HOST=<%=it.bpmnsetting.BPMN_HOST%>
10
-
11
- BPMN_PORT=<%=it.bpmnsetting.BPMN_PORT%>
12
-
13
- BPMN_API_KEY=<%=it.bpmnsetting.BPMN_API_KEY%>
14
-
15
-
16
- OAUTH2_BASEURL=<%=it.keycloaksetting.OAUTH2_BASEURL%>
17
-
18
- OAUTH2_REALM=<%=it.keycloaksetting.OAUTH2_REALM%>
19
-
20
- OAUTH2_CONFIGURL=<%=it.keycloaksetting.OAUTH2_CONFIGURL%>
21
-
22
- OAUTH2_CLIENTID=<%=it.keycloaksetting.OAUTH2_CLIENTID%>
23
-
24
- OAUTH2_CLIENTSECRET=<%=it.keycloaksetting.OAUTH2_CLIENTSECRET%>
25
-
26
- AUTH_SECRET_KEY=<%=it.keycloaksetting.AUTH_SECRET_KEY%>
27
-
28
- AUTH_ORIGIN=http://localhost:8080
@@ -1,31 +0,0 @@
1
- import { NestFactory } from '@nestjs/core';
2
- import { AppModule } from './app.module';
3
- import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
4
-
5
- async function bootstrap() {
6
- const app = await NestFactory.create(AppModule);
7
- app.enableCors();
8
- const config = new DocumentBuilder()
9
- .setTitle(process.env.PROJECT_NAME)
10
- .setDescription(process.env.PROJECT_DESCRIPTION)
11
- .setVersion(process.env.PROJECT_VERSION)
12
- .addApiKey({
13
- in: 'header',name: 'x-org',type: 'apiKey',description: 'base 64 url encode. example: MS0xLTE',
14
- },'x-org',)
15
- .addOAuth2({
16
- type:'oauth2',flows:{
17
- implicit:{
18
- authorizationUrl: `${process.env.OAUTH2_CONFIGURL}/protocol/openid-connect/auth`,
19
- scopes:{},
20
- }}},'oauth2')
21
- .addSecurityRequirements('x-org')
22
- .addSecurityRequirements('oauth2')
23
- .build();
24
- const document = SwaggerModule.createDocument(app, config);
25
- SwaggerModule.setup('api', app, document, {
26
- swaggerOptions: { showExtensions: true, persistAuthorization: true },
27
- });
28
-
29
- await app.listen(process.env.HTTP_PORT ?? 8000); //listen which port
30
- }
31
- bootstrap();