@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
@@ -0,0 +1 @@
1
+ export const foreignkeys = <%~JSON.stringify(it.foreignkeys)%>
@@ -0,0 +1,101 @@
1
+ import { UserContext } from './user.context';
2
+ import { InjectModel } from '@nestjs/mongoose';
3
+ import { Model } from 'mongoose';
4
+ import {DocNumberFormatResult} from '../types'
5
+ import { Docnoformat } from '../types/docno.type'
6
+ import { Injectable, InternalServerErrorException,BadRequestException } from '@nestjs/common';
7
+ import * as moment from 'moment';
8
+ import {ForeignKey} from '../types'
9
+
10
+ export class DocNumberFormatGenerator{
11
+ constructor(@InjectModel('Docnoformat') private docformat: Model<Docnoformat>) {}
12
+
13
+
14
+ async generateNextNumberFromDocument(appuser:UserContext,docType:string,data:any){
15
+ let formatId = ''
16
+ if(data.docNoFormat && data.docNoFormat._id){
17
+ formatId=data.docNoFormat._id
18
+ }
19
+ const docnoobj = await this.generateNextNo(appuser,docType,formatId)
20
+ const result:ForeignKey = {
21
+ _id : String(docnoobj.formatId),
22
+ label: docnoobj.formatName
23
+ }
24
+ data.docNoFormat = result
25
+ return docnoobj.result
26
+ }
27
+
28
+
29
+ generateNextNo = async (appuser: UserContext,doctype: string,id: string = '') => {
30
+ doctype = doctype.toUpperCase();
31
+ let filter = { docNoType: doctype };
32
+ if (id) {
33
+ filter['_id'] = id;
34
+ }
35
+ Object.assign(filter,appuser.getBranchFilter())
36
+ const result = await this.docformat.find(filter)
37
+ //search(appuser, filter);
38
+ if (result && result.length > 0) {
39
+ const d: Docnoformat = result[0];
40
+ const recordId = d._id;
41
+ const newdocno = DocNumberFormatGenerator.previewDocNo(d);
42
+ const newnextnumber = d.nextNumber + 1;
43
+ const updatedata = { nextNumber: newnextnumber } as Docnoformat;
44
+ const updateresult = await this.docformat.findByIdAndUpdate(recordId,updatedata).session(appuser.getDBSession())
45
+
46
+ if (updateresult) {
47
+ const result:DocNumberFormatResult = {formatId:d._id,formatName:d.docNoFormatName,result: newdocno }
48
+ return result
49
+ //;
50
+ } else {
51
+ throw new InternalServerErrorException(
52
+ `Update document format ${doctype}/${recordId} to next number (${newnextnumber}) failed`,
53
+ );
54
+ }
55
+ } else {
56
+ throw new BadRequestException(
57
+ `invalid parameter doctype: "${doctype}" or id: ${id}`,
58
+ );
59
+ }
60
+ };
61
+ static previewDocNo = (s: Docnoformat) => {
62
+ try {
63
+ const pattern = s.docNoPattern;
64
+ const numberReg: RegExp = /\<(.*?)\>/g;
65
+ const dateReg: RegExp = /\{(.*?)\}/g;
66
+ let newvalue = pattern;
67
+ const numberpattern: string[] = pattern.match(numberReg);
68
+ const datepattern: string[] = pattern.match(dateReg);
69
+
70
+ if (numberpattern && numberpattern.length > 0) {
71
+ const numberlength = numberpattern[0]
72
+ .replace('<', '')
73
+ .replace('>', '').length;
74
+
75
+ let nextnumber = s.nextNumber.toString();
76
+
77
+ const numberdiff = numberlength - nextnumber.length;
78
+
79
+ for (let n = 0; n < numberdiff; n++) {
80
+ nextnumber = '0' + nextnumber;
81
+ }
82
+ newvalue = newvalue.replace(numberpattern[0], nextnumber);
83
+ }
84
+
85
+ if (datepattern && datepattern.length > 0) {
86
+ for (let d = 0; d < datepattern.length; d++) {
87
+ const dpattern = datepattern[d];
88
+ const date = new Date();
89
+ const formatteddate = moment().format(
90
+ dpattern.replace('{', '').replace('}', ''),
91
+ );
92
+ newvalue = newvalue.replace(dpattern, formatteddate);
93
+ }
94
+ }
95
+ return newvalue;
96
+ } catch (e) {
97
+ const errors = `Format ${s.docNoFormatName} error ${e}`;
98
+ throw new InternalServerErrorException(errors);
99
+ }
100
+ };
101
+ }
@@ -0,0 +1,39 @@
1
+ import {
2
+ ExceptionFilter,
3
+ Catch,
4
+ ArgumentsHost,
5
+ HttpException,
6
+ HttpStatus,
7
+ } from '@nestjs/common';
8
+ import { HttpAdapterHost } from '@nestjs/core';
9
+ import { ClientSession } from 'mongoose';
10
+ @Catch()
11
+ export class SimpleAppExceptionFilter implements ExceptionFilter {
12
+ constructor(private readonly httpAdapterHost: HttpAdapterHost) {}
13
+
14
+ catch(exception, host: ArgumentsHost): void {
15
+ // In certain situations `httpAdapter` might not be available in the
16
+ // constructor method, thus we should resolve it here.
17
+ const { httpAdapter } = this.httpAdapterHost;
18
+ const ctx = host.switchToHttp();
19
+ const request = ctx.getRequest<Request>();
20
+ if(request['sessionuser']){
21
+ const session:ClientSession = request['sessionuser'].getDBSession()
22
+ if(session.inTransaction())session.abortTransaction()
23
+ }
24
+
25
+
26
+ const responseBody = {
27
+ message:exception.message,
28
+ timestamp: new Date().toISOString(),
29
+ path: httpAdapter.getRequestUrl(ctx.getRequest()),
30
+ error: exception.response.options?? exception.options
31
+ };
32
+ // console.log("exception properties", Object.getOwnPropertyNames(exception),exception.options)
33
+
34
+ // console.log("exception.responseexception.response",exception)
35
+
36
+
37
+ httpAdapter.reply(ctx.getResponse(), responseBody, exception.response.status??exception.status);
38
+ }
39
+ }
@@ -0,0 +1,38 @@
1
+
2
+ import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
3
+ import { Observable } from 'rxjs';
4
+ import { tap } from 'rxjs/operators';
5
+ import { Model,Connection, ClientSession } from 'mongoose';
6
+ import { InjectConnection } from '@nestjs/mongoose';
7
+ import { UserContext } from '../user.context';
8
+ @Injectable()
9
+ export class ResponseInterceptor implements NestInterceptor {
10
+
11
+ constructor(@InjectConnection() private readonly connection: Connection,){
12
+
13
+
14
+ }
15
+ intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
16
+ const req = context.switchToHttp().getRequest()
17
+
18
+ const usersession:UserContext = req['sessionuser']
19
+ const session:ClientSession = usersession.getDBSession()
20
+ // session.startTransaction()
21
+ // console.log("sessionuser exists!!")
22
+
23
+ const now = Date.now();
24
+ return next
25
+ .handle()
26
+ .pipe(
27
+ tap(() => {
28
+
29
+ if(process.env.DRYRUN=='true'){
30
+ console.warn("--------dryrun! roll back everything-----------")
31
+ if(session.inTransaction())session.abortTransaction()
32
+ }else{
33
+ if(session.inTransaction())session.commitTransaction()
34
+ }
35
+ }),
36
+ );
37
+ }
38
+ }
@@ -0,0 +1,88 @@
1
+ import { Injectable, NestMiddleware, Logger,Scope,Inject } from '@nestjs/common';
2
+ import { Request, Response, NextFunction } from 'express';
3
+ import { InjectModel } from '@nestjs/mongoose';
4
+ import { Model,Connection } from 'mongoose';
5
+ // import * as mongoose from 'mongoose';
6
+ import { User, } from '../../types/user.type';
7
+ import { Permission, } from '../../types/perm.type';
8
+ import { InjectConnection } from '@nestjs/mongoose';
9
+
10
+ const Base64URL = require('@darkwolf/base64url');
11
+ // import * as jwt from 'nestjs-jwt'
12
+
13
+ import { UserContext } from '../user.context';
14
+ // import {KeycloakConfigService} from "../keycloak/keycloak.service"
15
+ @Injectable()
16
+ export class TenantMiddleware implements NestMiddleware {
17
+ protected defaultxorg=Base64URL.encodeText('0-0-0')
18
+ protected excludeXorgs = ['/profile', '/profile/tenant']
19
+ protected logger = new Logger()
20
+ protected transController
21
+ constructor(
22
+ @InjectModel('User') private readonly usermodel:Model<User>,
23
+ @InjectModel('Permission') private readonly permmodel:Model<Permission>,
24
+ @InjectConnection() private readonly connection: Connection,
25
+ ){}
26
+
27
+ requireXorg(baseurl:string):boolean{
28
+ // console.log('requireXorg')
29
+ for(let i =0; i < this.excludeXorgs.length;i++){
30
+ if(baseurl.includes(this.excludeXorgs[i])){
31
+ this.logger.verbose("requireXorg = false")
32
+ return false
33
+ }
34
+ }
35
+ // console.log("Require xorg")
36
+ return true
37
+ }
38
+ async use(req: Request, res: Response, next: NextFunction) {
39
+ if (req.baseUrl == '/oauth2-redirect.html') {
40
+ next();
41
+ return;
42
+ }
43
+ this.logger.debug(`running TenantMiddleware for ${req.baseUrl}`)
44
+ if (!req.headers['authorization']) {
45
+ this.logger.log("undefine bearer token")
46
+ return res.status(401).send('Undefine bearer token');
47
+ }
48
+ if (!req.headers['x-org'] && this.requireXorg(req.baseUrl)) {
49
+ this.logger.log("undefine x-org and require that at "+req.baseUrl,"TenantMiddleware")
50
+ return res.status(401).send('undefine header string x-org');
51
+ }
52
+ const session = await this.connection.startSession()
53
+ const u = new UserContext(this.usermodel,this.permmodel,session)
54
+ // console.log("line 43")
55
+ try {
56
+ let tokenstr: string = req.headers['authorization'];
57
+ tokenstr = tokenstr.replace('Bearer ', '');
58
+
59
+ const xorg = req.headers['x-org']?? this.defaultxorg
60
+
61
+ await u.setCurrentUserInfo(tokenstr,xorg)
62
+ if(u.getId()=='' && this.requireXorg(req.baseUrl)){
63
+ this.logger.log("access deny of no user:", req.baseUrl)
64
+ return res.status(401).send('access deny');
65
+ }else{
66
+ if(u.getId()==''){
67
+ this.logger.verbose(`grant new user (${u.getUid()}) access ${req.baseUrl}`)
68
+ }else{
69
+ this.logger.verbose(`grant user (${u.getId()}) access ${req.baseUrl}`)
70
+ }
71
+ req['sessionuser'] = u
72
+ this.logger.verbose(u.getRoles())
73
+
74
+ next();
75
+ }
76
+
77
+ } catch(err) {
78
+ this.logger.warn(err,"invalid xorg or user info",)
79
+ this.logger.error(err)
80
+ if(err=='invalid x-org'){
81
+ return res.status(403).send(err);
82
+ }else{
83
+ return res.status(401).send(err);
84
+ }
85
+
86
+ }
87
+ }
88
+ }
@@ -1,30 +1,36 @@
1
1
  import { BPMNClient } from "bpmn-client";
