@simitgroup/simpleapp-generator 1.6.7-o-alpha → 2.0.0-a-alpha

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 (305) hide show
  1. package/ReleaseNote.md +4 -0
  2. package/dist/buildinschemas/autoincreament.js +1 -1
  3. package/dist/buildinschemas/branch.d.ts.map +1 -1
  4. package/dist/buildinschemas/branch.js +2 -0
  5. package/dist/buildinschemas/branch.js.map +1 -1
  6. package/dist/buildinschemas/docnoformat.js +1 -1
  7. package/dist/buildinschemas/docnoformat.js.map +1 -1
  8. package/dist/buildinschemas/documentevent.js +1 -1
  9. package/dist/buildinschemas/documentnoformat.d.ts +3 -0
  10. package/dist/buildinschemas/documentnoformat.d.ts.map +1 -0
  11. package/dist/buildinschemas/documentnoformat.js +58 -0
  12. package/dist/buildinschemas/documentnoformat.js.map +1 -0
  13. package/dist/buildinschemas/index.d.ts +0 -5
  14. package/dist/buildinschemas/index.d.ts.map +1 -1
  15. package/dist/buildinschemas/index.js +5 -11
  16. package/dist/buildinschemas/index.js.map +1 -1
  17. package/dist/buildinschemas/organization.d.ts.map +1 -1
  18. package/dist/buildinschemas/organization.js +3 -19
  19. package/dist/buildinschemas/organization.js.map +1 -1
  20. package/dist/buildinschemas/user.d.ts.map +1 -1
  21. package/dist/buildinschemas/user.js +5 -2
  22. package/dist/buildinschemas/user.js.map +1 -1
  23. package/dist/generate.d.ts.map +1 -1
  24. package/dist/generate.js +118 -23
  25. package/dist/generate.js.map +1 -1
  26. package/dist/type.d.ts +6 -0
  27. package/dist/type.d.ts.map +1 -1
  28. package/dist/type.js.map +1 -1
  29. package/package.json +1 -1
  30. package/src/buildinschemas/{autoincreament.ts → autoincreament.ts.backup} +1 -1
  31. package/src/buildinschemas/branch.ts +2 -0
  32. package/src/buildinschemas/{documentevent.ts → documentevent.ts.backup} +1 -1
  33. package/src/buildinschemas/{docnoformat.ts → documentnoformat.ts.backup} +3 -3
  34. package/src/buildinschemas/index.ts +4 -5
  35. package/src/buildinschemas/organization.ts +3 -19
  36. package/src/buildinschemas/user.ts +5 -2
  37. package/src/generate.ts +128 -28
  38. package/src/type.ts +6 -1
  39. package/templates/basic/nest/api.controller.ts.eta +153 -0
  40. package/templates/basic/nest/api.module.ts.eta +32 -0
  41. package/templates/basic/nest/api.resolver.ts.eta +94 -0
  42. package/templates/basic/nest/api.schema.ts.eta +20 -0
  43. package/templates/basic/nest/api.service.ts.eta +85 -0
  44. package/templates/basic/nest/controller.ts.eta +18 -119
  45. package/templates/basic/nest/default.ts.eta +16 -10
  46. package/templates/basic/nest/enum.ts.eta +16 -0
  47. package/templates/basic/nest/model.ts.eta +6 -28
  48. package/templates/basic/nest/module.ts.eta +25 -0
  49. package/templates/basic/nest/resolver.ts.eta +12 -56
  50. package/templates/basic/nest/schema.ts.eta +133 -0
  51. package/templates/basic/nest/service.ts.eta +82 -73
  52. package/templates/basic/nest/service.ts.eta-backup +50 -0
  53. package/templates/basic/nuxt/default.ts.eta +10 -8
  54. package/templates/basic/nuxt/pages.[id].vue.eta +2 -2
  55. package/templates/basic/nuxt/pages.form.vue.eta +2 -2
  56. package/templates/basic/nuxt/pages.viewer.vue.eta +2 -2
  57. package/templates/basic/nuxt/simpleapp.doc.ts.eta +1 -1
  58. package/templates/basic/nuxt/simpleapp.generate.client.ts.eta +7 -5
  59. package/templates/nest/src/app.module.ts._eta +53 -69
  60. package/templates/nest/src/main.ts._eta +1 -1
  61. package/templates/nest/src/simple-app/.core/features/auth/api-key/api-key.service.ts.eta +29 -0
  62. package/templates/nest/src/simple-app/.core/features/auth/api-key/api-key.type.ts.eta +5 -0
  63. package/templates/nest/src/simple-app/.core/features/auth/api-key/validators/interface.ts.eta +7 -0
  64. package/templates/nest/src/simple-app/.core/features/auth/api-key/validators/mini-api-key.validator.ts.eta +30 -0
  65. package/templates/nest/src/simple-app/.core/features/auth/api-key/validators/static-api-key.validator.ts.eta +27 -0
  66. package/templates/nest/src/simple-app/.core/features/auth/auth.module.ts.eta +9 -0
  67. package/templates/nest/src/{simpleapp/generate/commons/roles → simple-app/.core/features/auth/role-guard}/roles.enum.ts.eta +7 -7
  68. package/templates/nest/src/{simpleapp/generate/commons/roles → simple-app/.core/features/auth/role-guard}/roles.guard.ts.eta +1 -1
  69. package/templates/nest/src/simple-app/.core/features/auto-increament/auto-increament.model.ts.eta +10 -0
  70. package/templates/nest/src/simple-app/.core/features/auto-increament/auto-increament.module.ts.eta +18 -0
  71. package/templates/nest/src/simple-app/.core/features/auto-increament/auto-increament.schema.ts.eta +119 -0
  72. package/templates/nest/src/simple-app/.core/features/auto-increament/auto-increament.service.ts.eta +65 -0
  73. package/templates/nest/src/simple-app/.core/features/cron/base/cron.base.ts.eta +13 -0
  74. package/templates/nest/src/simple-app/.core/features/cron/cron-system/cron-system.module.ts.eta +17 -0
  75. package/templates/nest/src/simple-app/.core/features/cron/cron-system/cron-system.service.ts.eta +37 -0
  76. package/templates/nest/src/simple-app/.core/features/cron/cron-system/schemas/index.ts.eta +2 -0
  77. package/templates/nest/src/simple-app/.core/features/cron/cron.module.ts.eta +10 -0
  78. package/templates/nest/src/simple-app/.core/features/document-no-format/document-no-format.controller.ts.eta +31 -0
  79. package/templates/nest/src/simple-app/.core/features/document-no-format/document-no-format.model.ts.eta +15 -0
  80. package/templates/nest/src/simple-app/.core/features/document-no-format/document-no-format.module.ts.eta +12 -0
  81. package/templates/nest/src/simple-app/.core/features/document-no-format/document-no-format.schema.ts.eta +162 -0
  82. package/templates/nest/src/simple-app/.core/features/document-no-format/document-no-format.service.ts.eta +189 -0
  83. package/templates/nest/src/simple-app/.core/features/event/event.module.ts.eta +9 -0
  84. package/templates/nest/src/simple-app/.core/features/event/event.type.ts.eta +23 -0
  85. package/templates/nest/src/simple-app/.core/features/event/interface/event-after-create.interface.ts.eta +5 -0
  86. package/templates/nest/src/simple-app/.core/features/event/interface/event-after-delete.interface.ts.eta +5 -0
  87. package/templates/nest/src/simple-app/.core/features/event/interface/event-after-set-status.interface.ts.eta +5 -0
  88. package/templates/nest/src/simple-app/.core/features/event/interface/event-after-update.interface.ts.eta +5 -0
  89. package/templates/nest/src/simple-app/.core/features/event/interface/event-before-create.interface.ts.eta +5 -0
  90. package/templates/nest/src/simple-app/.core/features/event/interface/event-before-delete.interface.ts.eta +5 -0
  91. package/templates/nest/src/simple-app/.core/features/event/interface/event-before-set-status.interface.ts.eta +5 -0
  92. package/templates/nest/src/simple-app/.core/features/event/interface/event-before-update.interface.ts.eta +5 -0
  93. package/templates/nest/src/simple-app/.core/features/event/interface/index.ts.eta +8 -0
  94. package/templates/nest/src/simple-app/.core/features/foreign-key/foreign-key.module.ts.eta +16 -0
  95. package/templates/nest/src/simple-app/.core/features/log/log.module.ts.eta +20 -0
  96. package/templates/nest/src/simple-app/.core/features/log/log.service.ts.eta +68 -0
  97. package/templates/nest/src/simple-app/.core/features/log/schemas/api-event.schema.ts.eta +57 -0
  98. package/templates/nest/src/simple-app/.core/features/log/schemas/document-event.schema.ts.eta +87 -0
  99. package/templates/nest/src/simple-app/.core/features/log/schemas/index.ts.eta +2 -0
  100. package/templates/nest/src/simple-app/.core/features/maintenance/maintenance.controller.ts.eta +84 -0
  101. package/templates/nest/src/simple-app/.core/features/maintenance/maintenance.module.ts.eta +19 -0
  102. package/templates/nest/src/simple-app/.core/features/maintenance/maintenance.service.ts.eta +86 -0
  103. package/templates/nest/src/simple-app/.core/features/maintenance/schemas/environment.ts.eta +23 -0
  104. package/templates/nest/src/{simpleapp/maintenance/apischemas → simple-app/.core/features/maintenance/schemas}/index.ts.eta +1 -1
  105. package/templates/nest/src/simple-app/.core/features/mini-app/developer-portal/developer-portal-bridge.service.ts.eta.eta +31 -0
  106. package/templates/nest/src/simple-app/.core/features/mini-app/developer-portal/developer-portal-env-development.service.ts.eta +124 -0
  107. package/templates/nest/src/simple-app/.core/features/mini-app/developer-portal/developer-portal-env-production.service.ts.eta +50 -0
  108. package/templates/nest/src/simple-app/.core/features/mini-app/developer-portal/developer-portal.controller.ts.eta +41 -0
  109. package/templates/nest/src/simple-app/.core/features/mini-app/developer-portal/developer-portal.schema.ts.eta +18 -0
  110. package/templates/nest/src/simple-app/.core/features/mini-app/developer-portal/developer-portal.service.ts.eta +94 -0
  111. package/templates/nest/src/simple-app/.core/features/mini-app/developer-portal/dto/developer-portal-create-app.dto.ts.eta +22 -0
  112. package/templates/nest/src/simple-app/.core/features/mini-app/developer-portal/dto/developer-portal-publish-app.dto.ts.eta +0 -0
  113. package/templates/nest/src/simple-app/.core/features/mini-app/dto/imports.ts.eta +2 -0
  114. package/templates/nest/src/simple-app/.core/features/mini-app/dto/index.ts.eta +2 -0
  115. package/templates/nest/src/simple-app/.core/features/mini-app/dto/mini-app.ts.eta +55 -0
  116. package/templates/nest/src/simple-app/.core/features/mini-app/mini-app-manager/mini-app-manager-bridge.service.ts.eta +162 -0
  117. package/templates/nest/src/simple-app/.core/features/mini-app/mini-app-manager/mini-app-manager-env-development.service.ts.eta +140 -0
  118. package/templates/nest/src/simple-app/.core/features/mini-app/mini-app-manager/mini-app-manager-env-production.service.ts.eta +125 -0
  119. package/templates/nest/src/simple-app/.core/features/mini-app/mini-app-manager/mini-app-manager-policy.service.ts.eta +43 -0
  120. package/templates/nest/src/simple-app/.core/features/mini-app/mini-app-manager/mini-app-manager.controller.ts.eta +81 -0
  121. package/templates/nest/src/simple-app/.core/features/mini-app/mini-app-manager/mini-app-manager.enum.ts.eta +5 -0
  122. package/templates/nest/src/simple-app/.core/features/mini-app/mini-app-manager/mini-app-manager.error.ts.eta +24 -0
  123. package/templates/nest/src/simple-app/.core/features/mini-app/mini-app-manager/mini-app-manager.processor.ts.eta +309 -0
  124. package/templates/nest/src/simple-app/.core/features/mini-app/mini-app-manager/mini-app-manager.service.ts.eta +346 -0
  125. package/templates/nest/src/simple-app/.core/features/mini-app/mini-app-scope/mini-app-scope.decorator.ts.eta +5 -0
  126. package/templates/nest/src/simple-app/.core/features/mini-app/mini-app-scope/mini-app-scope.guard.ts.eta +43 -0
  127. package/templates/nest/src/simple-app/.core/features/mini-app/mini-app-scope/mini-app-scope.service.ts.eta +101 -0
  128. package/templates/nest/src/simple-app/.core/features/mini-app/mini-app.module.ts.eta +24 -0
  129. package/templates/nest/src/simple-app/.core/features/mini-app/types/miniApp.ts.eta +23 -0
  130. package/templates/nest/src/simple-app/.core/features/mini-app/utils/mini-app.util.ts.eta +26 -0
  131. package/templates/nest/src/simple-app/.core/features/policy/policy.module.ts.eta +12 -0
  132. package/templates/nest/src/simple-app/.core/features/policy/policy.service.ts.eta +45 -0
  133. package/templates/nest/src/{simpleapp/profile/profile.controller.ts._eta → simple-app/.core/features/profile/profile.controller.ts.eta} +37 -83
  134. package/templates/nest/src/simple-app/.core/features/profile/profile.module.ts.eta +22 -0
  135. package/templates/nest/src/simple-app/.core/features/profile/profile.schema.ts.eta +165 -0
  136. package/templates/nest/src/{simpleapp/profile/profile.service.ts._eta → simple-app/.core/features/profile/profile.service.ts.eta} +36 -48
  137. package/templates/nest/src/simple-app/.core/features/queue/queue-base/queue-base.consumer.ts.eta +196 -0
  138. package/templates/nest/src/simple-app/.core/features/queue/queue-base/queue-base.producer.ts.eta +147 -0
  139. package/templates/nest/src/simple-app/.core/features/queue/queue-user-context/queue-user-context.service.ts.eta +35 -0
  140. package/templates/nest/src/simple-app/.core/features/queue/queue.module.ts.eta +24 -0
  141. package/templates/nest/src/simple-app/.core/features/queue/queue.type.ts.eta +75 -0
  142. package/templates/nest/src/simple-app/.core/features/simple-app-core-features.module.ts.eta +51 -0
  143. package/templates/nest/src/{simpleapp/generate/commons/robotuser.service.ts.eta → simple-app/.core/features/user-context/robot-user.service.ts.eta} +27 -16
  144. package/templates/nest/src/simple-app/.core/features/user-context/user-context.module.ts.eta +24 -0
  145. package/templates/nest/src/simple-app/.core/features/user-context/user-context.type.ts.eta +15 -0
  146. package/templates/nest/src/{simpleapp/generate/commons → simple-app/.core/features/user-context}/user.context.ts.eta +469 -449
  147. package/templates/nest/src/{simpleapp/generate/commons/runwebhook.service.ts.eta → simple-app/.core/features/webhook/run-webhook.service.ts.eta} +7 -11
  148. package/templates/nest/src/simple-app/.core/features/webhook/schemas/index.ts.eta +2 -0
  149. package/templates/nest/src/simple-app/.core/features/webhook/schemas/webhook-log.schema.ts.eta +116 -0
  150. package/templates/nest/src/simple-app/.core/features/webhook/schemas/webhook.schema.ts.eta +177 -0
  151. package/templates/nest/src/simple-app/.core/features/webhook/webhook.module.ts.eta +20 -0
  152. package/templates/nest/src/{simpleapp/generate/controllers/simpleapp.controller.ts.eta → simple-app/.core/framework/base/simple-app.controller.ts.eta} +13 -35
  153. package/templates/nest/src/{simpleapp/generate/processors/simpleapp.processor.ts.eta → simple-app/.core/framework/base/simple-app.service.ts.eta} +239 -139
  154. package/templates/nest/src/simple-app/.core/framework/custom-exception.ts.eta +26 -0
  155. package/templates/nest/src/simple-app/.core/framework/framework.module.ts.eta +12 -0
  156. package/templates/nest/src/simple-app/.core/framework/schemas/index.ts.eta +3 -0
  157. package/templates/nest/src/simple-app/.core/framework/schemas/others.schema.ts.eta +153 -0
  158. package/templates/nest/src/simple-app/.core/framework/schemas/simple-app.schema.ts.eta +172 -0
  159. package/templates/nest/src/{simpleapp/generate/commons/interceptors/response.interceptor.ts.eta → simple-app/.core/framework/simple-app.interceptor.ts.eta} +12 -22
  160. package/templates/nest/src/{simpleapp/generate/commons/middlewares/tenant.middleware.ts.eta → simple-app/.core/framework/simple-app.middleware.ts.eta} +28 -26
  161. package/templates/nest/src/simple-app/.core/readme.md.eta +3 -0
  162. package/templates/nest/src/simple-app/.core/resources/core-resources.module.ts.eta +38 -0
  163. package/templates/nest/src/simple-app/.core/simple-app-core.module.ts.eta +18 -0
  164. package/templates/nest/src/simple-app/.core/utils/dayjs.ts.eta +47 -0
  165. package/templates/nest/src/simple-app/.core/utils/locale-tool.ts.eta +11 -0
  166. package/templates/nest/src/simple-app/.core/utils/string-utils.ts.eta +1 -0
  167. package/templates/nest/src/simple-app/.resources/readme.md.eta +3 -0
  168. package/templates/nest/src/simple-app/.resources/resources.module.ts.eta +36 -0
  169. package/templates/nest/src/simple-app/apis/readme.md.eta +9 -0
  170. package/templates/nest/src/simple-app/apis/resource-api.module.ts.eta +37 -0
  171. package/templates/nest/src/simple-app/events/branch-event/branch-event.module.ts._eta +20 -0
  172. package/templates/nest/src/simple-app/events/branch-event/branch-event.service.ts._eta +43 -0
  173. package/templates/nest/src/simple-app/events/branch-event/branch-event.type.ts._eta +7 -0
  174. package/templates/nest/src/simple-app/events/events.module.ts._eta +17 -0
  175. package/templates/nest/src/simple-app/events/organization-event/organization-event.module.ts._eta +13 -0
  176. package/templates/nest/src/simple-app/events/organization-event/organization-event.service.ts._eta +52 -0
  177. package/templates/nest/src/simple-app/events/organization-event/organization-event.type.ts._eta +1 -0
  178. package/templates/nest/src/simple-app/events/permission-event/permission-event.module.ts.eta +11 -0
  179. package/templates/nest/src/simple-app/events/permission-event/permission-event.service.ts.eta +33 -0
  180. package/templates/nest/src/simple-app/events/permission-event/permission-event.type.ts.eta +1 -0
  181. package/templates/nest/src/simple-app/events/readme.md.eta +76 -0
  182. package/templates/nest/src/simple-app/events/tenant-event/tenant-event.module.ts_eta +12 -0
  183. package/templates/nest/src/simple-app/events/tenant-event/tenant-event.service.ts_eta +30 -0
  184. package/templates/nest/src/simple-app/events/tenant-event/tenant-event.type.ts_eta +1 -0
  185. package/templates/nest/src/{simpleapp/additional.module.ts._eta → simple-app/features/features.module.ts._eta} +8 -7
  186. package/templates/nest/src/{printapi/printapi.module.ts.eta → simple-app/features/print/print.module.ts.eta} +4 -4
  187. package/templates/nest/src/{printapi/printapi.service.ts.eta → simple-app/features/print/print.service.ts.eta} +7 -7
  188. package/templates/nest/src/simple-app/features/readme.md._eta +6 -0
  189. package/templates/nest/src/simple-app/simple-app.module.ts.eta +32 -0
  190. package/templates/nuxt/.env._eta +2 -0
  191. package/templates/nuxt/app.vue.eta +15 -7
  192. package/templates/nuxt/components/header/HeaderSelectBranch.vue.eta +2 -1
  193. package/templates/nuxt/components/image/ImageAvatar.vue._eta +63 -0
  194. package/templates/nuxt/components/image/ImageOrganization.vue._eta +77 -0
  195. package/templates/nuxt/components/simpleApp/SimpleAppForm.vue.eta +1 -1
  196. package/templates/nuxt/components/simpleApp/SimpleAppFormToolBar.vue._eta +95 -20
  197. package/templates/nuxt/components/user/UserButtonCreateTenant.vue._eta +20 -21
  198. package/templates/nuxt/components/user/UserTenantPicker.vue._eta +1 -1
  199. package/templates/nuxt/composables/docformat.generate.ts.eta +4 -2
  200. package/templates/nuxt/enums/enums.generate.ts.eta +1 -1
  201. package/templates/nuxt/middleware/30.acl.global.ts.eta +6 -6
  202. package/templates/nuxt/nuxt.config.ts._eta +1 -0
  203. package/templates/nuxt/pages/login.vue._eta +21 -15
  204. package/templates/nuxt/pages/profile.vue._eta +24 -32
  205. package/templates/nuxt/plugins/20.simpleapp-userstore.ts.eta +31 -24
  206. package/templates/nuxt/plugins/50.simpleapp-client.ts.eta +2 -2
  207. package/templates/nuxt/providers/my-provider.ts.eta +5 -6
  208. package/templates/nuxt/simpleapp/generate/clients/SimpleAppClient.ts.eta +1 -0
  209. package/templates/nuxt/simpleapp/generate/defaults/index.ts.eta +1 -1
  210. package/templates/nuxt/simpleapp/generate/types/index.ts.eta +1 -1
  211. package/templates/nuxt/types/schema.ts.eta +1 -0
  212. package/templates/nuxt/types/user.ts.eta +39 -38
  213. package/templates/project/build.sh.eta +2 -2
  214. package/templates/basic/nest/apischema.ts.eta +0 -96
  215. package/templates/basic/nest/processor.ts.eta +0 -86
  216. package/templates/nest/src/cloudapi/cloudapi.module.ts._eta +0 -15
  217. package/templates/nest/src/cloudapi/cloudapi.service.ts._eta +0 -15
  218. package/templates/nest/src/enums/enums.generate.ts.eta +0 -23
  219. package/templates/nest/src/simpleapp/apischemas/index.ts._eta +0 -85
  220. package/templates/nest/src/simpleapp/generate/apischemas/index.ts.eta +0 -15
  221. package/templates/nest/src/simpleapp/generate/apischemas/simpleapp.apischema.ts.eta +0 -62
  222. package/templates/nest/src/simpleapp/generate/commons/audittrail.service.ts.eta +0 -52
  223. package/templates/nest/src/simpleapp/generate/commons/customkeycloa.guard.ts.eta +0 -45
  224. package/templates/nest/src/simpleapp/generate/commons/docnogenerator.service.ts.eta +0 -129
  225. package/templates/nest/src/simpleapp/generate/commons/providers/workflow.provider.ts.etax +0 -87
  226. package/templates/nest/src/simpleapp/generate/jsonschemas/index.ts.eta +0 -11
  227. package/templates/nest/src/simpleapp/generate/models/apievent.model.ts.eta +0 -27
  228. package/templates/nest/src/simpleapp/generate/processors/autoinc.processor.ts.eta +0 -88
  229. package/templates/nest/src/simpleapp/generate/processors/branch.processor.ts.eta +0 -110
  230. package/templates/nest/src/simpleapp/generate/processors/docno.processor.ts.eta +0 -77
  231. package/templates/nest/src/simpleapp/generate/processors/org.processor.ts.eta +0 -110
  232. package/templates/nest/src/simpleapp/generate/processors/perm.processor.ts.eta +0 -71
  233. package/templates/nest/src/simpleapp/generate/processors/sysmsg.processor.ts.eta +0 -49
  234. package/templates/nest/src/simpleapp/generate/processors/tenant.processor.ts.eta +0 -52
  235. package/templates/nest/src/simpleapp/generate/processors/webhooklog.processor.ts.eta +0 -45
  236. package/templates/nest/src/simpleapp/generate/types/index.ts.eta +0 -7
  237. package/templates/nest/src/simpleapp/generate/types/schema.type.ts.eta +0 -193
  238. package/templates/nest/src/simpleapp/generate/types/simpleapp.type.ts.eta +0 -299
  239. package/templates/nest/src/simpleapp/generate/types/workflow.type.ts.eta +0 -15
  240. package/templates/nest/src/simpleapp/generate/workflow/formschema/SimpleApproveReject.ts.eta +0 -8
  241. package/templates/nest/src/simpleapp/generate/workflow/formschema/index.ts.eta +0 -7
  242. package/templates/nest/src/simpleapp/generate/workflow/workflow.apischema.ts.eta +0 -136
  243. package/templates/nest/src/simpleapp/generate/workflow/workflow.config.ts.eta +0 -79
  244. package/templates/nest/src/simpleapp/generate/workflow/workflow.controller.ts.eta +0 -414
  245. package/templates/nest/src/simpleapp/generate/workflow/workflow.delegate.ts.eta +0 -201
  246. package/templates/nest/src/simpleapp/generate/workflow/workflow.service.ts.eta +0 -641
  247. package/templates/nest/src/simpleapp/generate/workflow/workflow.type.ts.eta +0 -98
  248. package/templates/nest/src/simpleapp/generate/workflow/workflow.userservice.ts.eta +0 -83
  249. package/templates/nest/src/simpleapp/maintenance/apischemas/environment.ts.eta +0 -11
  250. package/templates/nest/src/simpleapp/maintenance/maintenance.controller.ts.eta +0 -72
  251. package/templates/nest/src/simpleapp/maintenance/maintenance.service.ts.eta +0 -88
  252. package/templates/nest/src/simpleapp/maintenance/models/environment.model.ts.eta +0 -16
  253. package/templates/nest/src/simpleapp/profile/profile.apischema.ts._eta +0 -95
  254. package/templates/nest/src/simpleapp/resolvers/readme.md.eta +0 -1
  255. package/templates/nest/src/simpleapp/services/autoinc.service.ts.etaxx +0 -59
  256. package/templates/nest/src/simpleapp/services/branch.service.ts.etaxxx +0 -83
  257. package/templates/nest/src/simpleapp/services/docno.service.ts.etaxxx +0 -59
  258. package/templates/nest/src/simpleapp/services/org.service.ts.etaxxx +0 -37
  259. package/templates/nest/src/simpleapp/services/perm.service.ts.etaxxx +0 -56
  260. package/templates/nest/src/simpleapp/services/sysmsg.service.ts._etaxxx +0 -43
  261. package/templates/nest/src/simpleapp/services/tenant.service.ts.etaxxx +0 -38
  262. package/templates/nest/src/simpleapp/services/user.service.ts.eta.old +0 -118
  263. package/templates/nest/src/simpleapp/services/userresolver.service.ts._eta +0 -67
  264. package/templates/nest/src/simpleapp/services/webhook.service.ts._eta +0 -37
  265. package/templates/nest/src/simpleapp/simpleapp.module.ts.eta +0 -85
  266. package/templates/nest/src/simpleapp/types/index.ts._eta +0 -45
  267. package/templates/nest/src/simpleapp/webhooks/branch.ts._eta +0 -44
  268. package/templates/nest/src/simpleapp/webhooks/index.ts._eta +0 -21
  269. package/templates/nest/src/simpleapp/workflows/bpmn/readme.md._eta +0 -1
  270. package/templates/nest/src/simpleapp/workflows/listeners/simpleapp.listener.ts.eta +0 -31
  271. package/templates/nest/src/simpleapp/workflows/readme.md._eta +0 -1
  272. package/templates/nuxt/components/image/ImageAvatar.vue.eta +0 -56
  273. package/templates/nuxt/components/image/ImageOrganization.vue.eta +0 -66
  274. /package/src/buildinschemas/{webhook.ts → webhook.ts.backup} +0 -0
  275. /package/src/buildinschemas/{webhooklog.ts → webhooklog.ts.backup} +0 -0
  276. /package/templates/basic/nest/{type.ts.eta → type.ts.eta-backup} +0 -0
  277. /package/templates/nest/src/{simpleapp/generate/commons/customkeycloak.guard.ts.eta → simple-app/.core/features/auth/keycloak/keycloak.guard.ts.eta} +0 -0
  278. /package/templates/nest/src/{simpleapp/generate/commons/roles → simple-app/.core/features/auth/role-guard}/roles.decorator.ts.eta +0 -0
  279. /package/templates/nest/src/{simpleapp/generate/commons/roles → simple-app/.core/features/auth/role-guard}/roles.group.ts.eta +0 -0
  280. /package/templates/nest/src/{simpleapp/generate/commons/dicts/documents.ts.eta → simple-app/.core/features/document-no-format/document.dict.ts.eta} +0 -0
  281. /package/templates/nest/src/{simpleapp/generate/commons/dicts/foreignkeys.ts.eta → simple-app/.core/features/foreign-key/foreignkeys.dict.ts.eta} +0 -0
  282. /package/templates/nest/src/{simpleapp/maintenance/dbupdate → simple-app/.core/features/maintenance/db-update}/1.00.00/index.ts._eta +0 -0
  283. /package/templates/nest/src/{simpleapp/maintenance/dbupdate → simple-app/.core/features/maintenance/db-update}/index.ts._eta +0 -0
  284. /package/templates/nest/src/{simpleapp/maintenance/apischemas/dbupdate.ts.eta → simple-app/.core/features/maintenance/schemas/db-update.ts.eta} +0 -0
  285. /package/templates/nest/src/{simpleapp/profile/profile.types.ts.eta → simple-app/.core/features/profile/profile.types.ts.eta-backup} +0 -0
  286. /package/templates/nest/src/{simpleapp/generate/commons/decorators → simple-app/.core/features/user-context}/appuser.decorator.ts.eta +0 -0
  287. /package/templates/nest/src/{simpleapp/generate/commons/exceptions/SimpleAppExceptionFilter.ts.eta → simple-app/.core/framework/exception-filter.ts.eta} +0 -0
  288. /package/templates/nest/src/{simpleapp/generate/commons → simple-app/.core/utils}/encryption.static.ts.eta +0 -0
  289. /package/templates/nest/src/{simpleapp → simple-app}/.gitignore.eta +0 -0
  290. /package/templates/nest/src/{printapi → simple-app/features/print}/api/.gitignore.eta +0 -0
  291. /package/templates/nest/src/{printapi → simple-app/features/print}/api/.npmignore.eta +0 -0
  292. /package/templates/nest/src/{printapi → simple-app/features/print}/api/.openapi-generator/FILES.eta +0 -0
  293. /package/templates/nest/src/{printapi → simple-app/features/print}/api/.openapi-generator/VERSION.eta +0 -0
  294. /package/templates/nest/src/{printapi → simple-app/features/print}/api/.openapi-generator-ignore.eta +0 -0
  295. /package/templates/nest/src/{printapi → simple-app/features/print}/api/api.ts.eta +0 -0
  296. /package/templates/nest/src/{printapi → simple-app/features/print}/api/base.ts.eta +0 -0
  297. /package/templates/nest/src/{printapi → simple-app/features/print}/api/common.ts.eta +0 -0
  298. /package/templates/nest/src/{printapi → simple-app/features/print}/api/configuration.ts.eta +0 -0
  299. /package/templates/nest/src/{printapi → simple-app/features/print}/api/git_push.sh.eta +0 -0
  300. /package/templates/nest/src/{printapi → simple-app/features/print}/api/index.ts.eta +0 -0
  301. /package/templates/nest/src/{printapi → simple-app/features/print}/api/openapitools.json.eta +0 -0
  302. /package/templates/project/{sharelibs → share-libs}/hello.ts._eta +0 -0
  303. /package/templates/project/{sharelibs → share-libs}/index.ts.eta +0 -0
  304. /package/templates/project/{sharelibs → share-libs}/money.ts.eta +0 -0
  305. /package/templates/project/{sharelibs → share-libs}/validate.ts.eta +0 -0
