@gadmin2n/schematics 0.0.64 → 0.0.65

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 (222) hide show
  1. package/dist/lib/application/files/gadmin2-game-angle-demo/.dockerignore +2 -2
  2. package/dist/lib/application/files/gadmin2-game-angle-demo/Dockerfile +40 -26
  3. package/dist/lib/application/files/gadmin2-game-angle-demo/Jenkinsfile +30 -4
  4. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/example.prisma +33 -0
  5. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/system.prisma +163 -0
  6. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Event.ts +70 -0
  7. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Game.ts +6 -6
  8. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/ITActivityDay.ts +70 -0
  9. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Log.ts +2 -2
  10. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Role.ts +2 -2
  11. package/dist/lib/application/files/gadmin2-game-angle-demo/server/.env +20 -9
  12. package/dist/lib/application/files/gadmin2-game-angle-demo/server/.env.local +1 -0
  13. package/dist/lib/application/files/gadmin2-game-angle-demo/server/.eslintrc.js +1 -0
  14. package/dist/lib/application/files/gadmin2-game-angle-demo/server/.prettierignore +1 -0
  15. package/dist/lib/application/files/gadmin2-game-angle-demo/server/README.md +2 -18
  16. package/dist/lib/application/files/gadmin2-game-angle-demo/server/gadmin-cli.json +1 -1
  17. package/dist/lib/application/files/gadmin2-game-angle-demo/server/migrate-between-pg-schemas.js +1232 -0
  18. package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +65 -38
  19. package/dist/lib/application/files/gadmin2-game-angle-demo/server/prisma/.generator.prisma +4 -3
  20. package/dist/lib/application/files/gadmin2-game-angle-demo/server/prisma.config.ts +16 -0
  21. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/games.ts +1 -71
  22. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/index.ts +17 -21
  23. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/permissions.ts +278 -0
  24. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/seedDataMngtPages.ts +258 -0
  25. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/users.ts +7 -0
  26. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/alias.config.ts +7 -0
  27. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/app.controller.ts +151 -11
  28. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/app.module.ts +29 -13
  29. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/app.service.ts +151 -12
  30. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/auth.guard.ts +87 -41
  31. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/http-cache.interceptor.ts +21 -0
  32. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/logger.ts +19 -0
  33. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/safe-log.util.ts +176 -0
  34. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/{yufuid.ts → taihu.ts} +49 -34
  35. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/tracing.ts +174 -0
  36. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/trim.pipe.ts +51 -0
  37. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/utils.ts +91 -0
  38. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/woaAuth.ts +25 -12
  39. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/main.ts +22 -12
  40. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.controller.spec.ts +20 -0
  41. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.controller.ts +190 -0
  42. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.module.ts +10 -0
  43. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.service.spec.ts +338 -0
  44. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/audit/audit.service.ts +83 -0
  45. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.controller.spec.ts +20 -0
  46. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.controller.ts +188 -0
  47. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.module.ts +10 -0
  48. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.service.spec.ts +18 -0
  49. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/game/game.service.ts +83 -0
  50. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.controller.spec.ts +20 -0
  51. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.controller.ts +250 -0
  52. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.module.ts +10 -0
  53. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.service.spec.ts +18 -0
  54. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/page/page.service.ts +1051 -0
  55. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.controller.spec.ts +20 -0
  56. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.controller.ts +196 -0
  57. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.module.ts +13 -0
  58. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.service.spec.ts +18 -0
  59. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/pageResource/pageResource.service.ts +219 -0
  60. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.controller.spec.ts +20 -0
  61. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.controller.ts +196 -0
  62. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.module.ts +10 -0
  63. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.service.spec.ts +18 -0
  64. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/resource/resource.service.ts +199 -0
  65. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.controller.spec.ts +20 -0
  66. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.controller.ts +210 -0
  67. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.module.ts +12 -0
  68. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.service.spec.ts +18 -0
  69. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/role.service.ts +849 -0
  70. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/role/roles-refresher.service.ts +133 -0
  71. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.controller.spec.ts +20 -0
  72. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.controller.ts +196 -0
  73. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.module.ts +10 -0
  74. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.service.spec.ts +18 -0
  75. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/rolePages/rolePages.service.ts +201 -0
  76. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.controller.spec.ts +20 -0
  77. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.controller.ts +196 -0
  78. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.module.ts +10 -0
  79. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.service.spec.ts +18 -0
  80. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/roleResource/roleResource.service.ts +216 -0
  81. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.controller.spec.ts +20 -0
  82. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.controller.ts +198 -0
  83. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.module.ts +10 -0
  84. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.service.spec.ts +18 -0
  85. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/user/user.service.ts +104 -0
  86. package/dist/lib/application/files/gadmin2-game-angle-demo/server/start-prod.sh +130 -0
  87. package/dist/lib/application/files/gadmin2-game-angle-demo/server/tsconfig.json +18 -3
  88. package/dist/lib/application/files/gadmin2-game-angle-demo/web/index.html +19 -0
  89. package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +34 -42
  90. package/dist/lib/application/files/gadmin2-game-angle-demo/web/postcss.config.cjs +6 -0
  91. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/App.tsx +111 -185
  92. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/auditLogProvider.ts +5 -5
  93. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/color-mode/index.tsx +49 -51
  94. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/custom-avatar.tsx +38 -0
  95. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/index.ts +4 -0
  96. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/{header/index.tsx → header.tsx} +22 -31
  97. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/index.ts +3 -1
  98. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/layout.tsx +32 -0
  99. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/logo.tsx +19 -0
  100. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/sider.tsx +331 -166
  101. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/title.tsx +61 -0
  102. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/pagination-total.tsx +21 -0
  103. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/tags/index.ts +1 -0
  104. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/tags/role-tag.tsx +44 -0
  105. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/text.tsx +74 -0
  106. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +258 -0
  107. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/constants/layout.ts +16 -0
  108. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/enums/audit-log.enum.ts +13 -0
  109. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/enums/index.ts +1 -0
  110. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/login.ts +22 -4
  111. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useDynamicResources.tsx +211 -0
  112. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useFetchData.ts +33 -0
  113. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useRoles.ts +30 -0
  114. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useUserPageAccess.ts +339 -0
  115. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/i18n.ts +8 -4
  116. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/index.tsx +3 -11
  117. package/dist/lib/application/files/gadmin2-game-angle-demo/web/{public → src}/locales/en/common.json +1 -1
  118. package/dist/lib/application/files/gadmin2-game-angle-demo/web/{public → src}/locales/zh_CN/common.json +1 -1
  119. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/components/action-cell.css +3 -0
  120. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/components/action-cell.tsx +134 -0
  121. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/create.tsx +113 -0
  122. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/edit.tsx +122 -0
  123. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/index.ts +8 -0
  124. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/index.tsx +6 -0
  125. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/list.tsx +213 -0
  126. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/show.tsx +61 -0
  127. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/AssignRolesModal.tsx +168 -0
  128. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/CreatePageModal.tsx +42 -0
  129. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/EditPageModal.tsx +42 -0
  130. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/PageDetailDrawer.tsx +101 -0
  131. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/PageFormModal.tsx +731 -0
  132. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/create.tsx +113 -0
  133. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/edit.tsx +122 -0
  134. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/hooks/usePageManagement.ts +36 -0
  135. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/index.ts +8 -0
  136. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/index.tsx +6 -0
  137. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/list.tsx +1113 -0
  138. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/queries.ts +17 -0
  139. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/show.tsx +61 -0
  140. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/types.ts +44 -0
  141. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/pageResource/create.tsx +113 -0
  142. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/pageResource/edit.tsx +122 -0
  143. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/pageResource/index.tsx +6 -0
  144. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/pageResource/list.tsx +243 -0
  145. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/pageResource/show.tsx +61 -0
  146. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/permission-readme/index.tsx +1088 -0
  147. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/CreateModal.tsx +25 -0
  148. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/EditModal.tsx +28 -0
  149. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/ResourceDetailDrawer.tsx +160 -0
  150. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/modal.tsx +202 -0
  151. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/create.tsx +113 -0
  152. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/edit.tsx +122 -0
  153. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/index.ts +9 -0
  154. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/index.tsx +6 -0
  155. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/list.tsx +184 -0
  156. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/queries.ts +10 -0
  157. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/show.tsx +61 -0
  158. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/types.ts +9 -0
  159. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/CreateModal.tsx +30 -0
  160. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/EditModal.tsx +47 -0
  161. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/RoleDetailDrawer.tsx +56 -0
  162. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/modal.tsx +302 -0
  163. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/create.tsx +113 -0
  164. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/edit.tsx +122 -0
  165. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/hooks/useRolePage.ts +35 -0
  166. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/index.ts +8 -0
  167. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/index.tsx +6 -0
  168. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/list.tsx +382 -0
  169. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/queries.ts +8 -0
  170. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/show.tsx +61 -0
  171. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/types.ts +8 -0
  172. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/rolePages/create.tsx +113 -0
  173. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/rolePages/edit.tsx +122 -0
  174. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/rolePages/index.tsx +6 -0
  175. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/rolePages/list.tsx +243 -0
  176. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/rolePages/show.tsx +61 -0
  177. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/roleResource/create.tsx +113 -0
  178. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/roleResource/edit.tsx +122 -0
  179. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/roleResource/index.tsx +6 -0
  180. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/roleResource/list.tsx +243 -0
  181. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/roleResource/show.tsx +61 -0
  182. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/create-modal.tsx +17 -0
  183. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/edit-modal.tsx +19 -0
  184. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/form-modal.tsx +188 -0
  185. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/index.ts +5 -0
  186. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/role-tag.tsx +48 -0
  187. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/show-drawer.tsx +140 -0
  188. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/create.tsx +113 -0
  189. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/edit.tsx +122 -0
  190. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/index.ts +8 -0
  191. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/index.tsx +6 -0
  192. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/list.tsx +342 -0
  193. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/queries.ts +14 -0
  194. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/show.tsx +61 -0
  195. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/antd.css +132 -0
  196. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/fc.css +58 -0
  197. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/index.css +128 -0
  198. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/show-drawer.module.css +18 -0
  199. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/show-page.module.css +21 -0
  200. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/audit-log.ts +1 -0
  201. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/index.ts +3 -0
  202. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/role.ts +7 -0
  203. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/types/user.ts +1 -0
  204. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/utilities/get-name-initials.ts +8 -0
  205. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/utilities/get-random-color.ts +27 -0
  206. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/utilities/index.ts +2 -0
  207. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/utilities/utils.tsx +5 -0
  208. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/vite-env.d.ts +1 -0
  209. package/dist/lib/application/files/gadmin2-game-angle-demo/web/tsconfig.json +3 -3
  210. package/dist/lib/application/files/gadmin2-game-angle-demo/web/vite.config.ts +31 -0
  211. package/package.json +1 -1
  212. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/sample.prisma +0 -65
  213. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Source.ts +0 -76
  214. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Tasklog.ts +0 -76
  215. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/roles.ts +0 -4
  216. package/dist/lib/application/files/gadmin2-game-angle-demo/web/craco.config.js +0 -27
  217. package/dist/lib/application/files/gadmin2-game-angle-demo/web/public/index.html +0 -53
  218. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/styles.ts +0 -10
  219. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/react-app-env.d.ts +0 -1
  220. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/reportWebVitals.ts +0 -15
  221. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/antd.less +0 -79
  222. /package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/VanillaJSONEditor/{index.js → index.jsx} +0 -0