2
- import { UserProvider } from './UserProvider';
3
- import { Injectable } from '@nestjs/common';
2
+ import { UserContext } from './user.context';
3
+ import { Injectable,Scope } from '@nestjs/common';
4
4
 
5
+ export const WorkflowProviderFactory = {
6
+ provide:'WorkflowProvider',
7
+ useFactory:()=>(new WorkflowProvider()),
8
+ scope:Scope.REQUEST
9
+ }
10
+
5
11
  export type UserTaskActorOptions={
6
12
  userId:string
7
13
  actGroups?:string[]
8
14
  actUsers?:string[]
9
15
  }
10
16
  @Injectable()
11
- export class Workflow{
12
- private static instance: Workflow;
17
+ export class WorkflowProvider{
18
+ // private static instance: Workflow;
13
19
  server:BPMNClient
14
20
 
15
21
  constructor(){
16
22
  this.server= new BPMNClient(process.env.BPMN_HOST, process.env.BPMN_PORT, process.env.BPMN_API_KEY);
17
23
  }
18
- public static getInstance(): Workflow {
19
- if (!Workflow.instance) {
20
- Workflow.instance = new Workflow();
21
- }
22
- return Workflow.instance;
23
- }
24
+ // public static getInstance(): Workflow {
25
+ // if (!Workflow.instance) {
26
+ // Workflow.instance = new Workflow();
27
+ // }
28
+ // return Workflow.instance;
29
+ // }
24
30
 
25
31
  async executeWorkFlow(id: string, bpmnname: string, docstatus: string,data:any) {
26
32
  const workflowactoroptions : UserTaskActorOptions ={
27
- userId:UserProvider.getInstance().getUid(),
33
+ userId: 'id',
28
34
  actGroups:[],
29
35
  actUsers:[]
30
36
  }
@@ -33,8 +39,8 @@ export class Workflow{
33
39
  return Promise.resolve(res);
34
40
  }
35
41
  async getMyUserTask(){
36
- const uid = UserProvider.getInstance().getUid()
37
- const groups = UserProvider.getInstance().getGroups()
42
+ const uid = 'id'
43
+ const groups = 'group'
38
44
  // 'assignments.candidateUsers': User.getInstance().getUid(),
39
45
  // 'assignments.candidateGroups': User.getInstance().getGroups
40
46
 
@@ -55,7 +61,7 @@ export class Workflow{
55
61
  anyof.push(tmp)
56
62
  }
57
63
  const filters = {
58
- 'data.tenantId': UserProvider.getInstance().getTenantId(),
64
+ 'data.tenantId': 1,
59
65
  '$or':anyof
60
66
  }
61
67
  console.dir(filters)
@@ -0,0 +1,6 @@
1
+
2
+ import { SetMetadata } from '@nestjs/common';
3
+ import { Role } from './roles.enum';
4
+
5
+ export const ROLES_KEY = 'roles';
6
+ export const Roles = (...roles: Role[]) => SetMetadata(ROLES_KEY, roles);
@@ -0,0 +1,28 @@
1
+ export enum Role {
2
+ Unknown = 'unknown', // unuse yet
3
+ Everyone = 'everyone', //everyone
4
+ SuperAdmin = 'superadmin', //reserved for developers, no control,
5
+ SuperUser = 'suerpuser', //reserved, plan use by support
6
+ TenantOwner = 'tenantowner', //tenant owner/creator
7
+ User = 'user',
8
+ <% for(let i=0;i<it.modules.length; i++){ %>
9
+ <% const m = it.modules[i] %>
10
+ <%=m.docname%>_create='<%=m.docname%>:create',
11
+
12
+ <%=m.docname%>_update='<%=m.docname%>:update',
13
+
14
+ <%=m.docname%>_delete='<%=m.docname%>:delete',
15
+
16
+ <%=m.docname%>_search='<%=m.docname%>:search',
17
+
18
+ <% if(m.api && m.api.length >0) {%>
19
+
20
+ <% for(let j=0;j<m.api.length; j++){ %>
21
+ <%let api = m.api[j]%>
22
+
23
+ <%=m.docname%>_<%=api.action%>='<%=m.docname%>:<%=api.action%>',
24
+
25
+ <%}%>
26
+ <%}%>
27
+ <%}%>
28
+ }
@@ -0,0 +1,10 @@
1
+ import {Role} from './roles.enum'
2
+
3
+ <% Object.getOwnPropertyNames(it.allroles).forEach((key)=>{ %>
4
+ export const <%=key%>=[
5
+ Role.User,
6
+ <%for(let i=0; i <it.allroles[key].length; i++){%>
7
+ Role.<%=it.allroles[key][i]%>,
8
+ <%}%>
9
+ ]
10
+ <%})%>
@@ -0,0 +1,34 @@
1
+
2
+ import { Injectable, Inject, CanActivate, ExecutionContext, Scope } from '@nestjs/common';
3
+ import { Reflector } from '@nestjs/core';
4
+ import { Role } from './roles.enum'
5
+ import { ROLES_KEY } from './roles.decorator'
6
+ import { UserContext } from '../user.context';
7
+
8
+ @Injectable()
9
+ export class RolesGuard implements CanActivate {
10
+ constructor(private reflector: Reflector) {}
11
+
12
+ canActivate(context: ExecutionContext): boolean {
13
+
14
+ const requiredRoles = this.reflector.getAllAndOverride<Role[]>(ROLES_KEY, [
15
+ context.getHandler(),
16
+ context.getClass(),
17
+ ]);
18
+
19
+ const sessionuser = context.switchToHttp().getRequest()['sessionuser']
20
+
21
+ if (!requiredRoles) {
22
+ return true;
23
+ }
24
+
25
+ const roles = sessionuser.getRoles()
26
+ if(!roles){
27
+ return false
28
+ }
29
+ const result = requiredRoles.some((role) => roles.includes(role));
30
+
31
+ return result
32
+ // return true
33
+ }
34
+ }