@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
@@ -6,15 +6,11 @@
6
6
  * last change 2023-09-09
7
7
  * author: Ks Tan
8
8
  */
9
- <% let skipcolumns = ['_id','createdby','created','updatedby','updated','orgId','branchId','tenantId','doctype'] %>
10
-
11
- import { <%= it.typename %>Doc } from "../../../simpleapp/simpleappdocs/<%= it.typename %>Doc";
12
- import SimpleAppDatatable from "@simitgroup/simpleapp-vue-component/src/components/SimpleAppDatatable.vue";
9
+ <% let skipcolumns = ['_id','createdby','created','updatedby','updated','orgId','branchId','tenantId','doctype'] %>
13
10
  import {InputTableColumnType,InputTableColumn} from "@simitgroup/simpleapp-vue-component/src/type";
14
- const { $event, $listen } = useNuxtApp();
15
- const route = useRoute()
16
- const doc = new <%= it.typename %>Doc(route.params.xorg.toString(),$event, $listen);
17
- const documentpath = `/${route.params.xorg}/<%= it.name %>`;
11
+ import Column from "primevue/column";
12
+ const {$<%= it.typename %>Doc } = useNuxtApp();
13
+ const doc = $<%= it.typename %>Doc()
18
14
  const data = doc.getReactiveData();
19
15
  const columns = [
20
16
  <%Object.keys(it.jsonschema.properties).forEach(function(key) { %>
@@ -24,6 +20,7 @@
24
20
  <%})%>
25
21
  ]
26
22
  //prepare subtable if exists
23
+ /*
27
24
  <%Object.keys(it.jsonschema.properties).forEach(function(key) { %>
28
25
  <% let obj=it.jsonschema.properties[key] %>
29
26
 
@@ -36,17 +33,19 @@
36
33
  ]
37
34
  <%}%>
38
35
  <%})%>
39
-
36
+ */
37
+ //end
40
38
  </script>
41
39
  <template>
42
40
  <div>
43
41
  <CrudSimple :document="doc" title="<%= it.typename %>"
44
42
  #default="o"
45
- :path="documentpath"
43
+ :path="`/${useRoute().params.xorg}/<%= it.name %>`"
46
44
  :listColumns="columns">
47
45
 
