@simitgroup/simpleapp-generator 1.6.6-i-alpha → 1.6.6-k-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 (239) hide show
  1. package/ReleaseNote.md +7 -0
  2. package/dist/buildinschemas/docnoformat.js +6 -6
  3. package/dist/buildinschemas/docnoformat.js.map +1 -1
  4. package/dist/buildinschemas/documentevent.js +1 -1
  5. package/dist/buildinschemas/documentevent.js.map +1 -1
  6. package/dist/buildinschemas/organization.js +1 -1
  7. package/dist/buildinschemas/organization.js.map +1 -1
  8. package/dist/buildinschemas/tenant.js +1 -1
  9. package/dist/buildinschemas/tenant.js.map +1 -1
  10. package/dist/buildinschemas/user.js +2 -2
  11. package/dist/buildinschemas/user.js.map +1 -1
  12. package/dist/buildinschemas/webhook.d.ts.map +1 -1
  13. package/dist/buildinschemas/webhook.js +1 -0
  14. package/dist/buildinschemas/webhook.js.map +1 -1
  15. package/dist/framework.d.ts.map +1 -1
  16. package/dist/framework.js +30 -3
  17. package/dist/framework.js.map +1 -1
  18. package/dist/generate.d.ts.map +1 -1
  19. package/dist/generate.js +21 -20
  20. package/dist/generate.js.map +1 -1
  21. package/dist/index.js +0 -0
  22. package/dist/processors/jrxmlbuilder.js +3 -3
  23. package/dist/processors/jrxmlbuilder.js.map +1 -1
  24. package/dist/processors/jsonschemabuilder.d.ts.map +1 -1
  25. package/dist/processors/jsonschemabuilder.js +17 -10
  26. package/dist/processors/jsonschemabuilder.js.map +1 -1
  27. package/dist/type.d.ts +1 -1
  28. package/dist/type.d.ts.map +1 -1
  29. package/package.json +2 -3
  30. package/reset-install.sh +3 -0
  31. package/src/buildinschemas/docnoformat.ts +6 -6
  32. package/src/buildinschemas/documentevent.ts +1 -1
  33. package/src/buildinschemas/organization.ts +1 -1
  34. package/src/buildinschemas/tenant.ts +1 -1
  35. package/src/buildinschemas/user.ts +2 -2
  36. package/src/buildinschemas/webhook.ts +1 -0
  37. package/src/framework.ts +33 -5
  38. package/src/generate.ts +22 -20
  39. package/src/processors/jrxmlbuilder.ts +3 -3
  40. package/src/processors/jsonschemabuilder.ts +27 -14
  41. package/src/type.ts +1 -1
  42. package/templates/basic/nest/controller.ts.eta +6 -5
  43. package/templates/basic/nest/resolver.ts.eta +4 -2
  44. package/templates/basic/nest/service.ts.eta +5 -2
  45. package/templates/basic/nuxt/simpleapp.generate.client.ts.eta +3 -3
  46. package/templates/nest/.gitignore.eta +4 -5
  47. package/templates/nest/src/{app.module.ts.eta → app.module.ts._eta} +2 -2
  48. package/templates/nest/src/{main.ts.eta → main.ts._eta} +2 -2
  49. package/templates/nest/src/printapi/printapi.service.ts.eta +7 -8
  50. package/templates/nest/src/simpleapp/.gitignore.eta +1 -1
  51. package/templates/nest/src/simpleapp/generate/commons/audittrail.service.ts.eta +2 -2
  52. package/templates/nest/src/simpleapp/generate/commons/customkeycloa.guard.ts.eta +14 -12
  53. package/templates/nest/src/simpleapp/generate/commons/customkeycloak.guard.ts.eta +36 -42
  54. package/templates/nest/src/simpleapp/generate/commons/docnogenerator.service.ts.eta +6 -3
  55. package/templates/nest/src/simpleapp/generate/commons/encryption.static.ts.eta +56 -61
  56. package/templates/nest/src/simpleapp/generate/commons/middlewares/tenant.middleware.ts.eta +65 -88
  57. package/templates/nest/src/simpleapp/generate/commons/robotuser.service.ts.eta +10 -9
  58. package/templates/nest/src/simpleapp/generate/commons/roles/roles.guard.ts.eta +10 -3
  59. package/templates/nest/src/simpleapp/generate/commons/runwebhook.service.ts.eta +71 -77
  60. package/templates/nest/src/simpleapp/generate/commons/user.context.ts.eta +439 -293
  61. package/templates/nest/src/simpleapp/generate/processors/autoinc.processor.ts.eta +20 -5
  62. package/templates/nest/src/simpleapp/generate/processors/simpleapp.processor.ts.eta +423 -38
  63. package/templates/nest/src/simpleapp/profile/{profile.controller.ts.eta → profile.controller.ts._eta} +2 -2
  64. package/templates/nest/src/simpleapp/profile/{profile.service.ts.eta → profile.service.ts._eta} +2 -2
  65. package/templates/nest/src/simpleapp/simpleapp.module.ts.eta +15 -4
  66. package/templates/nuxt/assets/css/style.css._eta +74 -28
  67. package/templates/nuxt/components/button/ButtonMultiple.vue._eta +1 -1
  68. package/templates/nuxt/components/calendar/{CalendarByResource.vue.eta → CalendarByResource.vue._eta} +2 -2
  69. package/templates/nuxt/components/calendar/{CalendarInput.vue.eta → CalendarInput.vue._eta} +3 -3
  70. package/templates/nuxt/components/calendar/{CalendarSmall.vue.eta → CalendarSmall.vue._eta} +13 -7
  71. package/templates/nuxt/components/debug/{DebugDocumentData.vue.eta → DebugDocumentData.vue._eta} +4 -5
  72. package/templates/nuxt/components/form/{FormDocnoformat.vue.eta → FormDocnoformat.vue._eta} +2 -1
  73. package/templates/nuxt/components/form/user/{FormUserPermission.vue.eta → FormUserPermission.vue._eta} +6 -0
  74. package/templates/nuxt/components/header/{HeaderBreadcrumb.vue.eta → HeaderBreadcrumb.vue._eta} +5 -5
  75. package/templates/nuxt/components/header/button/{HeaderButtonProfile.vue.eta → HeaderButtonProfile.vue._eta} +2 -2
  76. package/templates/nuxt/components/header/button/task/{HeaderButtonTaskList.vue.eta → HeaderButtonTaskList.vue._eta} +4 -4
  77. package/templates/nuxt/components/image/ImageAvatar.vue.eta +56 -0
  78. package/templates/nuxt/components/image/{ImageOrganization.vue.eta.vue → ImageOrganization.vue.eta} +15 -9
  79. package/templates/nuxt/components/image/{ImageToBase64Uploader.vue.eta.vue → ImageToBase64Uploader.vue.eta} +28 -18
  80. package/templates/nuxt/components/list/{ListDocumentTable.vue.eta → ListDocumentTable.vue._eta} +3 -3
  81. package/templates/nuxt/components/list/{ListItem.vue.eta → ListItem.vue._eta} +2 -2
  82. package/templates/nuxt/components/list/{ListMessages.vue.eta → ListMessages.vue._eta} +8 -2
  83. package/templates/nuxt/components/list/{ListView.vue.eta → ListView.vue._eta} +2 -2
  84. package/templates/nuxt/components/overlay/{OverlayPanelWithToolBar.vue.eta → OverlayPanelWithToolBar.vue._eta} +5 -5
  85. package/templates/nuxt/components/overlay/{OverlaySideBarCrud.vue.eta → OverlaySideBarCrud.vue._eta} +4 -4
  86. package/templates/nuxt/components/overlay/{OverlayViewer.vue.eta → OverlayViewer.vue._eta} +2 -2
  87. package/templates/nuxt/components/page/{PageDocList.vue.eta → PageDocList.vue._eta} +5 -5
  88. package/templates/nuxt/components/renderer/RendererDateAge.vue.eta +19 -0
  89. package/templates/nuxt/components/renderer/{RendererDateTime.vue.eta → RendererDateTime.vue._eta} +2 -2
  90. package/templates/nuxt/components/renderer/{RendererDocHistories.vue.eta → RendererDocHistories.vue._eta} +6 -0
  91. package/templates/nuxt/components/renderer/{RendererForeignKey.vue.eta → RendererForeignKey.vue._eta} +2 -2
  92. package/templates/nuxt/components/renderer/{RendererLink.vue.eta → RendererLink.vue._eta} +2 -2
  93. package/templates/nuxt/components/renderer/{RendererTime.vue.eta → RendererTime.vue._eta} +2 -2
  94. package/templates/nuxt/components/renderer/{RendererViewer.vue.eta → RendererViewer.vue._eta} +2 -2
  95. package/templates/nuxt/components/select/{SelectTemplate.vue.eta → SelectTemplate.vue._eta} +2 -2
  96. package/templates/nuxt/components/session/{SessionBlock.vue.eta → SessionBlock.vue._eta} +2 -2
  97. package/templates/nuxt/components/simpleApp/SimpleAppAutocomplete.vue.eta +55 -55
  98. package/templates/nuxt/components/simpleApp/SimpleAppCalendarInput.vue.eta +13 -11
  99. package/templates/nuxt/components/simpleApp/SimpleAppChildrenList.vue.eta +6 -3
  100. package/templates/nuxt/components/simpleApp/SimpleAppDocumentNo.vue.eta +33 -28
  101. package/templates/nuxt/components/simpleApp/SimpleAppFieldContainer.vue.eta +19 -28
  102. package/templates/nuxt/components/simpleApp/SimpleAppInput.vue.eta +113 -105
  103. package/templates/nuxt/components/simpleApp/SimpleAppInputTable.vue.eta +3 -3
  104. package/templates/nuxt/components/simpleApp/SimpleAppJsonSchemaForm.vue.eta +3 -16
  105. package/templates/nuxt/components/simpleApp/SimpleAppUserPicker.vue.eta +10 -12
  106. package/templates/nuxt/components/table/{TableDocuments.vue.eta → TableDocuments.vue._eta} +2 -2
  107. package/templates/nuxt/components/user/{UserButtonPermissionInfo.vue.eta → UserButtonPermissionInfo.vue._eta} +4 -4
  108. package/templates/nuxt/components/user/{UserInvitation.vue.eta → UserInvitation.vue._eta} +2 -2
  109. package/templates/nuxt/components/user/{UserProfileListItem.vue.eta → UserProfileListItem.vue._eta} +2 -2
  110. package/templates/nuxt/components/user/{UserTenantPicker.vue.eta → UserTenantPicker.vue._eta} +2 -2
  111. package/templates/nuxt/composables/getOpenApi.generate.ts.eta +11 -3
  112. package/templates/nuxt/composables/getUserStore.generate.ts.eta +1 -1
  113. package/templates/nuxt/composables/graphquery.generate.ts.eta +1 -1
  114. package/templates/nuxt/composables/recently.generate.ts.eta +0 -1
  115. package/templates/nuxt/composables/stringHelper.generate.ts.eta +5 -2
  116. package/templates/nuxt/nuxt.config.ts._eta +6 -5
  117. package/templates/nuxt/pages/[xorg]/docnoformat/[id].vue.eta +0 -1
  118. package/templates/nuxt/pages/[xorg]/{docnoformat.vue.eta → docnoformat.vue._eta} +1 -0
  119. package/templates/nuxt/pages/[xorg]/organization/[id].vue.eta +13 -9
  120. package/templates/nuxt/pages/[xorg]/organization/new.vue.eta +10 -12
  121. package/templates/nuxt/pages/[xorg]/{user.vue.eta → user.vue._eta} +2 -2
  122. package/templates/nuxt/pages/index.vue._eta +1 -1
  123. package/templates/nuxt/pages/{profile.vue.eta → profile.vue._eta} +2 -2
  124. package/templates/nuxt/plugins/10.simpleapp-event.ts.eta +6 -0
  125. package/templates/nuxt/plugins/20.simpleapp-userstore.ts.eta +89 -12
  126. package/templates/nuxt/plugins/40.pusher.ts.eta +8 -5
  127. package/templates/nuxt/presets/lara/accordion/index.js +79 -0
  128. package/templates/nuxt/presets/lara/accordioncontent/index.js +3 -0
  129. package/templates/nuxt/presets/lara/accordionheader/index.js +11 -0
  130. package/templates/nuxt/presets/lara/accordionpanel/index.js +18 -0
  131. package/templates/nuxt/presets/lara/autocomplete/index.js +208 -0
  132. package/templates/nuxt/presets/lara/avatar/index.js +43 -0
  133. package/templates/nuxt/presets/lara/avatargroup/index.js +5 -0
  134. package/templates/nuxt/presets/lara/badge/index.js +47 -0
  135. package/templates/nuxt/presets/lara/badgedirective/index.js +43 -0
  136. package/templates/nuxt/presets/lara/blockui/index.js +4 -0
  137. package/templates/nuxt/presets/lara/breadcrumb/index.js +64 -0
  138. package/templates/nuxt/presets/lara/button/index.js +238 -0
  139. package/templates/nuxt/presets/lara/buttongroup/index.js +12 -0
  140. package/templates/nuxt/presets/lara/card/index.js +37 -0
  141. package/templates/nuxt/presets/lara/carousel/index.js +103 -0
  142. package/templates/nuxt/presets/lara/cascadeselect/index.js +199 -0
  143. package/templates/nuxt/presets/lara/checkbox/index.js +104 -0
  144. package/templates/nuxt/presets/lara/chip/index.js +42 -0
  145. package/templates/nuxt/presets/lara/colorpicker/index.js +123 -0
  146. package/templates/nuxt/presets/lara/confirmdialog/index.js +3 -0
  147. package/templates/nuxt/presets/lara/confirmpopup/index.js +56 -0
  148. package/templates/nuxt/presets/lara/contextmenu/index.js +126 -0
  149. package/templates/nuxt/presets/lara/datatable/index.js +403 -0
  150. package/templates/nuxt/presets/lara/dataview/index.js +28 -0
  151. package/templates/nuxt/presets/lara/datepicker/index.js +435 -0
  152. package/templates/nuxt/presets/lara/deferred/index.js +3 -0
  153. package/templates/nuxt/presets/lara/dialog/index.js +148 -0
  154. package/templates/nuxt/presets/lara/divider/index.js +67 -0
  155. package/templates/nuxt/presets/lara/dock/index.js +86 -0
  156. package/templates/nuxt/presets/lara/drawer/index.js +149 -0
  157. package/templates/nuxt/presets/lara/fieldset/index.js +84 -0
  158. package/templates/nuxt/presets/lara/fileupload/index.js +95 -0
  159. package/templates/nuxt/presets/lara/floatlabel/index.js +26 -0
  160. package/templates/nuxt/presets/lara/galleria/index.js +308 -0
  161. package/templates/nuxt/presets/lara/global.js +90 -0
  162. package/templates/nuxt/presets/lara/iconfield/index.js +27 -0
  163. package/templates/nuxt/presets/lara/image/index.js +206 -0
  164. package/templates/nuxt/presets/lara/index.js +234 -0
  165. package/templates/nuxt/presets/lara/inplace/index.js +27 -0
  166. package/templates/nuxt/presets/lara/inputgroup/index.js +5 -0
  167. package/templates/nuxt/presets/lara/inputgroupaddon/index.js +28 -0
  168. package/templates/nuxt/presets/lara/inputmask/index.js +39 -0
  169. package/templates/nuxt/presets/lara/inputnumber/index.js +167 -0
  170. package/templates/nuxt/presets/lara/inputotp/index.js +10 -0
  171. package/templates/nuxt/presets/lara/inputswitch/index.js +80 -0
  172. package/templates/nuxt/presets/lara/inputtext/index.js +54 -0
  173. package/templates/nuxt/presets/lara/knob/index.js +44 -0
  174. package/templates/nuxt/presets/lara/listbox/index.js +117 -0
  175. package/templates/nuxt/presets/lara/megamenu/index.js +198 -0
  176. package/templates/nuxt/presets/lara/menu/index.js +96 -0
  177. package/templates/nuxt/presets/lara/menubar/index.js +176 -0
  178. package/templates/nuxt/presets/lara/message/index.js +92 -0
  179. package/templates/nuxt/presets/lara/metergroup/index.js +96 -0
  180. package/templates/nuxt/presets/lara/multiselect/index.js +201 -0
  181. package/templates/nuxt/presets/lara/orderlist/index.js +13 -0
  182. package/templates/nuxt/presets/lara/organizationchart/index.js +137 -0
  183. package/templates/nuxt/presets/lara/overlaybadge/index.js +18 -0
  184. package/templates/nuxt/presets/lara/paginator/index.js +178 -0
  185. package/templates/nuxt/presets/lara/panel/index.js +91 -0
  186. package/templates/nuxt/presets/lara/panelmenu/index.js +127 -0
  187. package/templates/nuxt/presets/lara/password/index.js +72 -0
  188. package/templates/nuxt/presets/lara/picklist/index.js +52 -0
  189. package/templates/nuxt/presets/lara/popover/index.js +31 -0
  190. package/templates/nuxt/presets/lara/progressbar/index.js +55 -0
  191. package/templates/nuxt/presets/lara/progressspinner/index.js +51 -0
  192. package/templates/nuxt/presets/lara/radiobutton/index.js +104 -0
  193. package/templates/nuxt/presets/lara/rating/index.js +63 -0
  194. package/templates/nuxt/presets/lara/ripple/index.js +6 -0
  195. package/templates/nuxt/presets/lara/scrollpanel/index.js +77 -0
  196. package/templates/nuxt/presets/lara/scrolltop/index.js +26 -0
  197. package/templates/nuxt/presets/lara/select/index.js +240 -0
  198. package/templates/nuxt/presets/lara/selectbutton/index.js +16 -0
  199. package/templates/nuxt/presets/lara/skeleton/index.js +16 -0
  200. package/templates/nuxt/presets/lara/slider/index.js +137 -0
  201. package/templates/nuxt/presets/lara/speeddial/index.js +57 -0
  202. package/templates/nuxt/presets/lara/splitbutton/index.js +19 -0
  203. package/templates/nuxt/presets/lara/splitter/index.js +61 -0
  204. package/templates/nuxt/presets/lara/splitterpanel/index.js +5 -0
  205. package/templates/nuxt/presets/lara/step/index.js +62 -0
  206. package/templates/nuxt/presets/lara/stepitem/index.js +11 -0
  207. package/templates/nuxt/presets/lara/steplist/index.js +3 -0
  208. package/templates/nuxt/presets/lara/steppanels/index.js +3 -0
  209. package/templates/nuxt/presets/lara/stepper/index.js +13 -0
  210. package/templates/nuxt/presets/lara/steps/index.js +111 -0
  211. package/templates/nuxt/presets/lara/tab/index.js +42 -0
  212. package/templates/nuxt/presets/lara/tablist/index.js +8 -0
  213. package/templates/nuxt/presets/lara/tabmenu/index.js +73 -0
  214. package/templates/nuxt/presets/lara/tabpanel/index.js +3 -0
  215. package/templates/nuxt/presets/lara/tabpanels/index.js +3 -0
  216. package/templates/nuxt/presets/lara/tabs/index.js +5 -0
  217. package/templates/nuxt/presets/lara/tabview/index.js +156 -0
  218. package/templates/nuxt/presets/lara/tag/index.js +38 -0
  219. package/templates/nuxt/presets/lara/terminal/index.js +60 -0
  220. package/templates/nuxt/presets/lara/textarea/index.js +39 -0
  221. package/templates/nuxt/presets/lara/tieredmenu/index.js +121 -0
  222. package/templates/nuxt/presets/lara/timeline/index.js +81 -0
  223. package/templates/nuxt/presets/lara/toast/index.js +102 -0
  224. package/templates/nuxt/presets/lara/togglebutton/index.js +45 -0
  225. package/templates/nuxt/presets/lara/toggleswitch/index.js +80 -0
  226. package/templates/nuxt/presets/lara/toolbar/index.js +28 -0
  227. package/templates/nuxt/presets/lara/tooltip/index.js +46 -0
  228. package/templates/nuxt/presets/lara/tree/index.js +101 -0
  229. package/templates/nuxt/presets/lara/treeselect/index.js +102 -0
  230. package/templates/nuxt/presets/lara/treetable/index.js +305 -0
  231. package/templates/nuxt/providers/my-provider.ts.eta +1 -1
  232. package/templates/nuxt/server/api/profile/[...].ts.eta +4 -3
  233. package/templates/nuxt/simpleapp/generate/clients/SimpleAppClient.ts.eta +10 -20
  234. package/templates/nuxt/tailwind.config.ts._eta +4 -15
  235. package/templates/nuxt/types/schema.ts.eta +1 -1
  236. package/templates/nuxt/types/user.ts.eta +6 -1
  237. package/templates/project/jsonschemas/appintegration.json_eta +227 -0
  238. package/templates/project/sharelibs/validate.ts.eta +23 -0
  239. package/templates/nuxt/components/image/ImageAvatar.vue.eta._vue +0 -57
