@postxl/generators 1.18.0 → 1.20.0

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 (100) hide show
  1. package/dist/backend-actions/actions.generator.d.ts +1 -0
  2. package/dist/backend-actions/actions.generator.js +6 -0
  3. package/dist/backend-actions/actions.generator.js.map +1 -1
  4. package/dist/backend-actions/generators/actions-module.generator.js +3 -2
  5. package/dist/backend-actions/generators/actions-module.generator.js.map +1 -1
  6. package/dist/backend-actions/generators/authorization-policy-service.generator.d.ts +2 -0
  7. package/dist/backend-actions/generators/authorization-policy-service.generator.js +334 -0
  8. package/dist/backend-actions/generators/authorization-policy-service.generator.js.map +1 -0
  9. package/dist/backend-actions/generators/authorization-service.generator.d.ts +1 -1
  10. package/dist/backend-actions/generators/authorization-service.generator.js +20 -8
  11. package/dist/backend-actions/generators/authorization-service.generator.js.map +1 -1
  12. package/dist/backend-actions/generators/dispatcher-service.generator.js +10 -3
  13. package/dist/backend-actions/generators/dispatcher-service.generator.js.map +1 -1
  14. package/dist/backend-actions/generators/execution-class.generator.js +25 -4
  15. package/dist/backend-actions/generators/execution-class.generator.js.map +1 -1
  16. package/dist/backend-actions/generators/execution-interface.generator.js +4 -2
  17. package/dist/backend-actions/generators/execution-interface.generator.js.map +1 -1
  18. package/dist/backend-ai/generators/ai-route.generator.js +3 -3
  19. package/dist/backend-authentication/authentication.generator.js +22 -1
  20. package/dist/backend-authentication/authentication.generator.js.map +1 -1
  21. package/dist/backend-authentication/generators/auth-guard.generator.js +5 -8
  22. package/dist/backend-authentication/generators/auth-guard.generator.js.map +1 -1
  23. package/dist/backend-authentication/generators/authentication-module.generator.js +1 -1
  24. package/dist/backend-authentication/generators/authentication-service.generator.js +11 -8
  25. package/dist/backend-authentication/generators/authentication-service.generator.js.map +1 -1
  26. package/dist/backend-authentication/generators/authentication-types.generator.js +4 -3
  27. package/dist/backend-authentication/generators/authentication-types.generator.js.map +1 -1
  28. package/dist/backend-authentication/template/src/authentication.config.ts +9 -0
  29. package/dist/backend-authentication/template/src/authentication.mock.service.ts +77 -13
  30. package/dist/backend-authentication/template/src/utils.ts +45 -0
  31. package/dist/backend-core/backend.generator.js +17 -1
  32. package/dist/backend-core/backend.generator.js.map +1 -1
  33. package/dist/backend-core/generators/api-config.generator.js +5 -0
  34. package/dist/backend-core/generators/api-config.generator.js.map +1 -1
  35. package/dist/backend-core/types.d.ts +4 -0
  36. package/dist/backend-excel-io/generators/excel-io-service.generator.js +27 -11
  37. package/dist/backend-excel-io/generators/excel-io-service.generator.js.map +1 -1
  38. package/dist/backend-excel-io/template/excel-io.controller.ts +3 -3
  39. package/dist/backend-rest-api/generators/model-controller.generator.js +9 -5
  40. package/dist/backend-rest-api/generators/model-controller.generator.js.map +1 -1
  41. package/dist/backend-rest-api/template/restApi/src/restApi.utils.ts +9 -0
  42. package/dist/backend-router-trpc/generators/audit-log-route.generator.js +2 -2
  43. package/dist/backend-router-trpc/generators/excel-io-route.generator.js +1 -1
  44. package/dist/backend-router-trpc/generators/middleware.generator.js +8 -5
  45. package/dist/backend-router-trpc/generators/middleware.generator.js.map +1 -1
  46. package/dist/backend-router-trpc/generators/model-routes.generator.js +27 -7
  47. package/dist/backend-router-trpc/generators/model-routes.generator.js.map +1 -1
  48. package/dist/backend-router-trpc/generators/trpc-plugin.generator.js +9 -6
  49. package/dist/backend-router-trpc/generators/trpc-plugin.generator.js.map +1 -1
  50. package/dist/backend-router-trpc/generators/trpc-shared.generator.js +4 -24
  51. package/dist/backend-router-trpc/generators/trpc-shared.generator.js.map +1 -1
  52. package/dist/backend-router-trpc/router-trpc.generator.d.ts +4 -0
  53. package/dist/backend-router-trpc/router-trpc.generator.js +1 -0
  54. package/dist/backend-router-trpc/router-trpc.generator.js.map +1 -1
  55. package/dist/backend-router-trpc/template/viewer.router.ts +1 -6
  56. package/dist/backend-update/model-update-service.generator.js +72 -9
  57. package/dist/backend-update/model-update-service.generator.js.map +1 -1
  58. package/dist/backend-update/update-actions.decoders.d.ts +4 -4
  59. package/dist/backend-upload/template/src/upload.controller.ts +1 -1
  60. package/dist/backend-upload/template/src/upload.service.ts +11 -5
  61. package/dist/backend-view/model-view-service.generator.js +110 -52
  62. package/dist/backend-view/model-view-service.generator.js.map +1 -1
  63. package/dist/backend-view/view.generator.d.ts +2 -1
  64. package/dist/backend-view/view.generator.js +8 -1
  65. package/dist/backend-view/view.generator.js.map +1 -1
  66. package/dist/base/base.generator.js +2 -0
  67. package/dist/base/base.generator.js.map +1 -1
  68. package/dist/e2e/template/e2e/specs/example.spec.ts-snapshots/Navigate-to-homepage-and-take-snapshot-1-chromium-linux.png +0 -0
  69. package/dist/frontend-admin/admin.generator.js +2 -0
  70. package/dist/frontend-admin/admin.generator.js.map +1 -1
  71. package/dist/frontend-admin/generators/authorization-utils.generator.d.ts +1 -0
  72. package/dist/frontend-admin/generators/authorization-utils.generator.js +20 -0
  73. package/dist/frontend-admin/generators/authorization-utils.generator.js.map +1 -0
  74. package/dist/frontend-admin/generators/comment-sidebar.generator.js +9 -1
  75. package/dist/frontend-admin/generators/comment-sidebar.generator.js.map +1 -1
  76. package/dist/frontend-admin/generators/model-admin-page.generator.js +347 -184
  77. package/dist/frontend-admin/generators/model-admin-page.generator.js.map +1 -1
  78. package/dist/frontend-core/frontend.generator.d.ts +6 -0
  79. package/dist/frontend-core/frontend.generator.js +10 -3
  80. package/dist/frontend-core/frontend.generator.js.map +1 -1
  81. package/dist/frontend-core/template/README.md +2 -0
  82. package/dist/frontend-core/template/src/context-providers/auth-context-provider.tsx +1 -2
  83. package/dist/frontend-core/template/src/pages/dashboard/dashboard.page.tsx +10 -1
  84. package/dist/frontend-core/template/src/pages/login/login.page.tsx +1 -1
  85. package/dist/frontend-core/template/vite.config.ts +5 -0
  86. package/dist/frontend-core/types/component.d.ts +1 -1
  87. package/dist/frontend-core/types/contextprovider.d.ts +1 -1
  88. package/dist/frontend-core/types/hook.d.ts +1 -1
  89. package/dist/frontend-forms/generators/discriminated-union/inputs.generator.js +1 -1
  90. package/dist/frontend-forms/generators/discriminated-union/inputs.generator.js.map +1 -1
  91. package/dist/frontend-forms/generators/enum/inputs.generator.js +1 -1
  92. package/dist/frontend-forms/generators/enum/inputs.generator.js.map +1 -1
  93. package/dist/frontend-trpc-client/generators/model-hook.generator.js +104 -39
  94. package/dist/frontend-trpc-client/generators/model-hook.generator.js.map +1 -1
  95. package/dist/frontend-trpc-client/trpc-client.generator.js +28 -14
  96. package/dist/frontend-trpc-client/trpc-client.generator.js.map +1 -1
  97. package/dist/types/types.generator.d.ts +7 -0
  98. package/dist/types/types.generator.js +80 -0
  99. package/dist/types/types.generator.js.map +1 -1
  100. package/package.json +3 -3