@@ -0,0 +1,258 @@
1
+ import { PrismaClient } from '@prisma/client';
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+
5
+ const FULL_ACTIONS = ['createAny', 'readAny', 'updateAny', 'deleteAny'];
6
+
7
+ /**
8
+ * Path to config/prisma/ — two levels up from server/seed/
9
+ * (project-root/config/prisma/)
10
+ */
11
+ const PRISMA_CONFIG_DIR = path.resolve(__dirname, '..', '..', 'config', 'prisma');
12
+
13
+ /**
14
+ * Prisma files that define system/permission models and must NOT be scanned.
15
+ * These are already handled by seedPermissions().
16
+ */
17
+ const EXCLUDED_FILES = new Set(['system.prisma']);
18
+
19
+ // ─── Name Converters ──────────────────────────────────────────────────────────
20
+
21
+ /** PascalCase → camelCase (e.g. "Event" → "event", "ITActivityDay" → "iTActivityDay") */
22
+ function toCamelCase(str: string): string {
23
+ return str.charAt(0).toLowerCase() + str.slice(1);
24
+ }
25
+
26
+ /**
27
+ * PascalCase → kebab-case
28
+ * "Event" → "event"
29
+ * "ITActivityDay" → "it-activity-day"
30
+ * "GameList" → "game-list"
31
+ */
32
+ function toKebabCase(str: string): string {
33
+ return str
34
+ // Insert hyphen between a lowercase/digit and an uppercase letter
35
+ .replace(/([a-z0-9])([A-Z])/g, '$1-$2')
36
+ // Insert hyphen between a run of uppercase letters and an uppercase+lowercase pair
37
+ .replace(/([A-Z]+)([A-Z][a-z])/g, '$1-$2')
38
+ .toLowerCase();
39
+ }
40
+
41
+ // ─── Prisma File Parser ───────────────────────────────────────────────────────
42
+
43
+ interface ModelInfo {
44
+ /** PascalCase — original model name, e.g. "Event" */
45
+ name: string;
46
+ /** camelCase — used as page.code / resource.code, e.g. "event" */
47
+ code: string;
48
+ /** kebab-case — used in URL path segment, e.g. "event" */
49
+ slug: string;
50
+ }
51
+
52
+ /**
53
+ * Extract model names from a single .prisma file content.
54
+ * Skips models annotated with `/// @IgnoreReactCode`.
55
+ */
56
+ function extractModels(content: string): ModelInfo[] {
57
+ const models: ModelInfo[] = [];
58
+ const lines = content.split('\n');
59
+
60
+ for (let i = 0; i < lines.length; i++) {
61
+ const modelMatch = lines[i].match(/^model\s+(\w+)\s*\{/);
62
+ if (!modelMatch) continue;
63
+
64
+ const modelName = modelMatch[1];
65
+
66
+ // Collect consecutive `///` comment lines immediately above this model declaration
67
+ const annotations: string[] = [];
68
+ let j = i - 1;
69
+ while (j >= 0 && lines[j].trim().startsWith('///')) {
70
+ annotations.push(lines[j]);
71
+ j--;
72
+ }
73
+
74
+ // Skip models that explicitly opt out of frontend code generation
75
+ if (annotations.some((a) => a.includes('@IgnoreReactCode'))) {
76
+ console.log(`[seedDataMngtPages] Skipping ${modelName} (@IgnoreReactCode)`);
77
+ continue;
78
+ }
79
+
80
+ models.push({
81
+ name: modelName,
82
+ code: toCamelCase(modelName),
83
+ slug: toKebabCase(modelName),
84
+ });
85
+ }
86
+
87
+ return models;
88
+ }
89
+
90
+ /**
91
+ * Scan all non-excluded .prisma files and collect model definitions.
92
+ */
93
+ function readPrismaModels(): ModelInfo[] {
94
+ if (!fs.existsSync(PRISMA_CONFIG_DIR)) {
95
+ console.warn(`[seedDataMngtPages] Prisma config directory not found: ${PRISMA_CONFIG_DIR}`);
96
+ return [];
97
+ }
98
+
99
+ const files = fs
100
+ .readdirSync(PRISMA_CONFIG_DIR)
101
+ .filter((f) => f.endsWith('.prisma') && !EXCLUDED_FILES.has(f))
102
+ .sort(); // deterministic order across runs
103
+
104
+ const allModels: ModelInfo[] = [];
105
+ for (const file of files) {
106
+ const content = fs.readFileSync(path.join(PRISMA_CONFIG_DIR, file), 'utf-8');
107
+ const models = extractModels(content);
108
+ allModels.push(...models);
109
+ console.log(
110
+ `[seedDataMngtPages] Scanned ${file}: models=[${models.map((m) => m.name).join(', ') || '(none)'}]`,
111
+ );
112
+ }
113
+
114
+ return allModels;
115
+ }
116
+
117
+ // ─── Main Seed Function ───────────────────────────────────────────────────────
118
+
119
+ /**
120
+ * For every non-system Prisma model found in config/prisma/ (excluding system.prisma):
121
+ *
122
+ * 1. Upsert a Resource record (resource.code = camelCase model name)
123
+ * 2. Upsert a Page record (parent = dataMngt, path = /admin/data-mngt/<slug>)
124
+ * 3. Upsert a PageResource link (page ↔ resource, full actions)
125
+ * 4. Upsert a RolePages record (SYSTEM_ADMIN → page)
126
+ * 5. Upsert a RoleResource record (SYSTEM_ADMIN → resource, full actions)
127
+ *
128
+ * Safe to re-run — every write uses upsert / skipDuplicates.
129
+ * Depends on seedPermissions() having already created SYSTEM_ADMIN role and dataMngt page.
130
+ */
131
+ export async function seedDataMngtPages(prisma: PrismaClient): Promise<void> {
132
+ const models = readPrismaModels();
133
+
134
+ if (models.length === 0) {
135
+ console.log('[seedDataMngtPages] No non-system models found — nothing to seed.');
136
+ return;
137
+ }
138
+
139
+ // ── Anchors ────────────────────────────────────────────────────────────────
140
+ // Auto-bootstrap: if seed/index.ts has never been run (e.g. fresh DB),
141
+ // run the full seed pipeline now (users + permissions + pages).
142
+ const existingRole = await prisma.role.findUnique({ where: { name: 'SYSTEM_ADMIN' } });
143
+ if (!existingRole) {
144
+ console.log('[seedDataMngtPages] SYSTEM_ADMIN not found — running full seed (index.ts) first…');
145
+ const { main } = await import('./index');
146
+ await main();
147
+ // main() already calls seedDataMngtPages, so we're done.
148
+ return;
149
+ }
150
+
151
+ const systemAdminRole = existingRole;
152
+
153
+ const dataMngtPage = await prisma.page.findUnique({ where: { code: 'dataMngt' } });
154
+ if (!dataMngtPage) {
155
+ console.error('[seedDataMngtPages] dataMngt page still missing after seed. Aborting.');
156
+ return;
157
+ }
158
+
159
+ // ── Process models ─────────────────────────────────────────────────────────
160
+ for (const [index, model] of models.entries()) {
161
+ console.log(`[seedDataMngtPages] ── ${model.name} ──`);
162
+
163
+ // 1. Resource
164
+ const resource = await prisma.resource.upsert({
165
+ where: { code: model.code },
166
+ update: {}, // preserve manual edits (name / description)
167
+ create: {
168
+ code: model.code,
169
+ name: model.code,
170
+ description: `${model.name} resource (auto-generated by seedDataMngtPages)`,
171
+ isCommonResource: false,
172
+ },
173
+ });
174
+ console.log(`[seedDataMngtPages] Resource upserted: ${resource.code} (id=${resource.id})`);
175
+
176
+ // 2. Page (child of dataMngt)
177
+ const pagePath = `/admin/data-mngt/${model.slug}`;
178
+ const page = await prisma.page.upsert({
179
+ where: { code: model.code },
180
+ update: {
181
+ // Only sync the route path — must stay in step with the model name.
182
+ // Everything else (name, sortOrder, parentId) is left for the user to manage.
183
+ path: pagePath,
184
+ },
185
+ create: {
186
+ code: model.code,
187
+ name: model.name,
188
+ zhName: model.name,
189
+ enName: model.name,
190
+ path: pagePath,
191
+ isVirtual: false,
192
+ sortOrder: 2000 + index * 10,
193
+ parentId: dataMngtPage.id,
194
+ },
195
+ });
196
+ console.log(
197
+ `[seedDataMngtPages] Page upserted: ${page.code} → ${pagePath} (id=${page.id})`,
198
+ );
199
+
200
+ // 3. PageResource
201
+ await prisma.pageResource.upsert({
202
+ where: {
203
+ pageId_resourceId: { pageId: page.id, resourceId: resource.id },
204
+ },
205
+ update: { actions: FULL_ACTIONS },
206
+ create: {
207
+ pageId: page.id,
208
+ resourceId: resource.id,
209
+ actions: FULL_ACTIONS,
210
+ },
211
+ });
212
+ console.log(
213
+ `[seedDataMngtPages] PageResource upserted: page(${page.id}) ↔ resource(${resource.id})`,
214
+ );
215
+
216
+ // 4. RolePages — SYSTEM_ADMIN can see this page in the menu
217
+ await prisma.rolePages.upsert({
218
+ where: {
219
+ roleId_pageId: { roleId: systemAdminRole.id, pageId: page.id },
220
+ },
221
+ update: {},
222
+ create: { roleId: systemAdminRole.id, pageId: page.id },
223
+ });
224
+ console.log(`[seedDataMngtPages] RolePages upserted: SYSTEM_ADMIN → ${page.code}`);
225
+
226
+ // 5. RoleResource — SYSTEM_ADMIN has full API access to this resource
227
+ await prisma.roleResource.upsert({
228
+ where: {
229
+ roleId_resourceId: { roleId: systemAdminRole.id, resourceId: resource.id },
230
+ },
231
+ update: {},
232
+ create: {
233
+ roleId: systemAdminRole.id,
234
+ resourceId: resource.id,
235
+ actions: FULL_ACTIONS,
236
+ },
237
+ });
238
+ console.log(`[seedDataMngtPages] RoleResource upserted: SYSTEM_ADMIN → ${resource.code}`);
239
+ }
240
+
241
+ console.log(
242
+ `[seedDataMngtPages] ✅ Done. Seeded ${models.length} model(s) under /admin/data-mngt.`,
243
+ );
244
+ }
245
+
246
+ // ─── Standalone Entry Point ───────────────────────────────────────────────────
247
+ // Called directly by `postgenerate:dev` (via ts-node), NOT by seed/index.ts.
248
+
249
+ if (require.main === module) {
250
+ const prisma = new PrismaClient();
251
+
252
+ seedDataMngtPages(prisma)
253
+ .catch((e) => {
254
+ console.error('[seedDataMngtPages] Fatal error:', e);
255
+ process.exit(1);
256
+ })
257
+ .finally(() => prisma.$disconnect());
258
+ }
@@ -0,0 +1,7 @@
1
+ export default [
2
+ { userid: 'junrujrwang', username: 'junrujrwang', roles: '["SYSTEM_ADMIN"]' },
3
+ { userid: 'kavenma', username: 'kavenma', roles: '["SYSTEM_ADMIN"]' },
4
+ { userid: 'jasonlan', username: 'jasonlan', roles: '["SYSTEM_ADMIN"]' },
5
+ { userid: 'davywang', username: 'davywang', roles: '["SYSTEM_ADMIN"]' },
6
+ { userid: 'ypengxu', username: 'ypengxu', roles: '["SYSTEM_ADMIN"]' },
7
+ ];
@@ -0,0 +1,7 @@
1
+ const moduleAlias = require('module-alias');
2
+ import { join } from 'path';
3
+
4
+ // 注册别名(与 tsconfig.json 保持一致)
5
+ moduleAlias.addAliases({
6
+ '@': join(__dirname, '.'), // 指向 src 目录
7
+ });
@@ -1,7 +1,30 @@
1
1
  import { UserType } from '@gadmin2n/nest-common';
2
- import { Controller, Get, Req, Res } from '@nestjs/common';
3
- import { ApiOkResponse, ApiProperty } from '@nestjs/swagger';
4
- import { Request } from 'express';
2
+ import { CacheInterceptor, CacheTTL } from '@nestjs/cache-manager';
3
+ import {
4
+ BadRequestException,
5
+ Body,
6
+ Controller,
7
+ Get,
8
+ Inject,
9
+ Post,
10
+ Query,
11
+ Req,
12
+ Res,
13
+ UseInterceptors,
14
+ } from '@nestjs/common';
15
+ import {
16
+ ApiOkResponse,
17
+ ApiOperation,
18
+ ApiProperty,
19
+ ApiQuery,
20
+ } from '@nestjs/swagger';
21
+ import { trace } from '@opentelemetry/api';
22
+ import { Request, Response } from 'express';
23
+ import { UseRoles } from 'nest-access-control';
24
+ import { WINSTON_MODULE_PROVIDER } from 'nest-winston';
25
+ import { PrismaService } from 'nestjs-prisma';
26
+ import * as path from 'path';
27
+ import { Logger } from 'winston';
5
28
  import { AppService } from './app.service';
6
29
  import { AllowUnauthorizedRequest } from './lib/auth.guard';
7
30
 
@@ -14,25 +37,77 @@ class UserInfo {
14
37
  }
15
38
  @Controller()
16
39
  export class AppController {
17
- constructor(private readonly appService: AppService) {}
18
-
19
- @Get()
20
- index(@Res() res) {
21
- res.status(302).redirect('/dashboard');
40
+ constructor(
41
+ private readonly appService: AppService,
42
+ private readonly prisma: PrismaService,
43
+ @Inject(WINSTON_MODULE_PROVIDER) private readonly logger: Logger,
44
+ ) {
45
+ this.logger = this.logger.child({
46
+ file: path.basename(__filename),
47
+ });
22
48
  }
23
49
 
24
- @Get('/userinfo')
50
+ @Get('userinfo')
25
51
  @ApiOkResponse({ type: UserInfo })
26
52
  userInfo(@Req() request: Request & { user: UserType }) {
27
53
  return request?.user || { userid: '', username: '' };
28
54
  }
29
55
 
30
- @Get('/hello')
56
+ @Get('hello')
31
57
  hello(): string {
58
+ this.logger.info('hello');
32
59
  return this.appService.getHello();
33
60
  }
34
61
 
35
- @Get('/login-callback')
62
+ /**
63
+ * 调试端点:验证 Prisma OpenTelemetry tracing 是否正常工作
64
+ * 调用后查看 APM 中是否有 prisma:client:* 和 prisma:engine:* spans
65
+ */
66
+ @Get('debug/tracing')
67
+ @AllowUnauthorizedRequest()
68
+ @ApiOperation({ summary: '调试 Prisma tracing' })
69
+ async debugTracing() {
70
+ const globalAny = global as any;
71
+ const currentSpan = trace.getActiveSpan();
72
+ const spanContext = currentSpan?.spanContext();
73
+
74
+ // 执行一个简单的 Prisma 查询来触发 tracing
75
+ const userCount = await this.prisma.user.count();
76
+
77
+ return {
78
+ message: 'Prisma tracing debug endpoint',
79
+ tracerProvider: trace.getTracerProvider()?.constructor?.name,
80
+ currentSpan: {
81
+ traceId: spanContext?.traceId,
82
+ spanId: spanContext?.spanId,
83
+ traceFlags: spanContext?.traceFlags,
84
+ sampled: spanContext?.traceFlags === 1,
85
+ },
86
+ prismaInstrumentation: {
87
+ PRISMA_INSTRUMENTATION: !!globalAny.PRISMA_INSTRUMENTATION,
88
+ V6_PRISMA_INSTRUMENTATION: !!globalAny.V6_PRISMA_INSTRUMENTATION,
89
+ helperEnabled:
90
+ globalAny.PRISMA_INSTRUMENTATION?.helper?.isEnabled() ?? false,
91
+ },
92
+ testQuery: {
93
+ userCount,
94
+ },
95
+ env: {
96
+ OTEL_SERVICE_NAME: process.env.OTEL_SERVICE_NAME,
97
+ OTEL_EXPORTER_OTLP_ENDPOINT: process.env.OTEL_EXPORTER_OTLP_ENDPOINT,
98
+ },
99
+ };
100
+ }
101
+
102
+ @UseInterceptors(CacheInterceptor)
103
+ @CacheTTL(10 * 1000) //10 seconds
104
+ @Get('get-number')
105
+ getNumber(): number {
106
+ // 随机生成一个0-100之间的数字
107
+ return Math.floor(Math.random() * 100);
108
+ }
109
+
110
+ @Get('login-callback')
36
111
  @AllowUnauthorizedRequest()
37
112
  loginCallback(@Req() request: Request, @Res() res) {
38
113
  return this.appService.loginCallback(request, res);
@@ -49,4 +124,69 @@ export class AppController {
49
124
  logout(@Req() request: Request, @Res() res) {
50
125
  return this.appService.logout(request, res);
51
126
  }
127
+
128
+ // ============ External Page 路由 ============
129
+
130
+ @Get('gtdr-page/sign-url')
131
+ @UseRoles({
132
+ resource: 'gtdrReport',
133
+ action: 'create',
134
+ possession: 'any',
135
+ })
136
+ @ApiOperation({ summary: '获取带签名的外部页面访问URL,302重定向' })
137
+ @ApiQuery({ name: 'domain', required: true, description: 'Domain 编码' })
138
+ @ApiQuery({ name: 'pageCode', required: true, description: '页面编码' })
139
+ getExternalPageSignedUrl(
140
+ @Query('domain') domain: string,
141
+ @Query('pageCode') pageCode: string,
142
+ @Req() req: Request & { user?: UserType },
143
+ @Res() res: Response,
144
+ ): void {
145
+ if (!domain) {
146
+ throw new BadRequestException('domain is required');
147
+ }
148
+ if (!pageCode) {
149
+ throw new BadRequestException('pageCode is required');
150
+ }
151
+
152
+ const userid = req.user?.userid || 'anonymous';
153
+
154
+ this.logger.info(
155
+ `external_page_sign_url_request - 请求签名URL - userid: ${userid}, domain: ${domain}, pageCode: ${pageCode}`,
156
+ );
157
+
158
+ const { url } = this.appService.generateExternalPageSignedUrl(
159
+ domain,
160
+ pageCode,
161
+ userid,
162
+ );
163
+ res.redirect(302, url);
164
+ }
165
+
166
+ @Post('external-page/verify')
167
+ @ApiOperation({ summary: '验证外部页面签名(用于测试)' })
168
+ verifyExternalPageSignature(
169
+ @Body()
170
+ body: {
171
+ domain: string;
172
+ pageCode: string;
173
+ userid: string;
174
+ timestamp: string;
175
+ signature: string;
176
+ },
177
+ ): { valid: boolean; reason?: string } {
178
+ const { domain, pageCode, userid, timestamp, signature } = body;
179
+
180
+ if (!domain || !pageCode || !userid || !timestamp || !signature) {
181
+ throw new BadRequestException('Missing required parameters');
182
+ }
183
+
184
+ return this.appService.verifyExternalPageSignature(
185
+ domain,
186
+ pageCode,
187
+ userid,
188
+ timestamp,
189
+ signature,
190
+ );
191
+ }
52
192
  }
@@ -1,6 +1,7 @@
1
1
  import { Module } from '@nestjs/common';
2
2
  import { ConfigModule, ConfigService } from '@nestjs/config';
3
3
  // import { ScheduleModule } from '@nestjs/schedule';
4
+ import { CacheModule } from '@nestjs/cache-manager';
4
5
  import { AccessControlModule } from 'nest-access-control';
5
6
  import {
6
7
  // utilities as nestWinstonModuleUtilities,
@@ -9,17 +10,21 @@ import {
9
10
  import { PrismaModule } from 'nestjs-prisma';
10
11
  import * as winston from 'winston';
11
12
  import config from '../config';
12
- import { roles as appRoles } from '../config/ac.config';
13
13
  import { AppController } from './app.controller';
14
14
  import { AppService } from './app.service';
15
15
  import modules from './modules';
16
16
 
17
+ import { ScheduleModule } from '@nestjs/schedule';
17
18
  import { ServeStaticModule } from '@nestjs/serve-static';
18
19
  import { join } from 'path';
20
+ import { LogFormat } from './lib/logger';
21
+ import { RoleModule } from './modules/role/role.module';
22
+ import { RoleService } from './modules/role/role.service';
23
+ import { RolesRefresherService } from './modules/role/roles-refresher.service';
19
24
 
20
25
  @Module({
21
26
  imports: [
22
- // ScheduleModule.forRoot(),
27
+ ScheduleModule.forRoot(),
23
28
 
24
29
  ServeStaticModule.forRoot({
25
30
  rootPath: join(__dirname, '..', 'www'),
@@ -28,7 +33,17 @@ import { join } from 'path';
28
33
 
29
34
  ConfigModule.forRoot({ isGlobal: true, load: [config] }),
30
35
 
31
- AccessControlModule.forRoles(appRoles),
36
+ AccessControlModule.forRootAsync({
37
+ imports: [
38
+ /* Any modules providing RoleService */
39
+ RoleModule,
40
+ ],
41
+ inject: [RoleService],
42
+ useFactory: async (roleService: RoleService) => {
43
+ const rolesData = await roleService.getBuilder(); // Fetch roles from DB
44
+ return rolesData;
45
+ },
46
+ }),
32
47
 
33
48
  WinstonModule.forRootAsync({
34
49
  useFactory: (configService: ConfigService) => {
@@ -37,14 +52,7 @@ import { join } from 'path';
37
52
  level: loggerConfig.level,
38
53
  transports: [
39
54
  new winston.transports.Console({
40
- format: winston.format.combine(
41
- // nestWinstonModuleUtilities.format.nestLike(),
42
- winston.format.splat(),
43
- winston.format.timestamp(),
44
- // winston.format.ms(),
45
- winston.format.json(),
46
- // nestWinstonModuleUtilities.format.nestLike('MyApp', { prettyPrint: true }),
47
- ),
55
+ format: LogFormat,
48
56
  }),
49
57
  ],
50
58
  };
@@ -58,7 +66,10 @@ import { join } from 'path';
58
66
  const prismaConfig = configService.get('prisma');
59
67
  return {
60
68
  prismaOptions: {
61
- log: prismaConfig.log,
69
+ log:
70
+ process.env.NODE_ENV === 'development'
71
+ ? prismaConfig.log
72
+ : ['warn', 'error'],
62
73
  },
63
74
  explicitConnect: prismaConfig.explicit,
64
75
  };
@@ -66,10 +77,15 @@ import { join } from 'path';
66
77
  inject: [ConfigService],
67
78
  }),
68
79
 
80
+ CacheModule.register({
81
+ isGlobal: true,
82
+ ttl: 5 * 60 * 1000, // 5 minutes
83
+ }),
84
+
69
85
  ...modules,
70
86
  ],
71
87
 
72
88
  controllers: [AppController],
73
- providers: [AppService],
89
+ providers: [AppService, RoleService, RolesRefresherService],
74
90
  })
75
91
  export class AppModule {}