@@ -4,135 +4,112 @@
4
4
  * last change 2024-03-17
5
5
  * Author: Ks Tan
6
6
  */
7
- import {
8
- Injectable,
9
- NestMiddleware,
10
- Logger,
11
- Scope,
12
- Inject,
13
- BadRequestException,
14
- } from '@nestjs/common';
15
- import { Request, Response, NextFunction } from 'express';
7
+
8
+ import Base64URL from '@darkwolf/base64url';
9
+ import { BadRequestException, Injectable, Logger, NestMiddleware } from '@nestjs/common';
16
10
  import { InjectModel } from '@nestjs/mongoose';
17
- import { Model, Connection } from 'mongoose';
18
- // import * as mongoose from 'mongoose';
19
- import { User } from '../../types/user.type';
11
+ import { NextFunction, Request, Response } from 'express';
12
+ import { Model } from 'mongoose';
20
13
  import { Permission } from '../../types/perm.type';
21
- import { InjectConnection } from '@nestjs/mongoose';
22
-
23
- const Base64URL = require('@darkwolf/base64url');
24
- // import * as jwt from 'nestjs-jwt'
25
-
14
+ import { User } from '../../types/user.type';
15
+ import { Appintegration } from '../../types/appintegration.type';
26
16
  import { UserContext } from '../user.context';