48
46
  <%Object.keys(it.jsonschema.properties).forEach(function(key) { %>
49
- <% let obj=it.jsonschema.properties[key] %>
47
+
48
+ <% let obj=it.jsonschema.properties[key] %>
50
49
  <% if(skipcolumns.indexOf(key)>=0){ %>
51
50
  <% } else if(obj.type=='boolean'){ %>
52
51
  <SimpleAppCheckbox autofocus :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>"/>
@@ -57,17 +56,32 @@
57
56
  <% } else if(obj.type=='object' && typeof obj['x-foreignkey']!='undefined'){ %>
58
57
  <SimpleAppAutocomplete :setting="o.getField('#/properties/<%= key %>')"
59
58
  v-model="data.<%= key %>" optionLabel="label" :remote-src="getAutocomplete('<%=obj['x-foreignkey']%>')"/>
60
- <% } else if(obj.type=='string'){ %>
61
- <% if(obj.format=='date'){ %>
59
+ <% } else if(obj.type=='string'){ %>
60
+ <% if(obj.format=='documentno'){ %>
61
+ <SimpleAppDocumentNo autofocus :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>" v-model:docNoFormat="data.docNoFormat" />
62
+ <% }else if(obj.format=='date'){ %>
62
63
  <SimpleAppText type="<%=obj.format%>" autofocus :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>"/>
63
- <% } else if(obj.format=='x-text'){ %>
64
+ <% } else if(obj.format=='text'){ %>
64
65
  <SimpleAppTextarea :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>"/>
65
- <% } else if(obj.format=='x-html'){ %>
66
+ <% } else if(obj.format=='html'){ %>
66
67
  <SimpleAppEditor editorStyle="height: 320px" :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>"/>
67
68
  <% } else if(obj.format=='email'){ %>
68
69
  <SimpleAppText autofocus type="<%=obj.type%>" :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>"/>
69
70
  <% } else if(obj.enum){ %>
70
- <SimpleAppRadio autofocus :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>"/>
71
+ <SimpleAppSelect autofocus :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>"/>
72
+ <% } else if(obj['anyOf']){ %>
73
+ <% for(let f = 0; f < obj['anyOf'].length; f++){ %>
74
+ <%if(obj['anyOf'][f]['format']){ %>
75
+ <SimpleAppText type='<%=obj['anyOf'][f]['format']%>' autofocus :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>"/>
76
+ <%}%>
77
+ <%}%>
78
+ <% } else if(obj['oneOf']){ %>
79
+ <% for(let f = 0; f < obj['oneOf'].length; f++){ %>
80
+ <%if(obj['oneOf'][f]['format']){ %>
81
+ <SimpleAppText type='<%=obj['oneOf'][f]['format']%>' autofocus :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>"/>
82
+ <%}%>
83
+ <%}%>
84
+
71
85
  <% } else {%>
72
86
  <SimpleAppText autofocus :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>"/>
73
87
  <% }%>
@@ -91,14 +105,14 @@
91
105
  <% } else if(sobj.type=='string'){ %>
92
106
  <% if(sobj.format=='date'){ %>
93
107
  <SimpleAppText type="<%=sobj.format%>" instancePath="<%=instancePath%>" autofocus :setting="<%~fieldpath%>" v-model="<%= vmodel %>"/>
94
- <% } else if(sobj.format=='x-text'){ %>
108
+ <% } else if(sobj.format=='text'){ %>
95
109
  <SimpleAppTextarea :setting="<%~fieldpath%>'" instancePath="<%=instancePath%>" v-model="<%= vmodel %>"/>
96
- <% } else if(sobj.format=='x-html'){ %>
110
+ <% } else if(sobj.format=='html'){ %>
97
111
  <SimpleAppEditor editorStyle="height: 320px" instancePath="<%=instancePath%>" :setting="<%=fieldpath%>" v-model="<%= vmodel %>"/>
98
112
  <% } else if(sobj.format=='email'){ %>
99
113
  <SimpleAppText autofocus type="<%=~obj.type%>" instancePath="<%=instancePath%>" :setting="<%=fieldpath%>" v-model="<%= vmodel %>"/>
100
114
  <% } else if(sobj.enum){ %>
101
- <SimpleAppRadio autofocus :setting="<%~fieldpath%>" instancePath="<%=instancePath%>" v-model="<%= vmodel %>"/>
115
+ <SimpleAppSelect autofocus :setting="<%~fieldpath%>" instancePath="<%=instancePath%>" v-model="<%= vmodel %>"/>
102
116
  <% } else {%>
103
117
  <SimpleAppText autofocus :setting="<%~fieldpath%>" instancePath="<%=instancePath%>" v-model="<%= vmodel %>"/>
104
118
  <% }%>
@@ -106,9 +120,58 @@
106
120
  <%})%>
107
121
  </SimpleAppValue>
108
122
  <% } else if(obj.type=='array' && obj.items.type=='object'){%>
109
- <button @click="doc.add<%=key%>()" type="button">+</button>
110
- <SimpleAppInputTable :getAutocomplete="getAutocomplete" :getField="o.getField"
111
- :setting="o.getField('#/properties/<%=key%>')" #default="row" v-model="data.<%=key%>" :columns="<%=it.name%>_<%=key%>"></SimpleAppInputTable>
123
+ <SimpleAppInputTable :getAutocomplete="getAutocomplete" :getField="o.getField" class="col-span-4"
124
+ :setting="o.getField('#/properties/<%=key%>')" v-model="data.<%=key%>">
125
+ <%let tablefields = Object.keys(obj.items.properties) %>
126
+ <% for(let a=0;a<tablefields.length;a++){%>
127
+ <%let col= tablefields[a] %>
128
+ <%let subobj = obj.items.properties[col] %>
129
+ <column field="<%=col%>" #body="{index}" :header="camelCaseToWords('<%=col%>')">
130
+ <%if(subobj['x-foreignkey']){%>
131
+ <SimpleAppAutocomplete v-model="data.<%=key%>[index].<%=col%>"
132
+ :setting="o.getField('#/properties/<%=key%>/items/properties/<%=col%>')"
133
+ :remoteSrc="getAutocomplete('<%=subobj[`x-foreignkey`]%>')"
134
+ optionLabel="label"
135
+ :hidelabel="true"
136
+ :instancePath="`/<%=key%>/${index}/<%=col%>`"/>
137
+ <% } else if(subobj.type=='boolean'){%>
138
+ <SimpleAppCheckbox v-model="data.<%=key%>[index].<%=col%>"
139
+ :setting="o.getField('#/properties/<%=key%>/items/properties/<%=col%>')"
140
+ :hidelabel="true"
141
+ :instancePath="`/<%=key%>/${index}/<%=col%>`"/>
142
+ <% } else if(subobj.type=='number' || subobj.type=='integer'){%>
143
+ <SimpleAppNumber v-model="data.<%=key%>[index].<%=col%>"
144
+ :setting="o.getField('#/properties/<%=key%>/items/properties/<%=col%>')"
145
+ :hidelabel="true"
146
+ :instancePath="`/<%=key%>/${index}/<%=col%>`"/>
147
+ <%} else if(subobj.type=='string' && subobj.format){%>
148
+ <SimpleAppText v-model="data.<%=key%>[index].<%=col%>"
149
+ :setting="o.getField('#/properties/<%=key%>/items/properties/<%=col%>')"
150
+ text="subobj.format"
151
+ :hidelabel="true"
152
+ :instancePath="`/<%=key%>/${index}/<%=col%>`"/>
153
+ <%} else if(subobj.type=='string' && subobj['enum']){%>
154
+ <SimpleAppSelect v-model="data.<%=key%>[index].<%=col%>"
155
+ :setting="o.getField('#/properties/<%=key%>/items/properties/<%=col%>')"
156
+ :hidelabel="true"
157
+ :instancePath="`/<%=key%>/${index}/<%=col%>`"/>
158
+ <%} else if(subobj.type=='string' ){%>
159
+ <SimpleAppText v-model="data.<%=key%>[index].<%=col%>"
160
+ :setting="o.getField('#/properties/<%=key%>/items/properties/<%=col%>')"
161
+ :hidelabel="true"
162
+ :instancePath="`/<%=key%>/${index}/<%=col%>`"/>
163
+ <%} else if(subobj.type=='number'){%>
164
+ <SimpleAppDynamicInput v-model="data.<%=key%>[index].<%=col%>"
165
+ :setting="o.getField('#/properties/<%=key%>/items/properties/<%=col%>')"
166
+ :hidelabel="true"
167
+ :instancePath="`/<%=key%>/${index}/<%=col%>`"/>
168
+ <%}%>
169
+ </column>
170
+ <%}%>
171
+ <column #body="{index}" header="Delete">
172
+ <button class="btn-danger" type="button" @click="data.<%=key%>.splice(index,1)">X</button>
173
+ </column>
174
+ </SimpleAppInputTable>
112
175
  <% } else{%>
113
176
  <!-- Can auto generate <%=obj.key %> -->
114
177
  <!-- <%~ JSON.stringify(obj) %>-->
@@ -0,0 +1,11 @@
1
+ /**
2
+ * This file was automatically generated by simpleapp generator.
3
+ * you may change it, it won't override
4
+ * last change 2023-09-24
5
+ * Author: Ks Tan
6
+ */
7
+
8
+ import {<%=it.typename%>Client} from "../generate/clients/<%=it.typename%>Client"
9
+ export class <%=it.typename%>Doc extends <%=it.typename%>Client{
10
+
11
+ }
@@ -0,0 +1,212 @@
1
+ /**
2
+ * This file was automatically generated by simpleapp generator.
3
+ * DO NOT MODIFY IT BY HAND. Instead, modify the source JSONSchema file,
4
+ * and regenerate this file.
5
+ * last change 2023-09-23
6
+ * Author: Ks Tan
7
+ */
8
+ import _ from 'lodash'
9
+ import { SimpleAppClient } from "./SimpleAppClient";
10
+ import {
11
+ <%Object.keys(it.models).forEach(function(modelname) { %> Default<%=modelname%>, <%})%>
12
+ } from '../defaults/<%= it.typename%>.default'
13
+ import {AxiosResponse} from 'axios'
14
+ <%if(it.jsonschema['x-import-lib']) {%>
15
+ <%let libs = it.jsonschema['x-import-lib'] %>
16
+ <%for(let l = 0; l< libs.length; l++) { %>
17
+ import * as <%=libs[l].importAs %> from '<%=libs[l].importFrom %>'
18
+ <%}%>
19
+ <%}%>
20
+ // import { JSONSchema7 } from 'json-schema';
21
+ import { Configuration,
22
+ <%= it.doctype.toUpperCase()%>Api,
23
+ <%= it.typename%> ,
24
+ <%Object.keys(it.schema).forEach(function(key){%>
25
+ <% if(typeof it.schema[key]=='string' || (Array.isArray(it.schema[key]) && typeof it.schema[key][0]=='string' && it.schema[key][0]!='string')){%>
26
+ <%= it.schema[key] %>,
27
+ <%} else {%>
28
+ /*<%~ key + JSON.stringify(it.schema[key]) %>,*/
29
+ <%} %>
30
+ <%})%>
31
+
32
+ } from '../openapi';
33
+
34
+ export type {
35
+ <%= it.typename%> ,
36
+ <%Object.keys(it.schema).forEach(function(key){%>
37
+ <% if(typeof it.schema[key]=='string' || (Array.isArray(it.schema[key]) && typeof it.schema[key][0]=='string' && it.schema[key][0]!='string')){%>
38
+ <%= it.schema[key] %>,
39
+ <%} else {%>
40
+ /*<%~ key + JSON.stringify(it.schema[key]) %>,*/
41
+ <%} %>
42
+ <%})%>
43
+
44
+ } from '../openapi'
45
+
46
+ export class <%= it.typename%>Client extends SimpleAppClient<<%= it.typename%>,<%= it.doctype.toUpperCase()%>Api>{
47
+ public readonly schema= <%~ JSON.stringify(it.jsonschema) %>;
48
+ protected documentIdentityCode='<%~ it.autocompletecode %>'
49
+ protected documentIdentityName='<%~ it.autocompletename %>'
50
+ constructor() {
51
+ const {$event,$listen,$axios}=useNuxtApp()
52
+ let xorg = useRoute().params.xorg
53
+ if(!xorg){
54
+ xorg='MC0wLTA' //0-0-0
55
+ }
56
+
57
+ const apipath = `${useRuntimeConfig().public.API_URL}/${xorg}`
58
+ const apiobj = new <%= it.doctype.toUpperCase()%>Api(undefined,apipath,$axios)
59
+ super(apiobj,'<%= it.doctype %>','<%=it.name %>')
60
+ this.event=$event
61
+ this.listen=$listen
62
+
63
+ this.setNew();
64
+ watch((this.getData()),(newvalue)=>{
65
+ //console.log("Something change",this.completeformula)
66
+ if(this.completeformula==true){
67
+ // console.log("Trigger caclculate")
68
+ this.completeformula=false
69
+ this.reCalculateValue()
70
+ this.completeformula=true
71
+ }else{
72
+ //console.log("avoid unlimited loop")
73
+ }
74
+ })
75
+
76
+ }
77
+ setNew = ()=>{
78
+
79
+
80
+ const newdata = Default<%= it.typename%>(crypto.randomUUID())
81
+ this.setData(newdata)
82
+ }
83
+
84
+ <%Object.keys(it.jsonschema.properties).forEach(function(key) { %>
85
+ <% let obj=it.jsonschema.properties[key] %>
86
+
87
+ <% if(obj.type=='array' && obj.items.type=='object' && obj.items['properties']){ %>
88
+ <%let tablefields = Object.keys(obj.items.properties) %>
89
+ public add<%=key%> = () => {
90
+
91
+ this.getReactiveData().value.<%= key %>.push(Default<%= it.typename%><%=capitalizeFirstLetter(key)%>(crypto.randomUUID()))
92
+ }
93
+
94
+
95
+ <%}%>
96
+ <%})%>
97
+
98
+ /*****************************x-document-api code*****************************************/
99
+
100
+ <%for(let i=0;i<it.apiSettings.length;i++){%>
101
+ <% let api = it.apiSettings[i] %>
102
+ async <%=api.action%>(<% if(api.entrypoint && api.entrypoint.includes(':')) {%>
103
+ <%let subpath = api.entrypoint.split('/')%>
104
+ <% for(let a=0;a<subpath.length;a++){%>
105
+ <%const partstr = subpath[a]%>
106
+ <%if(partstr.includes(':')){%>
107
+ <% const paraname = partstr.replace(':','') %>
108
+ <%=paraname%>: string,
109
+ <%}%>
110
+ <%}%>
111
+ <%}%>){
112
+ //const recordid: string = this.data.value._id ?? '';
113
+ return await this.docapi.<%=api.action%>(
114
+ <% if(api.entrypoint && api.entrypoint.includes(':')) {%>
115
+ <%let subpath = api.entrypoint.split('/')%>
116
+ <% for(let a=0;a<subpath.length;a++){%>
117
+ <%const partstr = subpath[a]%>
118
+ <%if(partstr.includes(':')){%>
119
+ <% const paraname = partstr.replace(':','') %>
120
+ <%=paraname%>,
121
+ <%}%>
122
+ <%}%>
123
+ <%}%>
124
+ )
125
+ .then((res: AxiosResponse) => {
126
+ if(this.event){this.event('info:<%=api.action%>',res.data)}
127
+ return res.data;
128
+ }).catch((res:any)=>{
129
+ if(this.event){this.event('error:<%=api.action%>',res)}
130
+ return Promise.reject(res)
131
+ });
132
+ }
133
+ <%}%>
134
+
135
+
136
+
137
+ reCalculateValue(){
138
+ console.log('trigger new recalculate')
139
+ const data = this.getData()
140
+
141
+ <%Object.keys(it.jsonschema.properties).forEach(function(key) { %>
142
+ <%let obj = it.jsonschema.properties[key]%>
143
+ <%if(obj['x-compute']){%> //x-compute first level field
144
+
145
+ data.<%=key%> = <%= obj['x-compute'].function %>(
146
+ <% if(obj['x-compute'].paramters){ %>
147
+ <% let p = obj['x-compute'].paramters %>
148
+ <%for(let j=0; j<p.length; j++){%>
149
+ <%= p[j].replace('@data','data') %>,
150
+ <%}%>
151
+ <%}%>
152
+ )
153
+ <%}%>
154
+ <%if(obj.type=='array' && obj.items.type=='object'){%>
155
+ // process compute for 2nd level sub tables
156
+ for(let index=0;index<data.<%=key%>.length;index++){
157
+ <%Object.keys(obj.items.properties).forEach(function(subkey) { %>
158
+ <%let subobj = obj.items.properties[subkey]%>
159
+ <%if(subobj['x-compute']){%>
160
+
161
+ data.<%=key%>[index].<%=subkey%> = <%= subobj['x-compute'].function %>(
162
+ <% if(subobj['x-compute'].paramters){ %>
163
+ <% let subp = subobj['x-compute'].paramters %>
164
+ <%for(let k=0; k<subp.length; k++){%>
165
+ <%= subp[k].replace('@data','data').replace('@index','index') %>,
166
+ <%}%>
167
+ <%}%>
168
+ )
169
+ <%}%>
170
+
171
+ <% if(subobj.type=='array' && subobj.items && subobj.items.type=='object'){ %>
172
+ // process compute for 3rd level sub tables
173
+ for(let index2=0;index<data.<%=key%>[index].length;index2++){
174
+ <%Object.keys(subobj.items.properties).forEach(function(sub2key) { %>
175
+ <%let sub2obj = subobj.items.properties[sub2key]%>
176
+ <%if(sub2obj['x-compute']){%> //x-compute 3rd level field
177
+ data.<%=key%>[index].<%=subkey%>[index2].<%=sub2key%> = <%= sub2obj['x-compute'].function %>(
178
+ <% if(sub2obj['x-compute'].paramters){ %>
179
+ <% let sub2p = sub2obj['x-compute'].paramters %>
180
+ <%for(let l=0; l<sub2p.length; l++){%>
181
+ <%= sub2p[l].replace('@data','data').replace('@index','index').replace('@index2','index2') %>,
182
+ <%}%>
183
+ <%}%>
184
+ )
185
+ <%}%>
186
+ <%if(sub2obj.type=='array' && sub2obj.items && sub2obj.items.type=='object'){%>
187
+ // process compute for 4rd level sub tables
188
+ for(let index3=0;index<data.<%=key%>[index].<%=subkey%>[index2].length;index3++){
189
+ <%Object.keys(sub2obj.items.properties).forEach(function(sub3key) { %>
190
+ <%let sub3obj = sub2obj.items.properties[sub3key]%>
191
+ <%if(sub3obj['x-compute']){%> //x-compute 4th level field
192
+ data.<%=key%>[index].<%=subkey%>[index2].<%=sub2key%>.[index3].<%=sub3key%> = <%= sub3obj['x-compute'].function %>(
193
+ <% if(sub3obj['x-compute'].paramters){ %>
194
+ <% let sub3p = sub3obj['x-compute'].paramters %>
195
+ <%for(let m=0; m<sub3p.length; m++){%>
196
+ <%= subp[m].replace('@data','data').replace('@index','index').replace('@index2','index2').replace('@index3','index3') %>,
197
+ <%}%>
198
+ <%}%>
199
+ )
200
+ <%}%>
201
+
202
+ <%})%>
203
+ <%} /* process compute for 4rd level sub tables */%>
204
+ <%})%>
205
+ }
206
+ <%} // process compute for 3rd level sub tables%>
207
+ <%}) %>
208
+ }
209
+ <%} /*process compute for 2nd level sub tables*/%>
210
+ <%}) %>
211
+ }
212
+ }
@@ -0,0 +1,31 @@
1
+ LOGGER="error,warn,fatal,log"
2
+ DRYRUN=false
3
+ PROJECT_NAME=SimpleApp Demo1
4
+ PROJECT_DESCRIPTION=Try CRUD
5
+ PROJECT_Version=1.0.0
6
+ MONGODB_URL=<%=it.configs.mongoConnectStr%>
7
+
8
+ HTTP_PORT=<%=it.configs.backendPort%>
9
+
10
+ BPMN_HOST=<%=it.configs.bpmnsetting.bpmnHost%>
11
+
12
+ BPMN_PORT=<%=it.configs.bpmnsetting.bpmnPort%>
13
+
14
+ BPMN_API_KEY=<%=it.configs.bpmnsetting.bpmnApiKey%>
15
+
16
+ OAUTH2_BASEURL=<%=it.configs.oauthSetting.oauthBaseUrl%>
17
+
18
+ OAUTH2_REALM=<%=it.configs.oauthSetting.oauthRealm%>
19
+
20
+ OAUTH2_CONFIGURL=<%=it.configs.oauthSetting.oauthRealmUrl%>
21
+
22
+ OAUTH2_CLIENTID=<%=it.configs.oauthSetting.oauthClient%>
23
+
24
+ OAUTH2_CLIENTSECRET=<%=it.configs.oauthSetting.oauthClientSecret%>
25
+
26
+ OAUTH2_ADMINROLE = <%=it.configs.oauthSetting.adminRole%>
27
+
28
+ AUTH_SECRET_KEY=<%=it.configs.oauthSetting.oauthAuthSecretKey%>
29
+
30
+ AUTH_ORIGIN=http://localhost:8080
31
+
@@ -0,0 +1,40 @@
1
+ # compiled output
2
+ /dist
3
+ /node_modules
4
+ /public_html
5
+ /src/simpleapp/generate
6
+ /src/app.module.ts
7
+ /src/app.service.ts
8
+ /src/app.controller.ts
9
+ /src/main.ts
10
+ # Logs
11
+ logs
12
+ *.log
13
+ npm-debug.log*
14
+ pnpm-debug.log*
15
+ yarn-debug.log*
16
+ yarn-error.log*
17
+ lerna-debug.log*
18
+
19
+ # OS
20
+ .DS_Store
21
+
22
+ # Tests
23
+ /coverage
24
+ /.nyc_output
25
+
26
+ # IDEs and editors
27
+ /.idea
28
+ .project
29
+ .classpath
30
+ .c9/
31
+ *.launch
32
+ .settings/
33
+ *.sublime-workspace
34
+
35
+ # IDE - VSCode
36
+ .vscode/*
37
+ !.vscode/settings.json
38
+ !.vscode/tasks.json
39
+ !.vscode/launch.json
40
+ !.vscode/extensions.json
@@ -0,0 +1,19 @@
1
+ import { Controller, Get,Logger } from '@nestjs/common';
2
+ import { AppService } from './app.service';
3
+
4
+ @Controller()
5
+ export class AppController {
6
+ private logger = new Logger()
7
+ constructor(private readonly appService: AppService) {
8
+ if(process.env.DRYRUN=='true'){
9
+ this.logger.warn("DRY run Mode, transaction will roll back")
10
+ }
11
+
12
+
13
+ }
14
+
15
+ @Get()
16
+ async getHello() {
17
+ return 'hello'
18
+ }
19
+ }
@@ -0,0 +1,77 @@
1
+ import { Module, MiddlewareConsumer, NestModule } from '@nestjs/common';
2
+ import { MongooseModule,MongooseModuleOptions } from '@nestjs/mongoose';
3
+ import { APP_GUARD,APP_INTERCEPTOR,APP_FILTER } from '@nestjs/core';
4
+ import { ResponseInterceptor } from './simpleapp/generate/commons/interceptors/response.interceptor'
5
+ import {
6
+ AuthGuard,
7
+ KeycloakConnectModule,
8
+ ResourceGuard,
9
+ TokenValidation,
10
+ RoleGuard,
11
+ PolicyEnforcementMode,
12
+ } from 'nest-keycloak-connect';
13
+ import {RolesGuard} from './simpleapp/generate/commons/roles/roles.guard'
14
+ import { ConfigModule } from '@nestjs/config';
15
+ import { ServeStaticModule } from '@nestjs/serve-static';
16
+ import { join } from 'path';
17
+ import { TenantMiddleware } from './simpleapp/generate/commons/middlewares/tenant.middleware';
18
+ import { AppController } from './app.controller';
19
+ import { AppService } from './app.service';
20
+ import {GenerateModule} from './simpleapp/simpleapp.module'
21
+ import { UserMongoSchema } from './simpleapp/generate/models/user.model';
22
+ import { PermissionMongoSchema } from './simpleapp/generate/models/perm.model';
23
+
24
+ @Module({
25
+ //define environment variables: MONGODB_URL='mongodb://<user>:<pass>@<host>:<port>/<db>?authMechanism=DEFAULT'
26
+ imports: [
27
+ ConfigModule.forRoot(),
28
+ MongooseModule.forRoot(process.env.MONGODB_URL,{}),
29
+ ServeStaticModule.forRoot({
30
+ rootPath: join(__dirname, '..', 'public_html'),
31
+ exclude: ['/api/(.*)'],
32
+ }),
33
+ KeycloakConnectModule.register({
34
+ authServerUrl: process.env.OAUTH2_BASEURL,
35
+ realm: process.env.OAUTH2_REALM,
36
+ clientId: process.env.OAUTH2_CLIENTID,
37
+ secret: process.env.OAUTH2_CLIENTSECRET,
38
+ policyEnforcement: PolicyEnforcementMode.PERMISSIVE,
39
+ tokenValidation: TokenValidation.ONLINE,
40
+ }),
41
+ GenerateModule,
42
+ MongooseModule.forFeature([
43
+ { name: 'User', schema: UserMongoSchema },
44
+ { name: 'Permission', schema: PermissionMongoSchema },
45
+ ])
46
+ ],
47
+ controllers: [AppController],
48
+ providers: [
49
+ AppService,
50
+ {
51
+ provide: APP_GUARD,
52
+ useClass: AuthGuard,
53
+ },
54
+ {
55
+ provide: APP_GUARD,
56
+ useClass: ResourceGuard,
57
+ },
58
+ {
59
+ provide: APP_GUARD,
60
+ useClass: RolesGuard, //use simpleapp own roleguard
61
+ },
62
+ {
63
+ provide: APP_INTERCEPTOR,
64
+ useClass: ResponseInterceptor,
65
+ },
66
+ ],
67
+ })
68
+ export class AppModule implements NestModule {
69
+ configure(consumer: MiddlewareConsumer) {
70
+ consumer
71
+ .apply(TenantMiddleware)
72
+ .exclude('/api-yaml')
73
+ .exclude('/api-json')
74
+ .exclude('/api')
75
+ .forRoutes('*');
76
+ }
77
+ }
@@ -0,0 +1,9 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ // import { Workflow } from './simpleapp/generate/commons/providers/Workflow';
3
+ @Injectable()
4
+ export class AppService {
5
+ async getMyTask() {
6
+ // return await Workflow.getInstance().getMyUserTask()
7
+ return "ok"
8
+ }
9
+ }
@@ -0,0 +1,58 @@
1
+ import { NestFactory } from '@nestjs/core';
2
+ import { AppModule } from './app.module';
3
+ import { SimpleAppExceptionFilter } from './simpleapp/generate/commons/exceptions/SimpleAppExceptionFilter';
4
+ import { HttpAdapterHost } from '@nestjs/core';
5
+
6
+ import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
7
+ import {writeFileSync} from 'fs';
8
+ import { LogLevel } from '@nestjs/common';
9
+ const yaml = require('yaml');
10
+
11
+ async function bootstrap() {
12
+ const logs:LogLevel[] = String(process.env.LOGGER).split(',') as LogLevel[]
13
+ const app = await NestFactory.create(AppModule, {
14
+ logger: logs,
15
+ });
16
+
17
+ // app.enableCors();
18
+ const httpAdapter = app.get(HttpAdapterHost);
19
+ app.useGlobalFilters(new SimpleAppExceptionFilter(httpAdapter));
20
+
21
+ const config = new DocumentBuilder()
22
+ .setTitle(process.env.PROJECT_NAME)
23
+ .setDescription(process.env.PROJECT_DESCRIPTION)
24
+ .setVersion(process.env.PROJECT_VERSION)
25
+ .addApiKey(
26
+ {
27
+ in: 'header',
28
+ name: 'x-org',
29
+ type: 'apiKey',
30
+ description: 'base 64 url encode. example: MS0xLTE',
31
+ },
32
+ 'x-org',
33
+ )
34
+ .addOAuth2(
35
+ {
36
+ type: 'oauth2',
37
+ flows: {
38
+ implicit: {
39
+ authorizationUrl: `${process.env.OAUTH2_CONFIGURL}/protocol/openid-connect/auth`,
40
+ scopes: {},
41
+ },
42
+ },
43
+ },
44
+ 'oauth2',
45
+ )
46
+ .addSecurityRequirements('x-org')
47
+ .addSecurityRequirements('oauth2')
48
+ .build();
49
+ const document = SwaggerModule.createDocument(app, config);
50
+ SwaggerModule.setup('api', app, document, {
51
+ swaggerOptions: { showExtensions: true, persistAuthorization: true },
52
+ });
53
+
54
+ writeFileSync('./openapi.yaml', yaml.stringify(document));
55
+
56
+ await app.listen(process.env.HTTP_PORT ?? 8000); //listen which port
57
+ }
58
+ bootstrap();
@@ -0,0 +1,16 @@
1
+
2
+ import { ApiProperty } from '@nestjs/swagger';
3
+
4
+
5
+ export class ApiKeyValuePair {
6
+ @ApiProperty({"type":Object,"required":false,"examples":['{"field1":"1"}'],"default":""} )
7
+ field1: any
8
+ }
9
+ export class ApiSearchBody{
10
+ @ApiProperty({"type":Object,"required":false,"examples":['{"field1":"1"}'],"default":[{"field1":"ok","field2":true,}]} )
11
+ filter: Object;
12
+ @ApiProperty({"type":[Object],"required":true,"examples":['["field1","field2"]'],"default":[["field1","field2"]]} )
13
+ fields: [Object];
14
+ @ApiProperty({"type":()=>[Object],"required":true,"examples":['[{"field1":"asc"}]'],"default":[[{"field1":"asc"}]]} )
15
+ sorts: [Object];
16
+ }
@@ -0,0 +1,8 @@
1
+ import { createParamDecorator, ExecutionContext } from '@nestjs/common';
2
+
3
+ export const AppUser = createParamDecorator(
4
+ (data: unknown, ctx: ExecutionContext) => {
5
+ const request = ctx.switchToHttp().getRequest();
6
+ return request['sessionuser'];
7
+ },
8
+ );