@@ -26,6 +26,7 @@ export type ActionsContext = {
26
26
  */
27
27
  readonly authorization: {
28
28
  readonly service: Generator.ImportableClass;
29
+ readonly policy: Generator.ImportableClass;
29
30
  };
30
31
  /**
31
32
  * The class that executes the actions
@@ -48,6 +48,7 @@ const types_1 = require("../types");
48
48
  const action_types_generator_1 = require("./generators/action-types.generator");
49
49
  const actions_config_class_generator_1 = require("./generators/actions-config-class.generator");
50
50
  const actions_module_generator_1 = require("./generators/actions-module.generator");
51
+ const authorization_policy_service_generator_1 = require("./generators/authorization-policy-service.generator");
51
52
  const authorization_service_generator_1 = require("./generators/authorization-service.generator");
52
53
  const dispatcher_service_generator_1 = require("./generators/dispatcher-service.generator");
53
54
  const execution_class_generator_1 = require("./generators/execution-class.generator");
@@ -100,6 +101,10 @@ exports.generator = {
100
101
  name: Generator.toClassName('AuthorizationService'),
101
102
  location: Generator.toBackendModuleLocation(`@actions/authorization/authorization.service`),
102
103
  },
104
+ policy: {
105
+ name: Generator.toClassName('AuthorizationPolicyService'),
106
+ location: Generator.toBackendModuleLocation(`@actions/authorization/authorization-policy.service`),
107
+ },
103
108
  },
104
109
  execution: {
105
110
  interface: {
@@ -180,6 +185,7 @@ exports.generator = {
180
185
  const srcVfs = new Generator.VirtualFileSystem();
181
186
  srcVfs.write(Generator.toLocalFile(actions.dispatcher), (0, dispatcher_service_generator_1.generateDispatcher)(context));
182
187
  srcVfs.write(Generator.toLocalFile(actions.authorization.service), (0, authorization_service_generator_1.generateAuthorizationService)(context));
188
+ srcVfs.write(Generator.toLocalFile(actions.authorization.policy), (0, authorization_policy_service_generator_1.generateAuthorizationPolicyService)(context));
183
189
  srcVfs.write(Generator.toLocalFile(actions.execution.class), (0, execution_class_generator_1.generateActionExecutionClass)(context));
184
190
  srcVfs.write(Generator.toLocalFile(actions.execution.interface), (0, execution_interface_generator_1.generateActionExecutionInterface)(context));
185
191
  srcVfs.write(Generator.toLocalFile(actions.summary.action), (0, action_types_generator_1.generateActionTypes)(actions));
@@ -1 +1 @@
1
- {"version":3,"file":"actions.generator.js","sourceRoot":"","sources":["../../src/backend-actions/actions.generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,yCAAmC;AACnC,8CAAmB;AAEnB,6DAA8C;AAC9C,uDAAwC;AAExC,kDAA+E;AAC/E,wEAA8E;AAC9E,kCAAmD;AACnD,oCAAsD;AAEtD,gFAAyE;AACzE,gGAAmF;AACnF,oFAA6E;AAC7E,kGAA2F;AAC3F,4FAA8E;AAC9E,sFAAqF;AACrF,8FAA6F;AA+G7F,MAAM,UAAU,GAAG,aAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,eAAe,CAAC,CAAA;AAK7C,MAAM,WAAW,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;AAAxD,QAAA,WAAW,eAA6C;AAmBxD,QAAA,WAAW,GAAG,SAAS,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,CAAA;AAEjE,QAAA,SAAS,GAAiC;IACrD,EAAE,EAAE,mBAAW;IACf,QAAQ,EAAE,CAAC,iCAAkB,EAAE,sBAAe,EAAE,wBAAgB,EAAE,6CAAmB,CAAC;IAEtF,QAAQ,EAAE,CAAsC,OAAgB,EAAwB,EAAE;QACxF,aAAa,CAAC,OAAO,CAAC,CAAA;QAEtB,MAAM,MAAM,GAA6B;YACvC,IAAI,EAAE,SAAS,CAAC,WAAW,CAAC,eAAe,CAAC;YAC5C,QAAQ,EAAE,SAAS,CAAC,uBAAuB,CAAC,yBAAyB,CAAC;SACvE,CAAA;QAED,MAAM,cAAc,GAAG,SAAS,CAAC,uBAAuB,CAAC,+BAA+B,CAAC,CAAA;QACzF,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,SAAS,CAAC,WAAW,CAAC,eAAe,CAAC;YAC5C,QAAQ,EAAE,cAAc;YACxB,OAAO,EAAE;gBACP,IAAI,EAAE,SAAS,CAAC,UAAU,CAAC,sBAAsB,CAAC;gBAClD,QAAQ,EAAE,cAAc;aACzB;SACF,CAAA;QAED,MAAM,aAAa,GAAiB;YAClC,IAAI,EAAE,SAAS,CAAC,mBAAmB,CAAC,SAAS,CAAC;YAC9C,WAAW,EAAE,MAAM;YACnB,qBAAqB,EAAE;gBACrB,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,uCAAuC,CAAC;aAC5D;YACD,SAAS,EAAE;gBACT,WAAW,EAAE,SAAS,CAAC,EAAE,CAAC,yCAAyC,CAAC;gBACpE,kFAAkF;gBAClF,aAAa,EAAE,EAAE;gBACjB,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;aAC1B;SACF,CAAA;QACD,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;QAE3C,MAAM,OAAO,GAAmB;YAC9B,MAAM;YACN,MAAM;YACN,UAAU,EAAE;gBACV,IAAI,EAAE,SAAS,CAAC,WAAW,CAAC,mBAAmB,CAAC;gBAChD,QAAQ,EAAE,SAAS,CAAC,uBAAuB,CAAC,6BAA6B,CAAC;aAC3E;YACD,aAAa,EAAE;gBACb,OAAO,EAAE;oBACP,IAAI,EAAE,SAAS,CAAC,WAAW,CAAC,sBAAsB,CAAC;oBACnD,QAAQ,EAAE,SAAS,CAAC,uBAAuB,CAAC,8CAA8C,CAAC;iBAC5F;aACF;YACD,SAAS,EAAE;gBACT,SAAS,EAAE;oBACT,IAAI,EAAE,SAAS,CAAC,UAAU,CAAC,kBAAkB,CAAC;oBAC9C,QAAQ,EAAE,SAAS,CAAC,uBAAuB,CAAC,wCAAwC,CAAC;oBACrF,iBAAiB,EAAE;wBACjB,IAAI,EAAE,SAAS,CAAC,UAAU,CAAC,mBAAmB,CAAC;wBAC/C,QAAQ,EAAE,SAAS,CAAC,uBAAuB,CAAC,wCAAwC,CAAC;qBACtF;oBACD,0BAA0B,EAAE;wBAC1B,IAAI,EAAE,SAAS,CAAC,cAAc,CAAC,qBAAqB,CAAC;wBACrD,QAAQ,EAAE,SAAS,CAAC,uBAAuB,CAAC,wCAAwC,CAAC;qBACtF;iBACF;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,SAAS,CAAC,WAAW,CAAC,wBAAwB,CAAC;oBACrD,QAAQ,EAAE,SAAS,CAAC,uBAAuB,CAAC,oCAAoC,CAAC;iBAClF;gBACD,aAAa,EAAE,SAAS,CAAC,WAAW,CAAC,iBAAiB,CAAC;gBACvD,SAAS,EAAE;oBACT,MAAM,EAAE;wBACN,KAAK,EAAE,SAAS,CAAC,cAAc,CAAC,qBAAqB,CAAC;wBACtD,MAAM,EAAE,SAAS,CAAC,cAAc,CAAC,sBAAsB,CAAC;qBACzD;oBACD,UAAU,EAAE;wBACV,KAAK,EAAE,SAAS,CAAC,cAAc,CAAC,yBAAyB,CAAC;wBAC1D,MAAM,EAAE,SAAS,CAAC,cAAc,CAAC,0BAA0B,CAAC;qBAC7D;oBACD,MAAM,EAAE;wBACN,KAAK,EAAE,SAAS,CAAC,cAAc,CAAC,qBAAqB,CAAC;wBACtD,MAAM,EAAE,SAAS,CAAC,cAAc,CAAC,sBAAsB,CAAC;qBACzD;oBACD,UAAU,EAAE;wBACV,KAAK,EAAE,SAAS,CAAC,cAAc,CAAC,yBAAyB,CAAC;wBAC1D,MAAM,EAAE,SAAS,CAAC,cAAc,CAAC,0BAA0B,CAAC;qBAC7D;oBACD,MAAM,EAAE;wBACN,KAAK,EAAE,SAAS,CAAC,cAAc,CAAC,qBAAqB,CAAC;wBACtD,MAAM,EAAE,SAAS,CAAC,cAAc,CAAC,sBAAsB,CAAC;qBACzD;oBACD,UAAU,EAAE;wBACV,KAAK,EAAE,SAAS,CAAC,cAAc,CAAC,yBAAyB,CAAC;wBAC1D,MAAM,EAAE,SAAS,CAAC,cAAc,CAAC,0BAA0B,CAAC;qBAC7D;oBACD,KAAK,EAAE;wBACL,KAAK,EAAE,SAAS,CAAC,cAAc,CAAC,oBAAoB,CAAC;wBACrD,MAAM,EAAE,SAAS,CAAC,cAAc,CAAC,qBAAqB,CAAC;qBACxD;iBACF;gBACD,cAAc,EAAE;oBACd,eAAe,EAAE,SAAS,CAAC,cAAc,CAAC,wBAAwB,CAAC;oBACnE,aAAa,EAAE,SAAS,CAAC,cAAc,CAAC,uBAAuB,CAAC;oBAChE,KAAK,EAAE,SAAS,CAAC,cAAc,CAAC,qBAAqB,CAAC;oBACtD,MAAM,EAAE,SAAS,CAAC,cAAc,CAAC,sBAAsB,CAAC;iBACzD;gBACD,cAAc,EAAE,SAAS,CAAC,cAAc,CAAC,sBAAsB,CAAC;aACjE;YACD,SAAS,EAAE,EAAE;YACb,OAAO,EAAE;gBACP,MAAM,EAAE;oBACN,IAAI,EAAE,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC;oBACpC,QAAQ,EAAE,SAAS,CAAC,uBAAuB,CAAC,wBAAwB,CAAC;iBACtE;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,SAAS,CAAC,UAAU,CAAC,cAAc,CAAC;oBAC1C,QAAQ,EAAE,SAAS,CAAC,uBAAuB,CAAC,wBAAwB,CAAC;iBACtE;gBACD,oBAAoB,EAAE;oBACpB,IAAI,EAAE,SAAS,CAAC,UAAU,CAAC,gBAAgB,CAAC;oBAC5C,QAAQ,EAAE,SAAS,CAAC,uBAAuB,CAAC,wBAAwB,CAAC;iBACtE;aACF;SACF,CAAA;QACD,OAAO,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,CAAA;IAChC,CAAC;IAED,QAAQ,EAAE,KAAK,EAAiC,OAAgB,EAAoB,EAAE;QACpF,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;QAE3B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,iBAAiB,EAAE,CAAA;QAChD,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,IAAA,iDAAkB,EAAC,OAAO,CAAC,CAAC,CAAA;QACpF,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,IAAA,8DAA4B,EAAC,OAAO,CAAC,CAAC,CAAA;QACzG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,IAAA,wDAA4B,EAAC,OAAO,CAAC,CAAC,CAAA;QACnG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,IAAA,gEAAgC,EAAC,OAAO,CAAC,CAAC,CAAA;QAC3G,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAA,4CAAmB,EAAC,OAAO,CAAC,CAAC,CAAA;QACzF,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAA,sDAAqB,EAAC,OAAO,CAAC,CAAC,CAAA;QACnF,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,IAAA,gDAAqB,EAAC,OAAO,CAAC,CAAC,CAAA;QAEnF,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,iBAAiB,EAAE,CAAA;QAC7C,GAAG,CAAC,aAAa,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAA;QACrD,GAAG,CAAC,KAAK,CAAC,oBAAoB,EAAE,SAAS,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAA;QAEpE,MAAM,GAAG,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAA,mBAAO,EAAC,SAAS,EAAE,YAAY,CAAC,EAAE,CAAC,CAAA;QAEpE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,UAAU,EAAE,sBAAsB,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAA;QAE3E,OAAO,OAAO,CAAA;IAChB,CAAC;CACF,CAAA;AACD,SAAS,aAAa,CAAoC,OAAgB;IACxE,SAAS,CAAC,iBAAiB,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACrE,SAAS,CAAC,iBAAiB,CAAC,MAAM,CAAC,iBAAiB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IACvE,SAAS,CAAC,iBAAiB,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACnE,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAC,gBAAgB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;IACzE,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE,OAAO,CAAC,CAAA;IAC3E,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAC,gBAAgB,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;AAC3E,CAAC"}
1
+ {"version":3,"file":"actions.generator.js","sourceRoot":"","sources":["../../src/backend-actions/actions.generator.ts"],"names":[],"mappings":"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"}
@@ -8,6 +8,7 @@ function generateActionsModule({ actions, database }) {
8
8
  .from(actions.module.location)
9
9
  .add(actions.execution.class)
10
10
  .add(actions.dispatcher)
11
+ .add(actions.authorization.policy)
11
12
  .add(actions.authorization.service)
12
13
  .add(actions.config)
13
14
  .addType(actions.config.options)
@@ -37,8 +38,8 @@ export class ${actions.module.name} {
37
38
  ${database.module.moduleClass.name},
38
39
  ${moduleImports.join(',\n')}
39
40
  ],
40
- providers: [${actions.dispatcher.name}, ${actions.execution.class.name}, ${actions.authorization.service.name}, configProvider],
41
- exports: [${actions.dispatcher.name}, ${actions.execution.class.name}, ${actions.authorization.service.name}],
41
+ providers: [${actions.dispatcher.name}, ${actions.execution.class.name}, ${actions.authorization.policy.name}, ${actions.authorization.service.name}, configProvider],
42
+ exports: [${actions.dispatcher.name}, ${actions.execution.class.name}, ${actions.authorization.policy.name}, ${actions.authorization.service.name}],
42
43
  global: true
43
44
  }
44
45
  }
@@ -1 +1 @@
1
- {"version":3,"file":"actions-module.generator.js","sourceRoot":"","sources":["../../../src/backend-actions/generators/actions-module.generator.ts"],"names":[],"mappings":";;AAIA,sDA6CC;AAjDD,iDAAmD;AAInD,SAAgB,qBAAqB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAiB;IACxE,MAAM,OAAO,GAAG,2BAAe;QAC7B,EAAE;SACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;SAC7B,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC;SAC5B,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC;SACvB,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC;SAClC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;SACnB,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;SAC/B,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAY,CAAC,CAAA,CAAC,UAAU;IAE/C,MAAM,aAAa,GAAa,EAAE,CAAA;IAClC,KAAK,MAAM,EACT,MAAM,EAAE,EAAE,WAAW,EAAE,GACxB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACvB,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,SAAQ;QACV,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QACxB,aAAa,CAAC,IAAI,CAAC,oBAAoB,WAAW,CAAC,IAAI,GAAG,CAAC,CAAA;IAC7D,CAAC;IAED,OAAO,QAAQ,CAAC;;;EAGhB,OAAO,CAAC,QAAQ,EAAE;;eAEL,OAAO,CAAC,MAAM,CAAC,IAAI;mCACC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI;;iBAE7C,OAAO,CAAC,MAAM,CAAC,IAAI;sBACd,OAAO,CAAC,MAAM,CAAC,IAAI;;;gBAGzB,OAAO,CAAC,MAAM,CAAC,IAAI;;UAEzB,QAAQ,CAAC,MAAM,CAAC,WAAY,CAAC,IAAI;UACjC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;;oBAEf,OAAO,CAAC,UAAU,CAAC,IAAI,KAAK,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI;kBACjG,OAAO,CAAC,UAAU,CAAC,IAAI,KAAK,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI;;;;EAI/G,CAAA;AACF,CAAC"}
1
+ {"version":3,"file":"actions-module.generator.js","sourceRoot":"","sources":["../../../src/backend-actions/generators/actions-module.generator.ts"],"names":[],"mappings":";;AAIA,sDA8CC;AAlDD,iDAAmD;AAInD,SAAgB,qBAAqB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAiB;IACxE,MAAM,OAAO,GAAG,2BAAe;QAC7B,EAAE;SACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;SAC7B,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC;SAC5B,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC;SACvB,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC;SACjC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC;SAClC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;SACnB,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;SAC/B,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAY,CAAC,CAAA,CAAC,UAAU;IAE/C,MAAM,aAAa,GAAa,EAAE,CAAA;IAClC,KAAK,MAAM,EACT,MAAM,EAAE,EAAE,WAAW,EAAE,GACxB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACvB,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,SAAQ;QACV,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QACxB,aAAa,CAAC,IAAI,CAAC,oBAAoB,WAAW,CAAC,IAAI,GAAG,CAAC,CAAA;IAC7D,CAAC;IAED,OAAO,QAAQ,CAAC;;;EAGhB,OAAO,CAAC,QAAQ,EAAE;;eAEL,OAAO,CAAC,MAAM,CAAC,IAAI;mCACC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI;;iBAE7C,OAAO,CAAC,MAAM,CAAC,IAAI;sBACd,OAAO,CAAC,MAAM,CAAC,IAAI;;;gBAGzB,OAAO,CAAC,MAAM,CAAC,IAAI;;UAEzB,QAAQ,CAAC,MAAM,CAAC,WAAY,CAAC,IAAI;UACjC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC;;oBAEf,OAAO,CAAC,UAAU,CAAC,IAAI,KAAK,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI;kBACvI,OAAO,CAAC,UAAU,CAAC,IAAI,KAAK,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,KAAK,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI;;;;EAIrJ,CAAA;AACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { ContextResult } from '../actions.generator';
2
+ export declare function generateAuthorizationPolicyService({ actions, schema, types }: ContextResult): string;
@@ -0,0 +1,334 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateAuthorizationPolicyService = generateAuthorizationPolicyService;
4
+ const generator_1 = require("@postxl/generator");
5
+ function stringifyAuthRuleSet(input) {
6
+ if (!input) {
7
+ return '{}';
8
+ }
9
+ const typedInput = input;
10
+ const result = {};
11
+ if (typedInput.read) {
12
+ result.read = typedInput.read;
13
+ }
14
+ if (typedInput.write) {
15
+ result.write = typedInput.write;
16
+ }
17
+ if (typedInput.create) {
18
+ result.create = typedInput.create;
19
+ }
20
+ if (typedInput.update) {
21
+ result.update = typedInput.update;
22
+ }
23
+ if (typedInput.delete) {
24
+ result.delete = typedInput.delete;
25
+ }
26
+ if (typedInput.actions) {
27
+ result.actions = typedInput.actions;
28
+ }
29
+ if (typedInput.adminUi) {
30
+ result.adminUi = typedInput.adminUi;
31
+ }
32
+ return JSON.stringify(result);
33
+ }
34
+ function stringifyAuthScopeRuleSet(input) {
35
+ if (!input) {
36
+ return '{}';
37
+ }
38
+ const typedInput = input;
39
+ const result = {};
40
+ if (typedInput.actions) {
41
+ result.actions = typedInput.actions;
42
+ }
43
+ return JSON.stringify(result);
44
+ }
45
+ function generateAuthorizationPolicyService({ actions, schema, types }) {
46
+ const imports = generator_1.ImportGenerator.from(actions.authorization.policy.location)
47
+ .addType(types.modelNames)
48
+ .addType(types.authorizationContext)
49
+ .addType(types.userRoles)
50
+ .addType(actions.summary.action);
51
+ const schemaRules = [...schema.schemaAuth.entries()]
52
+ .map(([schemaName, ruleSet]) => ` ${JSON.stringify(schemaName)}: ${stringifyAuthRuleSet(ruleSet)},`)
53
+ .join('\n');
54
+ const modelRules = schema.modelNames
55
+ .map((modelName) => {
56
+ const model = schema.models.get(modelName);
57
+ return ` ${JSON.stringify(modelName)}: ${stringifyAuthRuleSet(model?.auth)},`;
58
+ })
59
+ .join('\n');
60
+ const modelSchemas = schema.modelNames
61
+ .map((modelName) => {
62
+ const model = schema.models.get(modelName);
63
+ return ` ${JSON.stringify(modelName)}: ${JSON.stringify(model?.databaseSchema ?? schema.defaultDatabaseSchema)},`;
64
+ })
65
+ .join('\n');
66
+ const scopeRules = Object.entries(schema.auth?.scopes ?? {})
67
+ .map(([scope, ruleSet]) => ` ${JSON.stringify(scope)}: ${stringifyAuthScopeRuleSet(ruleSet)},`)
68
+ .join('\n');
69
+ const knownScopes = new Set();
70
+ for (const provider of actions.providers) {
71
+ for (const scope of provider.scopes) {
72
+ knownScopes.add(scope);
73
+ }
74
+ }
75
+ const scopeToModel = schema.modelNames
76
+ .map((modelName) => {
77
+ const scope = `${modelName.charAt(0).toLowerCase()}${modelName.slice(1)}`;
78
+ if (!knownScopes.has(scope)) {
79
+ return null;
80
+ }
81
+ return ` ${JSON.stringify(scope)}: ${JSON.stringify(modelName)},`;
82
+ })
83
+ .filter(Boolean)
84
+ .join('\n');
85
+ return /* ts */ `
86
+ import { Injectable } from '@nestjs/common'
87
+
88
+ ${imports.generate()}
89
+
90
+ type RoleRule = { anyRole: string[] }
91
+
92
+ type RuleSet = {
93
+ read?: RoleRule
94
+ write?: RoleRule
95
+ create?: RoleRule
96
+ update?: RoleRule
97
+ delete?: RoleRule
98
+ actions?: Record<string, RoleRule>
99
+ adminUi?: {
100
+ visibleFor: string[]
101
+ }
102
+ }
103
+
104
+ type Operation = 'read' | 'write' | 'create' | 'update' | 'delete'
105
+ type ActionScope = Action['scope']
106
+ type ScopeRuleSet = {
107
+ actions?: Record<string, RoleRule>
108
+ }
109
+ type PolicyRowId = string | number
110
+ type PolicyCheckKind = Operation | 'adminUi' | 'action'
111
+ type PolicyContext = {
112
+ authorization: AuthorizationContext
113
+ check: PolicyCheckKind
114
+ modelName?: ModelName
115
+ operation?: Operation
116
+ scope?: ActionScope
117
+ actionType?: string
118
+ id?: PolicyRowId
119
+ item?: unknown
120
+ }
121
+ type ModelPolicyParams = {
122
+ authorization: AuthorizationContext
123
+ modelName: ModelName
124
+ id?: PolicyRowId
125
+ item?: unknown
126
+ }
127
+
128
+ type PolicyMatrix = {
129
+ defaultDeny: boolean
130
+ schemas: Record<string, RuleSet>
131
+ models: Record<ModelName, RuleSet>
132
+ modelSchemas: Record<ModelName, string>
133
+ scopes: Partial<Record<ActionScope, ScopeRuleSet>>
134
+ scopeModels: Partial<Record<ActionScope, ModelName>>
135
+ }
136
+
137
+ @Injectable()
138
+ export class ${actions.authorization.policy.name} {
139
+ private readonly matrix: PolicyMatrix = {
140
+ defaultDeny: ${schema.auth?.defaultDeny ?? true},
141
+ schemas: {
142
+ ${schemaRules}
143
+ },
144
+ models: {
145
+ ${modelRules}
146
+ },
147
+ modelSchemas: {
148
+ ${modelSchemas}
149
+ },
150
+ scopes: {
151
+ ${scopeRules}
152
+ },
153
+ scopeModels: {
154
+ ${scopeToModel}
155
+ },
156
+ }
157
+
158
+ public canRead(params: ModelPolicyParams): boolean {
159
+ return this.canOperate({ ...params, operation: 'read' })
160
+ }
161
+
162
+ public canRunAction(params: {
163
+ authorization: AuthorizationContext
164
+ scope: ActionScope
165
+ actionType: string
166
+ id?: PolicyRowId
167
+ item?: unknown
168
+ }): boolean {
169
+ const scopeRules = this.matrix.scopes[params.scope]
170
+ const scopedRule = scopeRules?.actions?.[params.actionType] ?? scopeRules?.actions?.['*']
171
+ if (scopedRule) {
172
+ const isRoleAllowed = this.matchesAnyRole(params.authorization.userRoles, scopedRule.anyRole)
173
+ return this.applyCustomPolicy(
174
+ {
175
+ authorization: params.authorization,
176
+ check: 'action',
177
+ scope: params.scope,
178
+ actionType: params.actionType,
179
+ id: params.id,
180
+ item: params.item,
181
+ },
182
+ isRoleAllowed,
183
+ )
184
+ }
185
+
186
+ const modelName = this.matrix.scopeModels[params.scope]
187
+ if (modelName) {
188
+ const rules = this.getEffectiveRules(modelName)
189
+ const direct = rules.actions?.[params.actionType]
190
+ const wildcard = rules.actions?.['*']
191
+ const selectedRule = direct ?? wildcard
192
+
193
+ if (selectedRule) {
194
+ const isRoleAllowed = this.matchesAnyRole(params.authorization.userRoles, selectedRule.anyRole)
195
+ return this.applyCustomPolicy(
196
+ {
197
+ authorization: params.authorization,
198
+ check: 'action',
199
+ modelName,
200
+ scope: params.scope,
201
+ actionType: params.actionType,
202
+ id: params.id,
203
+ item: params.item,
204
+ },
205
+ isRoleAllowed,
206
+ )
207
+ }
208
+
209
+ return this.canOperate({
210
+ authorization: params.authorization,
211
+ modelName,
212
+ operation: 'write',
213
+ id: params.id,
214
+ item: params.item,
215
+ })
216
+ }
217
+
218
+ return this.applyCustomPolicy(
219
+ {
220
+ authorization: params.authorization,
221
+ check: 'action',
222
+ scope: params.scope,
223
+ actionType: params.actionType,
224
+ id: params.id,
225
+ item: params.item,
226
+ },
227
+ !this.matrix.defaultDeny,
228
+ )
229
+ }
230
+
231
+ public canWriteOperation(
232
+ params: ModelPolicyParams & { operation: Exclude<Operation, 'read'> },
233
+ ): boolean {
234
+ return this.canOperate(params)
235
+ }
236
+
237
+ public canAccessAdminUi(params: ModelPolicyParams): boolean {
238
+ const rules = this.getEffectiveRules(params.modelName)
239
+ const adminRule = rules.adminUi
240
+ if (adminRule) {
241
+ const isRoleAllowed = this.matchesAnyRole(params.authorization.userRoles, adminRule.visibleFor)
242
+ return this.applyCustomPolicy(
243
+ {
244
+ authorization: params.authorization,
245
+ check: 'adminUi',
246
+ modelName: params.modelName,
247
+ id: params.id,
248
+ item: params.item,
249
+ },
250
+ isRoleAllowed,
251
+ )
252
+ }
253
+ return this.applyCustomPolicy(
254
+ {
255
+ authorization: params.authorization,
256
+ check: 'adminUi',
257
+ modelName: params.modelName,
258
+ id: params.id,
259
+ item: params.item,
260
+ },
261
+ !this.matrix.defaultDeny,
262
+ )
263
+ }
264
+
265
+ private canOperate(params: ModelPolicyParams & { operation: Operation }): boolean {
266
+ const rules = this.getEffectiveRules(params.modelName)
267
+ const selectedRule =
268
+ rules[params.operation] ??
269
+ (params.operation === 'create' || params.operation === 'update' || params.operation === 'delete'
270
+ ? rules.write
271
+ : undefined)
272
+
273
+ if (!selectedRule) {
274
+ return this.applyCustomPolicy(
275
+ {
276
+ authorization: params.authorization,
277
+ check: params.operation,
278
+ modelName: params.modelName,
279
+ operation: params.operation,
280
+ id: params.id,
281
+ item: params.item,
282
+ },
283
+ !this.matrix.defaultDeny,
284
+ )
285
+ }
286
+
287
+ const isRoleAllowed = this.matchesAnyRole(params.authorization.userRoles, selectedRule.anyRole)
288
+ return this.applyCustomPolicy(
289
+ {
290
+ authorization: params.authorization,
291
+ check: params.operation,
292
+ modelName: params.modelName,
293
+ operation: params.operation,
294
+ id: params.id,
295
+ item: params.item,
296
+ },
297
+ isRoleAllowed,
298
+ )
299
+ }
300
+
301
+ private applyCustomPolicy(params: PolicyContext, isRoleAllowed: boolean): boolean {
302
+ if (!isRoleAllowed) {
303
+ return false
304
+ }
305
+
306
+ const customDecision = this.evaluateCustomPolicy(params)
307
+ return customDecision ?? true
308
+ }
309
+
310
+ protected evaluateCustomPolicy(_params: PolicyContext): boolean | undefined {
311
+ // @custom-start:authorizationPolicyRowRules
312
+ return undefined
313
+ // @custom-end:authorizationPolicyRowRules
314
+ }
315
+
316
+ private getEffectiveRules(modelName: ModelName): RuleSet {
317
+ const modelRules = this.matrix.models[modelName] ?? {}
318
+ const schemaName = this.matrix.modelSchemas[modelName]
319
+ const schemaRules = schemaName ? (this.matrix.schemas[schemaName] ?? {}) : {}
320
+ return { ...schemaRules, ...modelRules }
321
+ }
322
+
323
+ private matchesAnyRole(userRoles: UserRoles, requiredRoles: string[]): boolean {
324
+ for (const role of userRoles) {
325
+ if (requiredRoles.includes(role)) {
326
+ return true
327
+ }
328
+ }
329
+ return false
330
+ }
331
+ }
332
+ `;
333
+ }
334
+ //# sourceMappingURL=authorization-policy-service.generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorization-policy-service.generator.js","sourceRoot":"","sources":["../../../src/backend-actions/generators/authorization-policy-service.generator.ts"],"names":[],"mappings":";;AAwEA,gFAuSC;AA/WD,iDAAmD;AAwBnD,SAAS,oBAAoB,CAAC,KAAc;IAC1C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,UAAU,GAAG,KAAoB,CAAA;IACvC,MAAM,MAAM,GAAgB,EAAE,CAAA;IAE9B,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;QACpB,MAAM,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,CAAA;IAC/B,CAAC;IACD,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAA;IACjC,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAA;IACnC,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAA;IACnC,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAA;IACnC,CAAC;IACD,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;QACvB,MAAM,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAA;IACrC,CAAC;IACD,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;QACvB,MAAM,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAA;IACrC,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;AAC/B,CAAC;AAED,SAAS,yBAAyB,CAAC,KAAc;IAC/C,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,UAAU,GAAG,KAAyB,CAAA;IAC5C,MAAM,MAAM,GAAqB,EAAE,CAAA;IAEnC,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;QACvB,MAAM,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAA;IACrC,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;AAC/B,CAAC;AAED,SAAgB,kCAAkC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAiB;IAC1F,MAAM,OAAO,GAAG,2BAAe,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC;SACxE,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC;SACzB,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC;SACnC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC;SACxB,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAElC,MAAM,WAAW,GAAG,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;SACjD,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,oBAAoB,CAAC,OAAO,CAAC,GAAG,CAAC;SACtG,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU;SACjC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;QACjB,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC1C,OAAO,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,oBAAoB,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAA;IAClF,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU;SACnC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;QACjB,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAC1C,OAAO,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,cAAc,IAAI,MAAM,CAAC,qBAAqB,CAAC,GAAG,CAAA;IACtH,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,IAAI,EAAE,CAAC;SACzD,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,yBAAyB,CAAC,OAAO,CAAC,GAAG,CAAC;SACjG,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAA;IACrC,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACzC,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QACxB,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU;SACnC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE;QACjB,MAAM,KAAK,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;QACzE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAA;QACb,CAAC;QACD,OAAO,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAA;IACtE,CAAC,CAAC;SACD,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,OAAO,QAAQ,CAAC;;;EAGhB,OAAO,CAAC,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAkDL,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI;;mBAE7B,MAAM,CAAC,IAAI,EAAE,WAAW,IAAI,IAAI;;EAEjD,WAAW;;;EAGX,UAAU;;;EAGV,YAAY;;;EAGZ,UAAU;;;EAGV,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkLb,CAAA;AACD,CAAC"}
@@ -1,2 +1,2 @@
1
1
  import { ContextResult } from '../actions.generator';