27
- // import {KeycloakConfigService} from "../keycloak/keycloak.service"
17
+
28
18
  @Injectable()
29
19
  export class TenantMiddleware implements NestMiddleware {
30
- protected defaultxorg = Base64URL.encodeText('0-0-0');
31
- protected excludeXorgs = ['/profile', '/profile/tenant', '/profile/session'];
32
- protected logger = new Logger();
33
- protected transController;
20
+ protected defaultXOrg = Base64URL.encodeText('0-0-0');
21
+
22
+ protected excludeXOrgPaths = ['/profile', '/profile/tenant', '/profile/session'];
23
+
24
+ private readonly logger = new Logger(this.constructor.name);
25
+
34
26
  constructor(
35
- @InjectModel('User') private readonly usermodel: Model<User>,
36
- @InjectModel('Permission') private readonly permmodel: Model<Permission>,
27
+ @InjectModel('User') private readonly userModel: Model<User>,
28
+ @InjectModel('Permission') private readonly permModel: Model<Permission>,
29
+ @InjectModel('Appintegration') private readonly appModel: Model<Appintegration>,
37
30
  ) {}
38
31
 
39
- requireXorg(baseurl: string): boolean {
40
- // console.log('requireXorg')
41
- for (let i = 0; i < this.excludeXorgs.length; i++) {
42
- if (baseurl.includes(this.excludeXorgs[i])) {
43
- this.logger.verbose('requireXorg = false');
32
+ requireXOrg(baseurl: string): boolean {
33
+ for (let i = 0; i < this.excludeXOrgPaths.length; i++) {
34
+ if (baseurl.includes(this.excludeXOrgPaths[i])) {
35
+ this.logger.verbose('requireXOrg = false');
44
36
  return false;
45
37
  }
46
38
  }
47
- // console.log("Require xorg")
48
39
  return true;
49
40
  }
41
+
50
42
  async use(req: Request, res: Response, next: NextFunction) {
51
43
  if (req.baseUrl == '/oauth2-redirect.html') {
52
44
  next();
53
45
  return;
54
46
  }
55
- const u = new UserContext(this.usermodel, this.permmodel);
47
+
48
+ let tokenStr: string = req.get('authorization') ?? '';
49
+ tokenStr = tokenStr.replace('Bearer ', '');
50
+ const xOrg = req.get('x-org') ?? this.defaultXOrg;
51
+
52
+ const user = new UserContext(this.userModel, this.permModel, this.appModel);
56
53
 
57
54
  if (req.baseUrl == '/graphql') {
58
- let tokenstr: string = req.headers['authorization'] ?? '';
59
- tokenstr = tokenstr.replace('Bearer ', '');
60
- const xorg = req.headers['x-org'] ?? this.defaultxorg;
61
- if (tokenstr) {
62
- await u.setCurrentUserInfo(tokenstr, xorg);
55
+ if (tokenStr) {
56
+ await user.setCurrentUserInfo(tokenStr, xOrg);
63
57
  }
64
- req['sessionuser'] = u;
58
+ req['sessionuser'] = user;
65
59
  next();
66
60
  return;
67
61
  }
68
- this.logger.debug(`running TenantMiddleware for ${req.baseUrl}`);
69
-
70
-
71
- //if APIKEY defined, and there is api key and secret supplied. use robot user
72
- if(process.env.X_API_KEY &&req.headers['x-api-key'] && req.headers['x-api-secret']){
73
-
74
- if(req.headers['x-api-key']==process.env.X_API_KEY &&
75
- req.headers['x-api-secret']==process.env.X_API_SECRET){
62
+ this.logger.debug(`Running TenantMiddleware for ${req.baseUrl}`);
76
63
 
77
- u.setAsStaticUser(
78
- '00000000-0000-0000-0000-000000000000',
79
- 'robot',
80
- 'Robot',
81
- 'robot@a.org',
82
- req.headers['x-org']?? this.defaultxorg
83
- );
84
- if(req.headers['x-guest-accesstoken']) {
85
- u.setGuestToken(<string>req.headers['x-guest-accesstoken']);
64
+ // If X_APIKEY defined, and there is api key and secret supplied. use robot user
65
+ if (process.env.X_APIKEY && req.get('x-apikey') && req.get('x-apisecret')) {
66
+ if (req.get('x-apikey') == process.env.X_APIKEY && req.get('x-apisecret') == process.env.X_APISECRET) {
67
+ user.setAsStaticUser('00000000-0000-0000-0000-000000000000', 'robot', 'Robot', 'robot@a.org', req.get('x-org') ?? this.defaultXOrg);
68
+ if (req.get('x-guest-accesstoken')) {
69
+ user.setGuestToken(req.get('x-guest-accesstoken'));
86
70
  }
87
- req['sessionuser'] = u;
71
+ req['sessionuser'] = user;
88
72
  next();
89
73
  return;
90
- }else{
91
- this.logger.log('invalid api key/scret');
92
- throw new BadRequestException('invalid api key/scret');
74
+ } else {
75
+ this.logger.log('Invalid API Key / Secret');
76
+ throw new BadRequestException('Invalid API Key / Secret');
93
77
  }
94
78
  }
95
79
 
96
- if (!req.headers['authorization']) {
97
- this.logger.log('undefine bearer token');
98
- return res.status(401).send('Undefine bearer token');
80
+ if (!req.get('authorization')) {
81
+ this.logger.log('Undefine Bearer Token');
82
+ return res.status(401).send('Undefine Bearer Token');
99
83
  }
100
- if (!req.headers['x-org'] && this.requireXorg(req.baseUrl)) {
101
- this.logger.log(
102
- 'undefine x-org and require that at ' + req.baseUrl,
103
- 'TenantMiddleware',
104
- );
105
- throw new BadRequestException('undefine header string x-org');
106
- // return res.status(401).send('undefine header string x-org');
84
+
85
+ if (!req.get('x-org') && this.requireXOrg(req.baseUrl)) {
86
+ this.logger.log('Undefine header X-Org and require that at ' + req.baseUrl, 'TenantMiddleware');
87
+ throw new BadRequestException('Undefine header X-Org');
107
88
  }
108
- // const session = await this.connection.startSession();
109
- // console.log("line 43")
110
- try {
111
- let tokenstr: string = req.headers['authorization'];
112
- tokenstr = tokenstr.replace('Bearer ', '');
113
89
 
114
- const xorg = req.headers['x-org'] ?? this.defaultxorg;
115
- await u.setCurrentUserInfo(tokenstr, xorg);
116
- if (u.getId() == '' && this.requireXorg(req.baseUrl)) {
117
- this.logger.log('access deny of no user:', req.baseUrl);
118
- return res.status(401).send('access deny');
90
+ try {
91
+ await user.setCurrentUserInfo(tokenStr, xOrg);
92
+ if (user.getId() == '' && this.requireXOrg(req.baseUrl)) {
93
+ this.logger.log('Access deny for user:', req.baseUrl);
94
+ return res.status(401).send('Access deny for user');
119
95
  } else {
120
- if (u.getId() == '') {
121
- this.logger.verbose(
122
- `grant new user (${u.getUid()}) access ${req.baseUrl}`,
123
- );
96
+ if (user.getId() == '') {
97
+ this.logger.verbose(`Grant new user (${user.getUid()}) access ${req.baseUrl}`);
124
98
  } else {
125
- this.logger.verbose(
126
- `grant user (${u.getId()}) access ${req.baseUrl}`,
127
- );
99
+ this.logger.verbose(`Grant user (${user.getId()}) access ${req.baseUrl}`);
128
100
  }
129
- req['sessionuser'] = u;
130
- this.logger.verbose(u.getRoles());
101
+ req['sessionuser'] = user;
102
+ this.logger.verbose('User roles: ' + user.getRoles().join(','));
131
103
 
132
104
  next();
105
+ return;
133
106
  }
134
107
  } catch (err) {
135
- this.logger.error(err);
108
+ let errorMsg: string = <string>err;
109
+ if (err instanceof Error) {
110
+ errorMsg = 'Code: ' + err.name + ', Msg: ' + err.message;
111
+ }
112
+ this.logger.error('Error set user context: ' + errorMsg);
136
113
  throw new BadRequestException(err);
137
114
  }
138
115
  }
@@ -1,6 +1,5 @@
1
1
  /**
2
- * This file was automatically generated by simpleapp generator.
3
- * DONT CHANGE THIS FILE !!
2
+ * This file was automatically generated by simpleapp generator. Every
4
3
  * MODIFICATION OVERRIDE BY GENERATEOR
5
4
  * last change 2024-03-19
6
5
  * Author: Ks Tan
@@ -9,8 +8,9 @@ import { Injectable, Logger } from '@nestjs/common';
9
8
  import { InjectModel } from '@nestjs/mongoose';
10
9
  import { Model } from 'mongoose';
11
10
  import { UserContext } from 'src/simpleapp/generate/commons/user.context';
12
- import { User } from 'src/simpleapp/services/user.service';
13
11
  import { Permission } from 'src/simpleapp/services/perm.service';
12
+ import { User } from 'src/simpleapp/services/user.service';
13
+ import { Appintegration } from 'src/simpleapp/services/appintegration.service';
14
14
  const Base64URL = require('@darkwolf/base64url');
15
15
  @Injectable()
16
16
  export class SimpleAppRobotUserService {
@@ -21,6 +21,7 @@ export class SimpleAppRobotUserService {
21
21
  logger = new Logger();
22
22
  @InjectModel('User') private readonly usermodel: Model<User>;
23
23
  @InjectModel('Permission') private readonly permmodel: Model<Permission>;
24
+ @InjectModel('Appintegration') private readonly appmodel: Model<Appintegration>;
24
25
 
25
26
  constructor() {
26
27
  this.init();
@@ -77,7 +78,7 @@ export class SimpleAppRobotUserService {
77
78
  });
78
79
 
79
80
  this.setToken(tokens.access_token);
80
- console.log("access token ",this.getToken())
81
+ // console.log('access token ', this.getToken());
81
82
  const nextrefresh = tokens.expires_in * 0.8;
82
83
  const appuser = this.prepareAppUser(undefined);
83
84
 
@@ -89,23 +90,23 @@ export class SimpleAppRobotUserService {
89
90
  }
90
91
 
91
92
  prepareAppUser(data: any) {
92
- console.log("prepareAppUserprepareAppUser");
93
- const appuser = new UserContext(this.usermodel, this.permmodel);
93
+ // console.log('prepareAppUserprepareAppUser');
94
+ const appuser = new UserContext(this.usermodel, this.permmodel, this.appmodel);
94
95
  appuser.setAsStaticUser(
95
96
  '00000000-0000-0000-0000-000000000000',
96
97
  'robot',
97
98
  'Robot',
98
99
  'robot@a.org',
99
- Base64URL.encodeText('0-0-0')
100
+ Base64URL.encodeText('0-0-0'),
100
101
  );
101
102
 
102
103
  const tenantId = data?.tenantId ?? 0;
103
104
  const orgId = data?.orgId ?? 0;
104
105
  const branchId = data?.branchId ?? 0;
105
106
 
106
- appuser.setXorg(appuser.generateXorg(tenantId, orgId, branchId));
107
+ appuser.setXOrg(appuser.generateXOrg(tenantId, orgId, branchId));
107
108
  appuser.setUserToken(this.getToken());
108
-
109
+
109
110
  return appuser;
110
111
  }
111
112
  }
@@ -24,9 +24,16 @@ export class RolesGuard implements CanActivate {
24
24
  const requiredRoles = this.reflector.getAllAndOverride<Role[]>(ROLES_KEY, [
25
25
  context.getHandler(),
26
26
  context.getClass(),
27
- ]);
27
+ ]) || [];
28
+ const criticalRoles = [Role.SuperAdmin, Role.SuperUser, Role.TenantOwner];
28
29
 
29
- let sessionuser:UserContext
30
+ criticalRoles.forEach((role) => {
31
+ if (!requiredRoles.includes(role)) {
32
+ requiredRoles.push(role);
33
+ }
34
+ });
35
+
36
+ let sessionuser: UserContext;
30
37
  if (context.getType() == 'http') {
31
38
  const request = context.switchToHttp().getRequest();
32
39
  sessionuser = request['sessionuser'];
@@ -34,7 +41,7 @@ export class RolesGuard implements CanActivate {
34
41
  const req = context.getArgs()[2].req;
35
42
  sessionuser = req['sessionuser'];
36
43
  }
37
-
44
+
38
45
  if (!requiredRoles) {
39
46
  return true;
40
47
  }
@@ -1,3 +1,9 @@
1
+ /**
2
+ * This file was automatically generated by simpleapp generator. Every
3
+ * MODIFICATION OVERRIDE BY GENERATEOR
4
+ * last change 2024-03-17
5
+ * Author: Ks Tan
6
+ */
1
7
  import {
2
8
  BadRequestException,
3
9
  Injectable,
@@ -11,27 +17,22 @@ import {
11
17
  Webhook,
12
18
  WebhookService,
13
19
  } from 'src/simpleapp/services/webhook.service';
14
- import {alldocuments} from 'src/simpleapp/generate/commons/dicts/documents'
20
+ import { alldocuments } from 'src/simpleapp/generate/commons/dicts/documents';
15
21
 
16
22
  @Injectable()
17
23
  export class RunWebhookService {
18
- private webhookApiKey = process.env.WEBHOOK_SERVER_APIKEY
19
- private webhookAppId=process.env.WEBHOOK_SERVER_APP_ID
24
+ private webhookApiKey = process.env.WEBHOOK_SERVER_APIKEY;
25
+ private webhookAppId = process.env.WEBHOOK_SERVER_APP_ID;
20
26
  private webhookurl = process.env.WEBHOOK_SERVER_URL;
21
- private webhookprefix = process.env.PROJECT_CODE+'.'
22
- private webhookeventurl = `${process.env.WEBHOOK_SERVER_URL}/event/`;
23
- private webhookeventtypeurl = `${process.env.WEBHOOK_SERVER_URL}/event_types/`;
24
- private webhooksync:boolean = process.env.WEBHOOKER_SYNC_EVENTTYPE=='true'
27
+ private webhookprefix = process.env.PROJECT_CODE + '.';
28
+ private webhookeventurl = `${process.env.WEBHOOK_SERVER_URL}/event/`;
29
+ private webhookeventtypeurl = `${process.env.WEBHOOK_SERVER_URL}/event_types/`;
30
+ private webhooksync: boolean = process.env.WEBHOOKER_SYNC_EVENTTYPE == 'true';
25
31
 
26
-
27
-
28
- public constructor(
29
- private webhookService: WebhookService,
30
- ) {
31
- if(this.webhooksync) this.syncEventTypes()
32
+ public constructor(private webhookService: WebhookService) {
33
+ if (this.webhooksync) this.syncEventTypes();
32
34
  }
33
35
 
34
-
35
36
  @OnEvent('webhook')
36
37
  async loadWebhook(
37
38
  appuser: UserContext,
@@ -39,18 +40,16 @@ export class RunWebhookService {
39
40
  actionName: string,
40
41
  data?: any,
41
42
  ) {
42
-
43
43
  //no webhook server implemented
44
- if(!this.webhookApiKey) return true
45
-
44
+ if (!this.webhookApiKey) return true;
46
45
 
47
46
  const filter = {
48
- eventTypes: documentName + '.' + actionName ,
47
+ eventTypes: documentName + '.' + actionName,
49
48
  active: true,
50
- }
51
- console.log("Load webhook",documentName,actionName,filter)
49
+ };
50
+ // console.log('Load webhook', documentName, actionName, filter);
52
51
  const webhooks = await this.webhookService.search(appuser, filter);
53
- console.log("Loaded webhook",webhooks)
52
+ // console.log('Loaded webhook', webhooks);
54
53
  if (webhooks.length == 0) return;
55
54
 
56
55
  for (let i = 0; i < webhooks.length; i++) {
@@ -76,10 +75,9 @@ export class RunWebhookService {
76
75
  actionName: string,
77
76
  data: any,
78
77
  ) {
79
-
80
78
  const headers = {};
81
79
 
82
- console.log("Run webhook ",documentName,actionName)
80
+ // console.log('Run webhook ', documentName, actionName);
83
81
  if (Array.isArray(webhook.headers)) {
84
82
  webhook.headers.forEach((h) => {
85
83
  headers[h.name] = h.value;
@@ -88,7 +86,7 @@ export class RunWebhookService {
88
86
  headers['accept'] = 'application/json';
89
87
  headers['content-type'] = 'application/json';
90
88
  headers['Authorization'] = this.webhookApiKey;
91
- const eventname = `${this.webhookprefix}${documentName}.${actionName}`
89
+ const eventname = `${this.webhookprefix}${documentName}.${actionName}`;
92
90
  const options = {
93
91
  method: webhook.requestMethod.toUpperCase(),
94
92
  headers: headers,
@@ -109,93 +107,89 @@ export class RunWebhookService {
109
107
  }),
110
108
  };
111
109
  try {
112
- console.log("webhook request ",this.webhookeventurl,options)
110
+ // console.log('webhook request ', this.webhookeventurl, options);
113
111
  const req = await fetch(this.webhookeventurl, options);
114
112
  const statusCode = req.status;
115
- if(statusCode>=300){
116
- throw new InternalServerErrorException(`create event ${eventname} failed to webhook server`)
113
+ if (statusCode >= 300) {
114
+ throw new InternalServerErrorException(
115
+ `create event ${eventname} failed to webhook server`,
116
+ );
117
117
  }
118
-
118
+
119
119
  // const body = req.body;
120
120
  } catch (e) {
121
- return e
121
+ return e;
122
122
  }
123
123
  }
124
124
 
125
-
126
-
127
- async syncEventTypes(){
125
+ async syncEventTypes() {
128
126
  const options = {
129
- method: 'GET',
127
+ method: 'GET',
130
128
  headers: {
131
129
  accept: 'application/json',
132
- Authorization: this.webhookApiKey
133
- }};
130
+ Authorization: this.webhookApiKey,
131
+ },
132
+ };
134
133
  // {
135
134
  // "service_name": "billing",
136
135
  // "resource_type_name": "invoice",
137
136
  // "verb_name": "documentno",
138
137
  // "event_type_name": "billing.invoice.documentno"
139
138
  // },
140
- try{
141
-
142
-
143
- const res = await fetch(
144
- `${this.webhookeventtypeurl}?application_id=${this.webhookAppId}`,
145
- options)
146
-
147
- const locallist = this.getSchemaEventTypes()
148
- const eventlist = (await res.json()).map(item=>item.event_type_name)
149
-
150
- for(let i=0; i<locallist.length;i++){
151
- const item = locallist[i]
152
- if(!eventlist.includes(item)){
153
- //create remote event type
154
- await this.createEventType(item)
139
+ try {
140
+ const res = await fetch(
141
+ `${this.webhookeventtypeurl}?application_id=${this.webhookAppId}`,
142
+ options,
143
+ );
144
+
145
+ const locallist = this.getSchemaEventTypes();
146
+ const eventlist = (await res.json()).map((item) => item.event_type_name);
147
+
148
+ for (let i = 0; i < locallist.length; i++) {
149
+ const item = locallist[i];
150
+ if (!eventlist.includes(item)) {
151
+ //create remote event type
152
+ await this.createEventType(item);
153
+ }
155
154
  }
155
+ } catch (e) {
156
+ throw new InternalServerErrorException(e);
156
157
  }
157
-
158
-
159
- }catch(e){
160
- throw new InternalServerErrorException(e)
161
- }
162
-
163
-
164
158
  }
165
159
 
166
-
167
- async createEventType(eventname:string){
168
- const para = eventname.split('.')
160
+ async createEventType(eventname: string) {
161
+ const para = eventname.split('.');
169
162
  const options = {
170
163
  method: 'POST',
171
164
  headers: {
172
165
  accept: 'application/json',
173
166
  'content-type': 'application/json',
174
- Authorization: this.webhookApiKey
167
+ Authorization: this.webhookApiKey,
175
168
  },
176
169
  body: JSON.stringify({
177
170
  application_id: this.webhookAppId,
178
171
  resource_type: para[0],
179
172
  service: para[1],
180
- verb: para[2]
181
- })
173
+ verb: para[2],
174
+ }),
182
175
  };
183
176
 
184
- await fetch(this.webhookeventtypeurl, options)
185
- // .then(response => response.json())
186
- // .then(response => console.log(response))
187
- // .catch(err => console.error(err));
177
+ await fetch(this.webhookeventtypeurl, options);
178
+ // .then(response => response.json())
179
+ // .then(response => console.log(response))
180
+ // .catch(err => console.error(err));
188
181
  }
189
- getSchemaEventTypes(){
190
- const alleventtypes:string[] = []
191
- alldocuments.filter(item=>Array.isArray(item.webhook))
192
- .forEach(item=>{
193
- item.webhook.forEach(h=>{
182
+ getSchemaEventTypes() {
183
+ const alleventtypes: string[] = [];
184
+ alldocuments
185
+ .filter((item) => Array.isArray(item.webhook))
186
+ .forEach((item) => {
187
+ item.webhook.forEach((h) => {
194
188
  alleventtypes.push(
195
- `${this.webhookprefix}${item.docName.toLowerCase()}.${h}`)
196
- })
197
- })
198
- return alleventtypes
199
-
189
+ `${this.webhookprefix}${item.docName.toLowerCase()}.${h}`,
190
+ );
191
+ });
192
+ });
193
+ return alleventtypes;
200
194
  }
201
195
  }