@@ -0,0 +1,346 @@
1
+ import { BadRequestException, Injectable, NotFoundException } from '@nestjs/common';
2
+
3
+ import { UserContext } from 'src/simple-app/.core/features/user-context/user.context';
4
+ import { CategorizedMiniAppDetail, DynamicParam, InstalledMiniAppDetail, MiniApp, MiniAppDetail, MiniAppInstallation } from '../dto';
5
+ import { MiniAppService } from 'src/simple-app/.core/resources/mini-app/mini-app.service';
6
+
7
+ import { MiniAppEnvEnum, MiniAppStatusEnum } from 'src/simple-app/.core/resources/mini-app/mini-app.enum';
8
+ import { MiniAppInstallationService } from 'src/simple-app/.core/resources/mini-app-installation/mini-app-installation.service';
9
+ import _ from 'lodash';
10
+ import { MiniAppManagerPolicyService } from './mini-app-manager-policy.service';
11
+ import { MiniAppError } from './mini-app-manager.error';
12
+
13
+ @Injectable()
14
+ export class MiniAppManagerService {
15
+ constructor(
16
+ private readonly miniAppService: MiniAppService,
17
+ private readonly miniAppInstallationService: MiniAppInstallationService,
18
+ private readonly policyService: MiniAppManagerPolicyService,
19
+ ) {}
20
+
21
+ // ==================================== API Function ====================================
22
+
23
+ async runInstallMiniApp(appUser: UserContext, miniAppCode: string) {
24
+ this.assertHasMiniAppFeature(appUser);
25
+
26
+ const miniApp = await this.findMiniAppOrFail(appUser, miniAppCode);
27
+
28
+ this.assertPrivateAppPermission(appUser, miniApp);
29
+
30
+ this.assertHasRequiredPlan(appUser, miniApp);
31
+
32
+ this.assertIsMiniAppReleased(miniApp);
33
+
34
+ return await this.installMiniApp(appUser, miniAppCode, miniApp);
35
+ }
36
+
37
+ async runUninstallMiniApp(appUser: UserContext, miniAppCode: string) {
38
+ this.assertHasMiniAppFeature(appUser);
39
+
40
+ await this.findMiniAppOrFail(appUser, miniAppCode);
41
+
42
+ return await this.uninstallMiniApp(appUser, miniAppCode);
43
+ }
44
+
45
+ async runUpdateMiniAppSetting(appUser: UserContext, miniAppCode: string, data: DynamicParam) {
46
+ this.assertHasMiniAppFeature(appUser);
47
+
48
+ const miniApp = await this.findMiniAppOrFail(appUser, miniAppCode);
49
+
50
+ this.assertHasRequiredPlan(appUser, miniApp);
51
+
52
+ this.assertIsMiniAppReleased(miniApp);
53
+
54
+ return await this.updateMiniAppSetting(appUser, miniAppCode, data);
55
+ }
56
+
57
+ async runSystemDefaultMiniAppMigration(appUser: UserContext) {
58
+ // const result = [];
59
+ // for (const item of DEFAULT_MINI_APPS) {
60
+ // const miniApps = await this.miniAppService.search(appUser, {
61
+ // code: item.code,
62
+ // });
63
+ // if (miniApps && miniApps.length > 0) {
64
+ // const miniApp = miniApps[0];
65
+ // const id = miniApp._id;
66
+ // const resp = await this.miniAppService.findIdThenUpdate(appUser, id, item);
67
+ // result.push(resp);
68
+ // } else {
69
+ // const resp = await this.miniAppService.create(appUser, item);
70
+ // result.push(resp);
71
+ // }
72
+ // }
73
+ // return result;
74
+ }
75
+
76
+ async runGetInstalledMiniApps(appUser: UserContext): Promise<InstalledMiniAppDetail> {
77
+ // Find Mini App Installation Record With Mini App Detail
78
+ const miniAppInstallations = await this.findMiniAppInstallations(appUser);
79
+ const installationMap = new Map(miniAppInstallations.map((inst) => [inst.miniApp._id.toString(), inst]));
80
+ const miniApps = await this.miniAppService.search(appUser, {
81
+ _id: { $in: Array.from(installationMap.keys()) },
82
+ });
83
+
84
+ const permissions = this.getMiniAppActionAccess(appUser);
85
+
86
+ const installedMiniApps = miniAppInstallations.map((installation) => {
87
+ const miniApp = miniApps.find((miniApp) => miniApp._id === installation.miniApp._id);
88
+ if (!miniApp) {
89
+ return null;
90
+ }
91
+
92
+ // @ts-ignore
93
+ const miniAppObj = miniApp.toObject();
94
+ return {
95
+ ...miniAppObj,
96
+ hasRequiredPlan: this.policyService.hasRequiredPlan(appUser, miniApp),
97
+ // @ts-ignore
98
+ miniAppInstallation: installation ? installation.toObject() : undefined,
99
+ };
100
+ });
101
+
102
+ return { installedMiniApps: installedMiniApps, permissions };
103
+ }
104
+
105
+ async runGetCategorizedMiniApps(appUser: UserContext): Promise<CategorizedMiniAppDetail> {
106
+ const isDevEnv = this.isDevEnv(appUser);
107
+
108
+ const result = {
109
+ upcomingMiniApps: [],
110
+ availableMiniApps: [],
111
+ };
112
+
113
+ const miniAppInstallations = await this.findMiniAppInstallations(appUser);
114
+
115
+ const installedMiniAppIdArr = miniAppInstallations.map((inst) => inst.miniApp._id);
116
+
117
+ let filter = {
118
+ _id: { $nin: installedMiniAppIdArr },
119
+ env: MiniAppEnvEnum.PROD,
120
+ status: {
121
+ $in: [MiniAppStatusEnum.PUBLISHED, MiniAppStatusEnum.UPCOMING, MiniAppStatusEnum.BETA],
122
+ },
123
+ };
124
+
125
+ if (isDevEnv) {
126
+ filter = {
127
+ _id: { $nin: installedMiniAppIdArr },
128
+ env: MiniAppEnvEnum.DEV,
129
+ status: {
130
+ $in: [MiniAppStatusEnum.DRAFT],
131
+ },
132
+ };
133
+ }
134
+
135
+ const miniApps = await this.miniAppService.search(appUser, filter);
136
+
137
+ miniApps.forEach((miniApp) => {
138
+ if (miniApp.status === MiniAppStatusEnum.UPCOMING) {
139
+ result.upcomingMiniApps.push({
140
+ // @ts-ignore
141
+ ...miniApp.toObject(),
142
+ hasRequiredPlan: this.policyService.hasRequiredPlan(appUser, miniApp),
143
+ });
144
+ } else {
145
+ // MiniApp Not Public, Not Allow To List To User
146
+ if (miniApp.access.visibility === 'private' && !isDevEnv) {
147
+ if (!(miniApp.access.allowEmails ?? []).includes(appUser.getEmail())) {
148
+ // Private App, and not allowed current user to install
149
+ return;
150
+ }
151
+ }
152
+
153
+ result.availableMiniApps.push({
154
+ // @ts-ignore
155
+ ...miniApp.toObject(),
156
+ hasRequiredPlan: this.policyService.hasRequiredPlan(appUser, miniApp),
157
+ });
158
+ }
159
+ });
160
+
161
+ return result;
162
+ }
163
+
164
+ async runGetMiniAppDetail(appUser: UserContext, miniAppCode: string): Promise<MiniAppDetail> {
165
+ const miniApp = await this.findMiniAppOrFail(appUser, miniAppCode);
166
+ const miniAppInstallation = await this.findMiniAppInstallation(appUser, miniAppCode);
167
+
168
+ this.assertPrivateAppPermission(appUser, miniApp);
169
+
170
+ return {
171
+ // @ts-ignore
172
+ ...miniApp.toObject(),
173
+ hasRequiredPlan: this.policyService.hasRequiredPlan(appUser, miniApp),
174
+ miniAppInstallation,
175
+ };
176
+ }
177
+
178
+ private getMiniAppActionAccess(appUser: UserContext) {
179
+ return {
180
+ hasMiniAppFeature: this.policyService.hasFeature(appUser),
181
+ canInstall: this.policyService.canInstall(appUser),
182
+ canUninstall: this.policyService.canUninstall(appUser),
183
+ canUpdateSetting: this.policyService.canUpdateSetting(appUser),
184
+ };
185
+ }
186
+
187
+ // =================================== Finder Function ==================================
188
+
189
+ async findMiniAppOrFail(appUser: UserContext, miniAppCode: string): Promise<MiniApp> {
190
+ const isDevEnv = this.isDevEnv(appUser);
191
+ const miniApps = await this.miniAppService.search(appUser, {
192
+ code: miniAppCode,
193
+ env: isDevEnv ? MiniAppEnvEnum.DEV : MiniAppEnvEnum.PROD,
194
+ });
195
+
196
+ if (miniApps && miniApps.length > 0) {
197
+ return miniApps[0];
198
+ }
199
+
200
+ const msg = MiniAppError.format(MiniAppError.ERR.NOT_FOUND);
201
+ throw new NotFoundException(msg);
202
+ }
203
+
204
+ async findMiniAppInstallations(appUser: UserContext) {
205
+ const miniAppInstallations = await this.miniAppInstallationService.search(
206
+ appUser,
207
+ {
208
+ isActive: true,
209
+ },
210
+ undefined,
211
+ {
212
+ seqNo: 1,
213
+ },
214
+ );
215
+
216
+ return miniAppInstallations;
217
+ }
218
+
219
+ async findMiniAppInstallation(appUser: UserContext, miniAppCode: string): Promise<MiniAppInstallation | undefined> {
220
+ const miniAppInstallations = await this.miniAppInstallationService.search(appUser, {
221
+ 'miniApp.code': miniAppCode,
222
+ });
223
+
224
+ return miniAppInstallations?.[0];
225
+ }
226
+
227
+ async findIsMiniAppInstalledOrFail(appUser: UserContext, miniAppCode: string) {
228
+ const miniAppInstallation = await this.findMiniAppInstallation(appUser, miniAppCode);
229
+ if (!miniAppInstallation) {
230
+ const msg = MiniAppError.format(MiniAppError.ERR.NOT_INSTALLED);
231
+ throw new NotFoundException(msg);
232
+ }
233
+
234
+ if (!miniAppInstallation.isActive) {
235
+ // Already inactive, previously already uninstall
236
+ const msg = MiniAppError.format(MiniAppError.ERR.NOT_INSTALLED);
237
+ throw new NotFoundException(msg);
238
+ }
239
+
240
+ return miniAppInstallation;
241
+ }
242
+
243
+ // ================================= Validation Function ================================
244
+
245
+ assertHasMiniAppFeature(appUser: UserContext) {
246
+ if (!this.policyService.hasFeature(appUser)) {
247
+ const msg = MiniAppError.format(MiniAppError.ERR.NO_FEATURE);
248
+ throw new BadRequestException(msg);
249
+ }
250
+ }
251
+
252
+ assertIsMiniAppReleased(miniApp: MiniApp) {
253
+ if (!this.policyService.isMiniAppRealeased(miniApp.status as MiniAppStatusEnum)) {
254
+ const msg = MiniAppError.format(MiniAppError.ERR.NOT_RELEASED, { status: miniApp.status });
255
+ throw new BadRequestException(msg);
256
+ }
257
+ }
258
+
259
+ assertHasRequiredPlan(appUser: UserContext, miniApp: MiniApp) {
260
+ if (!this.policyService.hasRequiredPlan(appUser, miniApp)) {
261
+ const msg = MiniAppError.format(MiniAppError.ERR.PLAN_REQUIRED, { miniAppName: miniApp.name, requiredPlans: miniApp.access.requiredPlans.join(', ') });
262
+ throw new BadRequestException(msg);
263
+ }
264
+ }
265
+
266
+ assertPrivateAppPermission(appUser: UserContext, miniApp: MiniApp) {
267
+ if (miniApp.access.visibility === 'private') {
268
+ if (!(miniApp.access.allowEmails ?? []).includes(appUser.getEmail())) {
269
+ const msg = MiniAppError.format(MiniAppError.ERR.PRIVATE_APP);
270
+ throw new BadRequestException(msg);
271
+ }
272
+ }
273
+ }
274
+
275
+ // =================================== Action Function ==================================
276
+
277
+ private async installMiniApp(appUser: UserContext, miniAppCode: string, miniApp: MiniApp): Promise<MiniAppInstallation> {
278
+ const miniAppInstallation = await this.findMiniAppInstallation(appUser, miniAppCode);
279
+ if (!miniAppInstallation) {
280
+ // Install MiniApp
281
+ return await this.createMiniAppInstallation(appUser, miniApp);
282
+ }
283
+
284
+ if (miniAppInstallation.isActive) {
285
+ const msg = MiniAppError.format(MiniAppError.ERR.ALREADY_INSTALLED);
286
+ throw new BadRequestException(msg);
287
+ }
288
+
289
+ // Reactivate MiniApp
290
+ return await this.reactivateInstalledMiniApp(appUser, miniAppInstallation);
291
+ }
292
+
293
+ private async uninstallMiniApp(appUser: UserContext, miniAppCode: string) {
294
+ const miniAppInstallation = await this.findIsMiniAppInstalledOrFail(appUser, miniAppCode);
295
+ return await this.deactiveInstalledMiniApp(appUser, miniAppInstallation);
296
+ }
297
+
298
+ private async updateMiniAppSetting(appUser: UserContext, miniAppCode: string, data: DynamicParam) {
299
+ const miniAppInstallation = await this.findIsMiniAppInstalledOrFail(appUser, miniAppCode);
300
+ return await this.setMiniAppInstallationSetting(appUser, miniAppInstallation, data);
301
+ }
302
+
303
+ private async setMiniAppInstallationSetting(appUser: UserContext, miniAppInstallation: MiniAppInstallation, data: DynamicParam) {
304
+ return await this.miniAppInstallationService.findIdThenPatch(appUser, miniAppInstallation._id, {
305
+ settings: data,
306
+ } as MiniAppInstallation);
307
+ }
308
+
309
+ private async createMiniAppInstallation(appUser: UserContext, miniApp: MiniApp) {
310
+ return await this.miniAppInstallationService.create(appUser, {
311
+ apiKey: crypto.randomUUID(),
312
+ isActive: true,
313
+ miniApp: {
314
+ _id: miniApp._id,
315
+ code: miniApp.code,
316
+ label: miniApp.name,
317
+ developerPortalAppId: miniApp.developerPortal.appId,
318
+ },
319
+ miniApiUser: {
320
+ _id: appUser.getId(),
321
+ uid: appUser.getUid(),
322
+ name: appUser.getFullname(),
323
+ email: appUser.getEmail(),
324
+ },
325
+ settings: {},
326
+ });
327
+ }
328
+
329
+ private async reactivateInstalledMiniApp(appUser: UserContext, miniAppInstallation: MiniAppInstallation) {
330
+ return this.setMiniAppInstallationActiveStatus(appUser, miniAppInstallation, true);
331
+ }
332
+
333
+ private async deactiveInstalledMiniApp(appUser: UserContext, miniAppInstallation: MiniAppInstallation) {
334
+ return this.setMiniAppInstallationActiveStatus(appUser, miniAppInstallation, false);
335
+ }
336
+
337
+ private async setMiniAppInstallationActiveStatus(appUser: UserContext, miniAppInstallation: MiniAppInstallation, isActive: boolean) {
338
+ return await this.miniAppInstallationService.findIdThenPatch(appUser, miniAppInstallation._id, {
339
+ isActive,
340
+ } as MiniAppInstallation);
341
+ }
342
+
343
+ private isDevEnv(appUser: UserContext) {
344
+ return appUser.getXOrg() === process.env.DEMO_COMPANY_XORG;
345
+ }
346
+ }
@@ -0,0 +1,5 @@
1
+ import { SetMetadata } from '@nestjs/common';
2
+
3
+ export const MINIAPP_SCOPE_KEY = 'miniapp_required_scope';
4
+
5
+ export const MiniAppScope = (scope: string) => SetMetadata(MINIAPP_SCOPE_KEY, scope);
@@ -0,0 +1,43 @@
1
+ import { CanActivate, ExecutionContext, Injectable, ForbiddenException, UnauthorizedException, BadRequestException } from '@nestjs/common';
2
+ import { Reflector } from '@nestjs/core';
3
+ import { UserContext } from 'src/simpleapp/generate/commons/user.context';
4
+ import { MINIAPP_SCOPE_KEY } from './mini-app-scope.decorator';
5
+ import { MiniAppScopeService } from './mini-app-scope.service';
6
+ import { TUserType } from 'src/simpleapp/types';
7
+ import { GqlContextType } from '@nestjs/graphql';
8
+
9
+ @Injectable()
10
+ export class MiniAppScopeGuard implements CanActivate {
11
+ private readonly _miniAppUserTypes: TUserType[] = ['miniApi', 'miniAppSdk'];
12
+ constructor(
13
+ private readonly reflector: Reflector,
14
+ private readonly miniAppScopeService: MiniAppScopeService,
15
+ ) {}
16
+
17
+ async canActivate(context: ExecutionContext): Promise<boolean> {
18
+ if (context.getType<GqlContextType>() === 'graphql') {
19
+ return true;
20
+ }
21
+
22
+ const req = context.switchToHttp().getRequest();
23
+ const appUser: UserContext = req?.sessionuser;
24
+ if (!appUser) {
25
+ throw new BadRequestException('User Context Not Found');
26
+ }
27
+
28
+ // Not Mini API Request, Allow To Proceed
29
+ if (!this._miniAppUserTypes.includes(appUser.getUserType())) {
30
+ return true;
31
+ }
32
+
33
+ const requiredScope = this.reflector.get<string>(MINIAPP_SCOPE_KEY, context.getHandler());
34
+ if (!requiredScope) {
35
+ // Not Defined @MiniAppScope('xxx'), Not Allowed To Call This API
36
+ throw new ForbiddenException('You are not allowed to call this protected api.');
37
+ }
38
+
39
+ await this.miniAppScopeService.assertHasScope(appUser, requiredScope, req);
40
+
41
+ return true;
42
+ }
43
+ }
@@ -0,0 +1,101 @@
1
+ import { BadRequestException, ForbiddenException, Injectable } from '@nestjs/common';
2
+ import { InjectModel } from '@nestjs/mongoose';
3
+ import { Model } from 'mongoose';
4
+ import { UserContext } from 'src/simpleapp/generate/commons/user.context';
5
+ import { Miniapp } from 'src/simpleapp/generate/types';
6
+ import { getEnvironment, getEnvironmentWithApp } from '../utils/mini-app.util';
7
+ import { MiniAppManagerEnvEnum } from '../mini-app-manager/mini-app-manager.enum';
8
+ import { Request } from 'express';
9
+ import _ from 'lodash';
10
+
11
+ @Injectable()
12
+ export class MiniAppScopeService {
13
+ constructor(@InjectModel('Miniapp') private readonly miniAppModel: Model<Miniapp>) {}
14
+
15
+ /**
16
+ * Find Mini App From Dev To See Is This A Custom Demo Company
17
+ * Only env: 'dev' will have development.demoXOrg field
18
+ * @param developerPortalAppId
19
+ */
20
+ async isMiniAppHaveCustomDemoCompany(developerPortalAppId: string) {
21
+ const miniApp = await this.miniAppModel.findOne({
22
+ 'developerPortal.appId': developerPortalAppId,
23
+ 'development.demoXOrg': { $exists: true, $ne: null },
24
+ env: MiniAppManagerEnvEnum.DEV,
25
+ });
26
+
27
+ return miniApp;
28
+ }
29
+
30
+ async findMiniAppOrFail(developerPortalAppId: string, env: MiniAppManagerEnvEnum) {
31
+ const miniApp = await this.miniAppModel.findOne({
32
+ 'developerPortal.appId': developerPortalAppId,
33
+ env,
34
+ });
35
+
36
+ if (!miniApp) {
37
+ throw new BadRequestException('Mini App Not Found');
38
+ }
39
+
40
+ return miniApp;
41
+ }
42
+
43
+ getDeveloperPortalAppId(appUser: UserContext, req: Request) {
44
+ const userType = appUser.getUserType();
45
+ let developerPortalAppId = '';
46
+
47
+ if (userType === 'miniApi') {
48
+ developerPortalAppId = appUser.getMiniApiTokenInfo().miniAppId;
49
+ } else if (userType === 'miniAppSdk') {
50
+ developerPortalAppId = req.headers['x-mini-app-dev-portal-app-id'] as string;
51
+ }
52
+
53
+ if (_.isEmpty(developerPortalAppId)) {
54
+ throw new BadRequestException('Unknow Mini App App Id');
55
+ }
56
+
57
+ return developerPortalAppId;
58
+ }
59
+
60
+ async assertHasScope(appUser: UserContext, requiredScope: string, req: Request) {
61
+ const developerPortalAppId = this.getDeveloperPortalAppId(appUser, req);
62
+
63
+ const scopes = await this.getScopes(appUser, developerPortalAppId);
64
+
65
+ if (!scopes.includes(requiredScope)) {
66
+ throw new ForbiddenException(`Missing required scope: ${requiredScope}`);
67
+ }
68
+ }
69
+
70
+ assertEnabledFeature(appUser: UserContext, miniApp: Miniapp) {
71
+ const userType = appUser.getUserType();
72
+
73
+ if (userType === 'miniApi') {
74
+ if (!miniApp.integration.enabled.miniApi) {
75
+ throw new BadRequestException('Not enabled api feature');
76
+ }
77
+ } else if (userType === 'miniAppSdk') {
78
+ if (!miniApp.integration.enabled.customPage) {
79
+ throw new BadRequestException('Not enabled custom page feature');
80
+ }
81
+ }
82
+ }
83
+
84
+ async getScopes(appUser: UserContext, developerPortalAppId: string) {
85
+ let env = getEnvironment(appUser);
86
+ if (env === MiniAppManagerEnvEnum.PROD) {
87
+ const customDemoMiniApp = await this.isMiniAppHaveCustomDemoCompany(developerPortalAppId);
88
+ if (customDemoMiniApp) {
89
+ // Check Is Current In Custom Demo XOrg
90
+ env = getEnvironmentWithApp(appUser, customDemoMiniApp);
91
+ }
92
+ }
93
+
94
+ const miniApp = await this.findMiniAppOrFail(developerPortalAppId, env);
95
+ this.assertEnabledFeature(appUser, miniApp);
96
+
97
+ const scopes = miniApp.integration?.scopes ?? [];
98
+
99
+ return scopes;
100
+ }
101
+ }
@@ -0,0 +1,24 @@
1
+ /**
2
+ * This file was automatically generated by simpleapp generator. Every
3
+ * MODIFICATION OVERRIDE BY GENERATEOR
4
+ * last change 2024-04-02
5
+ * Author: Ks Tan
6
+ */
7
+ import { Module } from '@nestjs/common';
8
+ import { MiniAppManagerController } from './mini-app-manager/mini-app-manager.controller';
9
+ import { MiniAppManagerService } from './mini-app-manager/mini-app-manager.service';
10
+ import { MiniAppManagerPolicyService } from './mini-app-manager/mini-app-manager-policy.service';
11
+ import { MiniAppInstallationModule } from '../../resources/mini-app-installation/mini-app-installation.module';
12
+ import { MiniAppModule } from '../../resources/mini-app/mini-app.module';
13
+ import { SimpleAppSoftwarePolicyModule } from '../policy/policy.module';
14
+ import { MiniAppManagerBridgeService } from './mini-app-manager/mini-app-manager-bridge.service';
15
+ import { MiniAppManagerEnvProductionService } from './mini-app-manager/mini-app-manager-env-production.service';
16
+ import { MiniAppManagerEnvDevelopmentService } from './mini-app-manager/mini-app-manager-env-development.service';
17
+
18
+ @Module({
19
+ imports: [SimpleAppSoftwarePolicyModule,MiniAppInstallationModule,MiniAppModule],
20
+ controllers: [MiniAppManagerController],
21
+ providers: [MiniAppManagerService,MiniAppManagerPolicyService,MiniAppManagerEnvProductionService,MiniAppManagerEnvDevelopmentService,MiniAppManagerBridgeService],
22
+ exports: [MiniAppManagerService,MiniAppManagerPolicyService,MiniAppManagerEnvProductionService,MiniAppManagerEnvDevelopmentService,MiniAppManagerBridgeService],
23
+ })
24
+ export class SimpleAppMiniAppModule {}
@@ -0,0 +1,23 @@
1
+ import { Miniapp, Miniappinstallation } from '../../../simpleapp/generate/types';
2
+
3
+ export type MiniAppDetailPermission = {
4
+ hasMiniAppFeature: boolean;
5
+ canInstall: boolean;
6
+ canUninstall: boolean;
7
+ canUpdateSetting: boolean;
8
+ };
9
+
10
+ export type MiniAppDetail = Miniapp & {
11
+ hasRequiredPlan: boolean;
12
+ miniAppInstallation?: Miniappinstallation;
13
+ };
14
+
15
+ export type CategorizedMiniAppDetail = {
16
+ upcomingMiniApps: MiniAppDetail[];
17
+ availableMiniApps: MiniAppDetail[];
18
+ };
19
+
20
+ export type InstalledMiniAppDetail = {
21
+ installedMiniApps: MiniAppDetail[];
22
+ permissions: MiniAppDetailPermission;
23
+ };
@@ -0,0 +1,26 @@
1
+ import { UserContext } from 'src/simple-app/.core/features/user-context/user.context';
2
+ import { MiniAppManagerEnvEnum } from '../mini-app-manager/mini-app-manager.enum';
3
+ import { MiniApp } from '../dto';
4
+
5
+ export function isDemoCompany(xOrg: string): boolean {
6
+ return xOrg === process.env.DEMO_COMPANY_XORG;
7
+ }
8
+
9
+ export function isSemiDevOrg(xOrg: string, miniApp: MiniApp): boolean {
10
+ return xOrg === miniApp?.development?.demoXOrg;
11
+ }
12
+
13
+ export function getEnvironment(appUser: UserContext) {
14
+ const currentXOrg = appUser.getXOrg();
15
+ if (isDemoCompany(currentXOrg)) return MiniAppManagerEnvEnum.DEV;
16
+
17
+ return MiniAppManagerEnvEnum.PROD;
18
+ }
19
+
20
+ export function getEnvironmentWithApp(appUser: UserContext, miniApp: MiniApp) {
21
+ const currentXOrg = appUser.getXOrg();
22
+ if (isDemoCompany(currentXOrg)) return MiniAppManagerEnvEnum.DEV;
23
+ if (isSemiDevOrg(currentXOrg, miniApp)) return MiniAppManagerEnvEnum.DEV;
24
+
25
+ return MiniAppManagerEnvEnum.PROD;
26
+ }
@@ -0,0 +1,12 @@
1
+
2
+ import { Module } from '@nestjs/common';
3
+ import {PolicyService} from './policy.service'
4
+ @Module({
5
+ imports: [
6
+
7
+ ],
8
+ controllers: [],
9
+ providers: [PolicyService],
10
+ exports: [PolicyService],
11
+ })
12
+ export class SimpleAppSoftwarePolicyModule {}
@@ -0,0 +1,45 @@
1
+ import { Injectable } from '@nestjs/common';
2
+ import { Role } from 'src/simple-app/.core/features/auth/role-guard/roles.enum';
3
+ import { UserContext } from 'src/simple-app/.core/features/user-context/user.context';
4
+
5
+ @Injectable()
6
+ export class PolicyService {
7
+ private readonly _HIGH_PRIVILEGE_ROLES = [Role.SuperAdmin, Role.SuperUser, Role.TenantOwner];
8
+
9
+ private readonly _FEATURES = {
10
+ miniApp: ['lite', 'pro', 'enterprise'],
11
+ };
12
+
13
+ hasHighPrivilege(roles: Role[]): boolean {
14
+ return this._HIGH_PRIVILEGE_ROLES.some((role) => roles.includes(role));
15
+ }
16
+
17
+ hasRole(roles: Role[], role: Role) {
18
+ return roles.includes(role);
19
+ }
20
+
21
+ /**
22
+ * Check if user's current plan has access to a specific feature.
23
+ *
24
+ * TODO: In the future, migrate to individual plan definition files:
25
+ * - plans/free.ts
26
+ * - plans/lite.ts
27
+ * - plans/pro.ts
28
+ * - plans/enterprise.ts
29
+ */
30
+ hasFeature(appUser: UserContext, feature: keyof typeof this._FEATURES): boolean {
31
+ const appPackage = appUser.getPackage();
32
+ const allowedPlans = this._FEATURES[feature];
33
+
34
+ return allowedPlans.includes(appPackage);
35
+ }
36
+
37
+ can(appUser: UserContext, role: Role) {
38
+ const roles = appUser.getRoles();
39
+
40
+ const hasHighPrivilege = this.hasHighPrivilege(roles);
41
+ if (hasHighPrivilege) return hasHighPrivilege;
42
+
43
+ return this.hasRole(roles, role);
44
+ }
45
+ }