2
- export declare function generateAuthorizationService({ actions, database, types }: ContextResult): string;
2
+ export declare function generateAuthorizationService({ actions, types, schema }: ContextResult): string;
@@ -2,31 +2,43 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.generateAuthorizationService = generateAuthorizationService;
4
4
  const generator_1 = require("@postxl/generator");
5
- function generateAuthorizationService({ actions, database, types }) {
5
+ function generateAuthorizationService({ actions, types, schema }) {
6
6
  const imports = generator_1.ImportGenerator.from(actions.authorization.service.location)
7
- .add(database.service)
7
+ .add(actions.authorization.policy)
8
8
  .addType(actions.summary.action)
9
- .addType(types.user)
9
+ .addType(types.authorizationContext)
10
10
  .addType(actions.execution.interface);
11
11
  return /* ts */ `
12
12
  import { Injectable, Logger } from '@nestjs/common'
13
13
 
14
14
  ${imports.generate()}
15
15
 
16
- type AuthorizationContext = {
16
+ type AuthorizeActionContext = AuthorizationContext & {
17
17
  action: Action
18
- user: User
19
18
  execution: IActionExecution
20
19
  }
21
20
 
22
21
  @Injectable()
23
22
  export class ${actions.authorization.service.name} {
24
23
  private readonly _logger = new Logger(${actions.authorization.service.name}.name)
24
+ private static readonly SYSTEM_USER_ID = ${JSON.stringify(schema.systemUser.id ?? 'root')}
25
25
 
26
- constructor(private readonly databaseService: DatabaseService) {}
26
+ constructor(private readonly authorizationPolicyService: ${actions.authorization.policy.name}) {}
27
27
 
28
- public async authorizeAction({ action: _action, user: _user, execution: _execution }: AuthorizationContext): Promise<boolean> {
29
- return Promise.resolve(true) // NOSONAR
28
+ public authorizeAction({ action, user, userRoles, execution: _execution }: AuthorizeActionContext): boolean {
29
+ if (user.id === ${actions.authorization.service.name}.SYSTEM_USER_ID) {
30
+ return true
31
+ }
32
+
33
+ const isAllowed = this.authorizationPolicyService.canRunAction({
34
+ authorization: { user, userRoles },
35
+ scope: action.scope,
36
+ actionType: action.type,
37
+ })
38
+ if (!isAllowed) {
39
+ this._logger.warn(\`Authorization denied for action scope/type "\${action.scope}.\${action.type}".\`)
40
+ }
41
+ return isAllowed
30
42
  }
31
43
 
32
44
  }
@@ -1 +1 @@
1
- {"version":3,"file":"authorization-service.generator.js","sourceRoot":"","sources":["../../../src/backend-actions/generators/authorization-service.generator.ts"],"names":[],"mappings":";;AAIA,oEA8BC;AAlCD,iDAAmD;AAInD,SAAgB,4BAA4B,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAiB;IACtF,MAAM,OAAO,GAAG,2BAAe,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC;SACzE,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;SACrB,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;SAC/B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC;SACnB,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;IAEvC,OAAO,QAAQ,CAAC;;;EAGhB,OAAO,CAAC,QAAQ,EAAE;;;;;;;;;eASL,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI;0CACP,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI;;;;;;;;;CAS3E,CAAA;AACD,CAAC"}
1
+ {"version":3,"file":"authorization-service.generator.js","sourceRoot":"","sources":["../../../src/backend-actions/generators/authorization-service.generator.ts"],"names":[],"mappings":";;AAIA,oEA0CC;AA9CD,iDAAmD;AAInD,SAAgB,4BAA4B,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAiB;IACpF,MAAM,OAAO,GAAG,2BAAe,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC;SACzE,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC;SACjC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;SAC/B,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC;SACnC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;IAEvC,OAAO,QAAQ,CAAC;;;EAGhB,OAAO,CAAC,QAAQ,EAAE;;;;;;;;eAQL,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI;0CACP,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI;6CAC/B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,IAAI,MAAM,CAAC;;6DAE9B,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI;;;sBAGxE,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI;;;;;;;;;;;;;;;;CAgBvD,CAAA;AACD,CAAC"}
@@ -12,6 +12,7 @@ function generateDispatcher({ actions, database, types }) {
12
12
  imports.add(actions.summary.resultOfActionHelper);
13
13
  imports.add(actions.authorization.service);
14
14
  imports.addType(types.user);
15
+ imports.addType(types.userRoles);
15
16
  const injections = [];
16
17
  const executeMethods = [];
17
18
  if (actions.providers.length === 0) {
@@ -50,10 +51,16 @@ export class DispatcherService {
50
51
  public async dispatch<
51
52
  A extends Action,
52
53
  Result = ${actions.summary.resultOfActionHelper.name}<A, ${actions.summary.result.name}>
53
- >({ action, user, migrationOrder }: { action: A; user: User; migrationOrder?: number }): Promise<Result> {
54
- const execution = await this.actionExecutionFactory.create({ action, databaseService: this.databaseService, user, migrationOrder })
54
+ >({ action, user, userRoles = [], migrationOrder }: { action: A; user: User; userRoles?: UserRoles; migrationOrder?: number }): Promise<Result> {
55
+ const execution = await this.actionExecutionFactory.create({
56
+ action,
57
+ databaseService: this.databaseService,
58
+ user,
59
+ userRoles,
60
+ migrationOrder,
61
+ })
55
62
 
56
- const isAuthorized = await this.authorizationService.authorizeAction({ action, user, execution })
63
+ const isAuthorized = this.authorizationService.authorizeAction({ action, user, userRoles, execution })
57
64
  if (!isAuthorized) {
58
65
  const message = \`User \${user.id} is not authorized to execute \${action.scope}.\${action.type}\`
59
66
  await execution.error(message)
@@ -1 +1 @@
1
- {"version":3,"file":"dispatcher-service.generator.js","sourceRoot":"","sources":["../../../src/backend-actions/generators/dispatcher-service.generator.ts"],"names":[],"mappings":";;AAIA,gDAkGC;AAtGD,iDAAmD;AAInD,SAAgB,kBAAkB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAiB;IAC5E,MAAM,OAAO,GAAG,2BAAe,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;IACjE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC7B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IACpC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;IACxC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACnC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACnC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAA;IACjD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;IAC1C,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAE3B,MAAM,UAAU,GAAa,EAAE,CAAA;IAC/B,MAAM,cAAc,GAAa,EAAE,CAAA;IACnC,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,cAAc,CAAC,IAAI,CACjB;;KAED,CACA,CAAA;IACH,CAAC;IAED,KAAK,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACpB,UAAU,CAAC,IAAI,CACb,4BAA4B,OAAO,CAAC,IAAI,uBAAuB,OAAO,CAAC,YAAY,KAAK,OAAO,CAAC,IAAI,EAAE,CACvG,CAAA;QACD,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;YAC/B,cAAc,CAAC,IAAI,CAAC;gBACV,SAAS;wBACD,OAAO,CAAC,YAAY,qDAAqD,CAAC,CAAA;QAC9F,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;;;;EAIhB,OAAO,CAAC,QAAQ,EAAE;;;;;;;;;;;;MAYd,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;;;;;eAKjB,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,IAAI,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;eA0B3E,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,IAAI,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI;;;;;;;;;;QAUlF,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;CAOhC,CAAA;AACD,CAAC"}
1
+ {"version":3,"file":"dispatcher-service.generator.js","sourceRoot":"","sources":["../../../src/backend-actions/generators/dispatcher-service.generator.ts"],"names":[],"mappings":";;AAIA,gDAyGC;AA7GD,iDAAmD;AAInD,SAAgB,kBAAkB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAiB;IAC5E,MAAM,OAAO,GAAG,2BAAe,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;IACjE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC7B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IACpC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;IACxC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACnC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACnC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAA;IACjD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;IAC1C,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAC3B,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IAEhC,MAAM,UAAU,GAAa,EAAE,CAAA;IAC/B,MAAM,cAAc,GAAa,EAAE,CAAA;IACnC,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,cAAc,CAAC,IAAI,CACjB;;KAED,CACA,CAAA;IACH,CAAC;IAED,KAAK,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QACpB,UAAU,CAAC,IAAI,CACb,4BAA4B,OAAO,CAAC,IAAI,uBAAuB,OAAO,CAAC,YAAY,KAAK,OAAO,CAAC,IAAI,EAAE,CACvG,CAAA;QACD,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;YAC/B,cAAc,CAAC,IAAI,CAAC;gBACV,SAAS;wBACD,OAAO,CAAC,YAAY,qDAAqD,CAAC,CAAA;QAC9F,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;;;;EAIhB,OAAO,CAAC,QAAQ,EAAE;;;;;;;;;;;;MAYd,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC;;;;;eAKjB,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,IAAI,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eAgC3E,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,IAAI,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI;;;;;;;;;;QAUlF,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;;;;;;;CAOhC,CAAA;AACD,CAAC"}
@@ -15,7 +15,8 @@ function generateActionExecutionClass({ actions, database, types }) {
15
15
  .addType(execution.interface.actionOperationId)
16
16
  .add(execution.interface.toBrandedActionOperationId)
17
17
  .addType(types.modelNames)
18
- .addType(types.user);
18
+ .addType(types.user)
19
+ .addType(types.userRoles);
19
20
  return /* ts */ `
20
21
  import { Injectable, Logger } from '@nestjs/common'
21
22
  import * as Prisma from '${database.prismaClient.location}'
@@ -42,17 +43,19 @@ export class ${execution.class.name} {
42
43
  public async create({
43
44
  action,
44
45
  user,
46
+ userRoles,
45
47
  databaseService,
46
48
  migrationOrder,
47
49
  }: {
48
50
  action: Action
49
51
  user: User
52
+ userRoles: UserRoles
50
53
  databaseService: DatabaseService
51
54
  migrationOrder?: number
52
55
  }): Promise<${execution.interface.name}> {
53
56
  const execution = new ${execution._internalName}(databaseService, this.config, _doNotInitializeFromOutside)
54
57
 
55
- await execution.init({ action, user, migrationOrder })
58
+ await execution.init({ action, user, userRoles, migrationOrder })
56
59
  return execution
57
60
  }
58
61
  }
@@ -62,6 +65,7 @@ type InternalState =
62
65
  type: Prisma.ActionStatus
63
66
  dbAction: DbAction
64
67
  user: User
68
+ userRoles: UserRoles
65
69
  }
66
70
  | { type: 'NotInitialized' }
67
71
 
@@ -120,6 +124,13 @@ export class ${execution._internalName} implements ${execution.interface.name} {
120
124
  return this._state.user
121
125
  }
122
126
 
127
+ public get userRoles(): UserRoles {
128
+ if (this._state.type === 'NotInitialized') {
129
+ throw new Error('${execution._internalName} is not initialized yet')
130
+ }
131
+ return this._state.userRoles
132
+ }
133
+
123
134
  /**
124
135
  * Keeps track of all ActionOperations to quickly verify that any modification happens only to action operations that are in status "Started".
125
136
  */
@@ -146,7 +157,17 @@ export class ${execution._internalName} implements ${execution.interface.name} {
146
157
  /**
147
158
  * Asynchronously initializes the ${execution._internalName}.
148
159
  */
149
- public async init({ action, user, migrationOrder }: { action: Action; user: User; migrationOrder?: number }) {
160
+ public async init({
161
+ action,
162
+ user,
163
+ userRoles,
164
+ migrationOrder,
165
+ }: {
166
+ action: Action
167
+ user: User
168
+ userRoles: UserRoles
169
+ migrationOrder?: number
170
+ }) {
150
171
  if (this._state.type !== 'NotInitialized') {
151
172
  throw new Error('${execution._internalName} can only be initialized once')
152
173
  }
@@ -165,7 +186,7 @@ export class ${execution._internalName} implements ${execution.interface.name} {
165
186
  migration_order: migrationOrder,
166
187
  },
167
188
  })
168
- this._state = { type: 'Started', dbAction, user }
189
+ this._state = { type: 'Started', dbAction, user, userRoles }
169
190
  this.logger = new Logger(\`${execution._internalName} \${dbAction.id}\`)
170
191
  } catch (error) {
171
192
  this.logger.error(\`Error while initializing ${execution._internalName}:\`, error)
@@ -1 +1 @@
1
- {"version":3,"file":"execution-class.generator.js","sourceRoot":"","sources":["../../../src/backend-actions/generators/execution-class.generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"execution-class.generator.js","sourceRoot":"","sources":["../../../src/backend-actions/generators/execution-class.generator.ts"],"names":[],"mappings":"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"}