zrb 1.0.0a21__py3-none-any.whl → 1.0.0b2__py3-none-any.whl

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 (191) hide show
  1. zrb/__init__.py +2 -1
  2. zrb/__main__.py +0 -3
  3. zrb/builtin/__init__.py +3 -0
  4. zrb/builtin/group.py +1 -0
  5. zrb/builtin/llm/llm_chat.py +2 -2
  6. zrb/builtin/llm/tool/web.py +1 -1
  7. zrb/builtin/project/add/fastapp/fastapp_task.py +2 -0
  8. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/config.py +5 -2
  9. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/add_entity_task.py +80 -20
  10. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/add_entity_util.py +150 -42
  11. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/module/my_module/service/my_entity/my_entity_service.py +113 -0
  12. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/module/my_module/service/my_entity/my_entity_service_factory.py +9 -0
  13. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/module/my_module/service/my_entity/repository/my_entity_db_repository.py +0 -10
  14. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/module/my_module/service/my_entity/repository/my_entity_repository.py +37 -16
  15. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/module/my_module/service/my_entity/repository/{factory.py → my_entity_repository_factory.py} +2 -2
  16. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/schema/my_entity.py +16 -6
  17. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/client_method.py +57 -0
  18. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/gateway_subroute.py +72 -0
  19. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/format_task.py +1 -1
  20. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/input.py +13 -0
  21. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/add_module_task.py +23 -0
  22. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/add_module_util.py +42 -0
  23. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/gateway/subroute/my_module.py +7 -0
  24. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/client/my_module_api_client.py +6 -0
  25. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/client/{any_client.py → my_module_client.py} +1 -1
  26. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/client/my_module_client_factory.py +11 -0
  27. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/client/my_module_direct_client.py +5 -0
  28. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/route.py +11 -11
  29. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/module_task_definition.py +2 -2
  30. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/task.py +8 -8
  31. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/util.py +47 -20
  32. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/app_factory.py +29 -0
  33. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/base_db_repository.py +185 -101
  34. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/base_service.py +236 -0
  35. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/{db_engine.py → db_engine_factory.py} +1 -1
  36. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/error.py +12 -0
  37. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/logger_factory.py +10 -0
  38. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/parser_factory.py +7 -0
  39. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/app.py +47 -0
  40. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/parser.py +105 -0
  41. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/user_agent.py +58 -0
  42. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/util/view.py +37 -0
  43. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/config.py +25 -1
  44. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/main.py +1 -1
  45. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_api_client.py +16 -0
  46. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_client.py +163 -0
  47. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_client_factory.py +9 -0
  48. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/auth_direct_client.py +15 -0
  49. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/versions/3093c7336477_add_auth_tables.py +160 -0
  50. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration_metadata.py +18 -1
  51. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/route.py +7 -3
  52. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/permission_service.py +117 -0
  53. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/permission_service_factory.py +11 -0
  54. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/repository/permission_db_repository.py +26 -0
  55. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/repository/permission_repository.py +61 -0
  56. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission/repository/permission_repository_factory.py +13 -0
  57. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/repository/role_db_repository.py +75 -0
  58. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/repository/role_repository.py +59 -0
  59. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/repository/role_repository_factory.py +13 -0
  60. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/role_service.py +105 -0
  61. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role/role_service_factory.py +7 -0
  62. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/repository/user_db_repository.py +42 -13
  63. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/repository/user_repository.py +38 -17
  64. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/repository/user_repository_factory.py +2 -2
  65. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/user_service.py +105 -0
  66. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/user_service_factory.py +7 -0
  67. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/route.py +43 -14
  68. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/subroute/auth.py +198 -28
  69. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/util/view.py +74 -0
  70. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/error.html +6 -0
  71. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/content/homepage.html +6 -0
  72. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/images/android-chrome-192x192.png +0 -0
  73. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/images/android-chrome-512x512.png +0 -0
  74. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/images/favicon-32x32.png +0 -0
  75. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.amber.min.css +4 -0
  76. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.blue.min.css +4 -0
  77. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.cyan.min.css +4 -0
  78. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.fuchsia.min.css +4 -0
  79. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.green.min.css +4 -0
  80. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.grey.min.css +4 -0
  81. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.indigo.min.css +4 -0
  82. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.jade.min.css +4 -0
  83. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.lime.min.css +4 -0
  84. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.min.css +4 -0
  85. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.orange.min.css +4 -0
  86. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.pink.min.css +4 -0
  87. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.pumpkin.min.css +4 -0
  88. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.purple.min.css +4 -0
  89. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.red.min.css +4 -0
  90. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.sand.min.css +4 -0
  91. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.slate.min.css +4 -0
  92. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.violet.min.css +4 -0
  93. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.yellow.min.css +4 -0
  94. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/static/pico-css/pico.zinc.min.css +4 -0
  95. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/gateway/view/template/default.html +34 -0
  96. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/requirements.txt +1 -0
  97. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/permission.py +17 -5
  98. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/role.py +50 -4
  99. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/session.py +52 -0
  100. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/schema/user.py +30 -5
  101. zrb/builtin/python.py +1 -1
  102. zrb/builtin/random.py +61 -0
  103. zrb/cmd/cmd_val.py +6 -5
  104. zrb/content_transformer/any_content_transformer.py +7 -0
  105. zrb/content_transformer/content_transformer.py +6 -0
  106. zrb/runner/cli.py +14 -7
  107. zrb/runner/web_app.py +28 -280
  108. zrb/runner/web_config/config.py +91 -0
  109. zrb/runner/web_config/config_factory.py +26 -0
  110. zrb/runner/web_route/docs_route.py +17 -0
  111. zrb/runner/web_route/error_page/serve_default_404.py +28 -0
  112. zrb/runner/{web_controller/error_page/controller.py → web_route/error_page/show_error_page.py} +2 -2
  113. zrb/runner/{web_controller → web_route}/error_page/view.html +5 -0
  114. zrb/runner/web_route/home_page/home_page_route.py +51 -0
  115. zrb/runner/web_route/login_api_route.py +31 -0
  116. zrb/runner/web_route/login_page/login_page_route.py +39 -0
  117. zrb/runner/web_route/logout_api_route.py +18 -0
  118. zrb/runner/web_route/logout_page/logout_page_route.py +40 -0
  119. zrb/runner/{web_controller/group_info_page/controller.py → web_route/node_page/group/show_group_page.py} +3 -3
  120. zrb/runner/web_route/node_page/node_page_route.py +50 -0
  121. zrb/runner/{web_controller/session_page/controller.py → web_route/node_page/task/show_task_page.py} +3 -3
  122. zrb/runner/web_route/refresh_token_api_route.py +38 -0
  123. zrb/runner/web_route/static/static_route.py +44 -0
  124. zrb/runner/web_route/task_input_api_route.py +47 -0
  125. zrb/runner/web_route/task_session_api_route.py +102 -0
  126. zrb/runner/web_schema/session.py +5 -0
  127. zrb/runner/web_schema/token.py +11 -0
  128. zrb/runner/web_schema/user.py +32 -0
  129. zrb/runner/web_util/cookie.py +29 -0
  130. zrb/runner/{web_util.py → web_util/html.py} +1 -23
  131. zrb/runner/web_util/token.py +72 -0
  132. zrb/runner/web_util/user.py +63 -0
  133. zrb/session/session.py +6 -4
  134. zrb/session_state_logger/{default_session_state_logger.py → session_state_logger_factory.py} +1 -1
  135. zrb/task/base_task.py +53 -6
  136. zrb/task/base_trigger.py +2 -0
  137. zrb/task/cmd_task.py +9 -5
  138. zrb/task/http_check.py +2 -0
  139. zrb/task/llm_task.py +2 -0
  140. zrb/task/make_task.py +2 -0
  141. zrb/task/rsync_task.py +2 -0
  142. zrb/task/scaffolder.py +8 -5
  143. zrb/task/scheduler.py +2 -0
  144. zrb/task/tcp_check.py +2 -0
  145. zrb/task_status/task_status.py +4 -3
  146. zrb/util/cmd/command.py +1 -0
  147. zrb/util/file.py +7 -1
  148. {zrb-1.0.0a21.dist-info → zrb-1.0.0b2.dist-info}/METADATA +1 -1
  149. zrb-1.0.0b2.dist-info/RECORD +307 -0
  150. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/any_client_method.py +0 -27
  151. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/entity/template/app_template/module/my_module/service/my_entity/my_entity_usecase.py +0 -65
  152. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/client/api_client.py +0 -6
  153. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/client/direct_client.py +0 -6
  154. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/module/template/app_template/module/my_module/client/factory.py +0 -9
  155. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/app.py +0 -20
  156. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/common/base_usecase.py +0 -245
  157. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/any_client.py +0 -33
  158. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/api_client.py +0 -7
  159. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/direct_client.py +0 -6
  160. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/client/factory.py +0 -9
  161. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/migration/versions/3093c7336477_add_user_table.py +0 -37
  162. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/user_usecase.py +0 -53
  163. zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/user/user_usecase_factory.py +0 -6
  164. zrb/runner/web_config.py +0 -274
  165. zrb/runner/web_controller/home_page/controller.py +0 -33
  166. zrb/runner/web_controller/login_page/controller.py +0 -25
  167. zrb/runner/web_controller/logout_page/controller.py +0 -26
  168. zrb-1.0.0a21.dist-info/RECORD +0 -244
  169. /zrb/builtin/project/add/fastapp/fastapp_template/my_app_name/_zrb/column/{create_column_task.py → add_column_task.py} +0 -0
  170. /zrb/{runner/web_controller → builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/permission}/__init__.py +0 -0
  171. /zrb/{runner/web_controller/group_info_page → builtin/project/add/fastapp/fastapp_template/my_app_name/module/auth/service/role}/__init__.py +0 -0
  172. /zrb/runner/{web_controller/home_page → web_route}/__init__.py +0 -0
  173. /zrb/runner/{web_controller/session_page → web_route/home_page}/__init__.py +0 -0
  174. /zrb/runner/{web_controller → web_route}/home_page/view.html +0 -0
  175. /zrb/runner/{web_controller → web_route}/login_page/view.html +0 -0
  176. /zrb/runner/{web_controller → web_route}/logout_page/view.html +0 -0
  177. /zrb/runner/{web_controller/group_info_page → web_route/node_page/group}/view.html +0 -0
  178. /zrb/runner/{web_controller/session_page → web_route/node_page/task}/partial/input.html +0 -0
  179. /zrb/runner/{web_controller/session_page → web_route/node_page/task}/view.html +0 -0
  180. /zrb/runner/{refresh-token.template.js → web_route/static/refresh-token.template.js} +0 -0
  181. /zrb/runner/{web_controller/static → web_route/static/resources}/common.css +0 -0
  182. /zrb/runner/{web_controller/static → web_route/static/resources}/favicon-32x32.png +0 -0
  183. /zrb/runner/{web_controller/static → web_route/static/resources}/login/event.js +0 -0
  184. /zrb/runner/{web_controller/static → web_route/static/resources}/logout/event.js +0 -0
  185. /zrb/runner/{web_controller/static → web_route/static/resources}/pico.min.css +0 -0
  186. /zrb/runner/{web_controller/static → web_route/static/resources}/session/common-util.js +0 -0
  187. /zrb/runner/{web_controller/static → web_route/static/resources}/session/current-session.js +0 -0
  188. /zrb/runner/{web_controller/static → web_route/static/resources}/session/event.js +0 -0
  189. /zrb/runner/{web_controller/static → web_route/static/resources}/session/past-session.js +0 -0
  190. {zrb-1.0.0a21.dist-info → zrb-1.0.0b2.dist-info}/WHEEL +0 -0
  191. {zrb-1.0.0a21.dist-info → zrb-1.0.0b2.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,163 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+ from my_app_name.schema.permission import (
4
+ MultiplePermissionResponse,
5
+ PermissionCreateWithAudit,
6
+ PermissionResponse,
7
+ PermissionUpdateWithAudit,
8
+ )
9
+ from my_app_name.schema.role import (
10
+ MultipleRoleResponse,
11
+ RoleCreateWithAudit,
12
+ RoleResponse,
13
+ RoleUpdateWithAudit,
14
+ )
15
+ from my_app_name.schema.user import (
16
+ MultipleUserResponse,
17
+ UserCreateWithAudit,
18
+ UserResponse,
19
+ UserUpdateWithAudit,
20
+ )
21
+
22
+
23
+ class AuthClient(ABC):
24
+
25
+ # Permission related methods
26
+
27
+ @abstractmethod
28
+ async def get_permission_by_id(self, permission_id: str) -> PermissionResponse:
29
+ """Get permission by id"""
30
+
31
+ @abstractmethod
32
+ async def get_permissions(
33
+ self,
34
+ page: int = 1,
35
+ page_size: int = 10,
36
+ sort: str | None = None,
37
+ filter: str | None = None,
38
+ ) -> MultiplePermissionResponse:
39
+ """Get permissions by filter and sort"""
40
+
41
+ @abstractmethod
42
+ async def create_permission(
43
+ self, data: PermissionCreateWithAudit
44
+ ) -> PermissionResponse:
45
+ """Create a new permission"""
46
+
47
+ @abstractmethod
48
+ async def create_permission(
49
+ self, data: list[PermissionCreateWithAudit]
50
+ ) -> list[PermissionResponse]:
51
+ """Create new permissions"""
52
+
53
+ @abstractmethod
54
+ async def update_permission_bulk(
55
+ self, permission_ids: list[str], data: PermissionUpdateWithAudit
56
+ ) -> PermissionResponse:
57
+ """Update some permissions"""
58
+
59
+ @abstractmethod
60
+ async def update_permission(
61
+ self, permission_id: str, data: PermissionUpdateWithAudit
62
+ ) -> PermissionResponse:
63
+ """Update a permission"""
64
+
65
+ @abstractmethod
66
+ async def delete_permission_bulk(
67
+ self, permission_ids: str, deleted_by: str
68
+ ) -> PermissionResponse:
69
+ """Delete some permissions"""
70
+
71
+ @abstractmethod
72
+ async def delete_permission(
73
+ self, permission_id: str, deleted_by: str
74
+ ) -> PermissionResponse:
75
+ """Delete a permission"""
76
+
77
+ # Role related methods
78
+
79
+ @abstractmethod
80
+ async def get_role_by_id(self, role_id: str) -> RoleResponse:
81
+ """Get role by id"""
82
+
83
+ @abstractmethod
84
+ async def get_roles(
85
+ self,
86
+ page: int = 1,
87
+ page_size: int = 10,
88
+ sort: str | None = None,
89
+ filter: str | None = None,
90
+ ) -> MultipleRoleResponse:
91
+ """Get roles by filter and sort"""
92
+
93
+ @abstractmethod
94
+ async def create_role(self, data: RoleCreateWithAudit) -> RoleResponse:
95
+ """Create a new role"""
96
+
97
+ @abstractmethod
98
+ async def create_role(self, data: list[RoleCreateWithAudit]) -> list[RoleResponse]:
99
+ """Create new roles"""
100
+
101
+ @abstractmethod
102
+ async def update_role_bulk(
103
+ self, role_ids: list[str], data: RoleUpdateWithAudit
104
+ ) -> RoleResponse:
105
+ """Update some roles"""
106
+
107
+ @abstractmethod
108
+ async def update_role(
109
+ self, role_id: str, data: RoleUpdateWithAudit
110
+ ) -> RoleResponse:
111
+ """Update a role"""
112
+
113
+ @abstractmethod
114
+ async def delete_role_bulk(self, role_ids: str, deleted_by: str) -> RoleResponse:
115
+ """Delete some roles"""
116
+
117
+ @abstractmethod
118
+ async def delete_role(self, role_id: str, deleted_by: str) -> RoleResponse:
119
+ """Delete a role"""
120
+
121
+ # User related methods
122
+
123
+ @abstractmethod
124
+ async def get_user_by_id(self, user_id: str) -> UserResponse:
125
+ """Get user by id"""
126
+
127
+ @abstractmethod
128
+ async def get_users(
129
+ self,
130
+ page: int = 1,
131
+ page_size: int = 10,
132
+ sort: str | None = None,
133
+ filter: str | None = None,
134
+ ) -> MultipleUserResponse:
135
+ """Get users by filter and sort"""
136
+
137
+ @abstractmethod
138
+ async def create_user(self, data: UserCreateWithAudit) -> UserResponse:
139
+ """Create a new user"""
140
+
141
+ @abstractmethod
142
+ async def create_user(self, data: list[UserCreateWithAudit]) -> list[UserResponse]:
143
+ """Create new users"""
144
+
145
+ @abstractmethod
146
+ async def update_user_bulk(
147
+ self, user_ids: list[str], data: UserUpdateWithAudit
148
+ ) -> UserResponse:
149
+ """Update some users"""
150
+
151
+ @abstractmethod
152
+ async def update_user(
153
+ self, user_id: str, data: UserUpdateWithAudit
154
+ ) -> UserResponse:
155
+ """Update a user"""
156
+
157
+ @abstractmethod
158
+ async def delete_user_bulk(self, user_ids: str, deleted_by: str) -> UserResponse:
159
+ """Delete some users"""
160
+
161
+ @abstractmethod
162
+ async def delete_user(self, user_id: str, deleted_by: str) -> UserResponse:
163
+ """Delete a user"""
@@ -0,0 +1,9 @@
1
+ from my_app_name.config import APP_COMMUNICATION
2
+ from my_app_name.module.auth.client.auth_api_client import AuthAPIClient
3
+ from my_app_name.module.auth.client.auth_client import AuthClient
4
+ from my_app_name.module.auth.client.auth_direct_client import AuthDirectClient
5
+
6
+ if APP_COMMUNICATION == "direct":
7
+ auth_client: AuthClient = AuthDirectClient()
8
+ elif APP_COMMUNICATION == "api":
9
+ auth_client: AuthClient = AuthAPIClient()
@@ -0,0 +1,15 @@
1
+ from my_app_name.module.auth.client.auth_client import AuthClient
2
+ from my_app_name.module.auth.service.permission.permission_service_factory import (
3
+ permission_service,
4
+ )
5
+ from my_app_name.module.auth.service.role.role_service_factory import role_service
6
+ from my_app_name.module.auth.service.user.user_service_factory import user_service
7
+
8
+
9
+ class AuthDirectClient(
10
+ permission_service.as_direct_client(),
11
+ role_service.as_direct_client(),
12
+ user_service.as_direct_client(),
13
+ AuthClient,
14
+ ):
15
+ pass
@@ -0,0 +1,160 @@
1
+ """Add user table
2
+
3
+ Revision ID: 3093c7336477
4
+ Revises:
5
+ Create Date: 2024-11-20 05:57:01.684118
6
+
7
+ """
8
+
9
+ from typing import Sequence, Union
10
+
11
+ import sqlalchemy as sa
12
+ import sqlmodel
13
+ from alembic import op
14
+
15
+ # revision identifiers, used by Alembic.
16
+ revision: str = "3093c7336477"
17
+ down_revision: Union[str, None] = None
18
+ branch_labels: Union[str, Sequence[str], None] = None
19
+ depends_on: Union[str, Sequence[str], None] = None
20
+
21
+
22
+ def upgrade() -> None:
23
+ # ### commands auto generated by Alembic - please adjust! ###
24
+ op.create_table(
25
+ "permission",
26
+ sa.Column("id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
27
+ sa.Column("created_at", sa.DateTime(), nullable=True),
28
+ sa.Column("created_by", sqlmodel.sql.sqltypes.AutoString(), nullable=True),
29
+ sa.Column("updated_at", sa.DateTime(), nullable=True),
30
+ sa.Column("updated_by", sqlmodel.sql.sqltypes.AutoString(), nullable=True),
31
+ sa.Column("name", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
32
+ sa.Column("description", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
33
+ sa.PrimaryKeyConstraint("id"),
34
+ )
35
+ op.create_index(op.f("ix_permission_name"), "permission", ["name"], unique=False)
36
+ op.create_index(
37
+ op.f("ix_permission_created_at"), "permission", ["created_at"], unique=False
38
+ )
39
+ op.create_index(
40
+ op.f("ix_permission_created_by"), "permission", ["created_by"], unique=False
41
+ )
42
+ op.create_index(
43
+ op.f("ix_permission_updated_at"), "permission", ["updated_at"], unique=False
44
+ )
45
+ op.create_index(
46
+ op.f("ix_permission_updated_by"), "permission", ["updated_by"], unique=False
47
+ )
48
+
49
+ op.create_table(
50
+ "role",
51
+ sa.Column("id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
52
+ sa.Column("created_at", sa.DateTime(), nullable=True),
53
+ sa.Column("created_by", sqlmodel.sql.sqltypes.AutoString(), nullable=True),
54
+ sa.Column("updated_at", sa.DateTime(), nullable=True),
55
+ sa.Column("updated_by", sqlmodel.sql.sqltypes.AutoString(), nullable=True),
56
+ sa.Column("name", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
57
+ sa.Column("description", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
58
+ sa.PrimaryKeyConstraint("id"),
59
+ )
60
+ op.create_index(op.f("ix_role_name"), "role", ["name"], unique=False)
61
+ op.create_index(op.f("ix_role_created_at"), "role", ["created_at"], unique=False)
62
+ op.create_index(op.f("ix_role_created_by"), "role", ["created_by"], unique=False)
63
+ op.create_index(op.f("ix_role_updated_at"), "role", ["updated_at"], unique=False)
64
+ op.create_index(op.f("ix_role_updated_by"), "role", ["updated_by"], unique=False)
65
+
66
+ op.create_table(
67
+ "rolepermission",
68
+ sa.Column("id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
69
+ sa.Column("role_id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
70
+ sa.Column("permission_id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
71
+ sa.Column("created_at", sa.DateTime(), nullable=True),
72
+ sa.Column("created_by", sqlmodel.sql.sqltypes.AutoString(), nullable=True),
73
+ sa.PrimaryKeyConstraint("id"),
74
+ )
75
+ op.create_index(
76
+ op.f("ix_rolepermission_permission_id"),
77
+ "rolepermission",
78
+ ["permission_id"],
79
+ unique=False,
80
+ )
81
+ op.create_index(
82
+ op.f("ix_rolepermission_role_id"), "rolepermission", ["role_id"], unique=False
83
+ )
84
+
85
+ op.create_table(
86
+ "user",
87
+ sa.Column("id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
88
+ sa.Column("username", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
89
+ sa.Column("password", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
90
+ sa.Column("created_at", sa.DateTime(), nullable=False),
91
+ sa.Column("created_by", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
92
+ sa.Column("updated_at", sa.DateTime(), nullable=True),
93
+ sa.Column("updated_by", sqlmodel.sql.sqltypes.AutoString(), nullable=True),
94
+ sa.PrimaryKeyConstraint("id"),
95
+ )
96
+ op.create_index(op.f("ix_user_username"), "user", ["username"], unique=False)
97
+ op.create_index(op.f("ix_user_created_at"), "user", ["created_at"], unique=False)
98
+ op.create_index(op.f("ix_user_created_by"), "user", ["created_by"], unique=False)
99
+ op.create_index(op.f("ix_user_updated_at"), "user", ["updated_at"], unique=False)
100
+ op.create_index(op.f("ix_user_updated_by"), "user", ["updated_by"], unique=False)
101
+
102
+ op.create_table(
103
+ "userrole",
104
+ sa.Column("id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
105
+ sa.Column("user_id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
106
+ sa.Column("role_id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
107
+ sa.Column("created_at", sa.DateTime(), nullable=True),
108
+ sa.Column("created_by", sqlmodel.sql.sqltypes.AutoString(), nullable=True),
109
+ sa.PrimaryKeyConstraint("id"),
110
+ )
111
+ op.create_index(op.f("ix_userrole_role_id"), "userrole", ["role_id"], unique=False)
112
+ op.create_index(op.f("ix_userrole_user_id"), "userrole", ["user_id"], unique=False)
113
+
114
+ op.create_table(
115
+ "session",
116
+ sa.Column("id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
117
+ sa.Column("user_id", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
118
+ sa.Column("device", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
119
+ sa.Column("os", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
120
+ sa.Column("browser", sqlmodel.sql.sqltypes.AutoString(), nullable=False),
121
+ sa.PrimaryKeyConstraint("id"),
122
+ )
123
+ op.create_index(op.f("ix_session_user_id"), "session", ["user_id"], unique=False)
124
+ # ### end Alembic commands ###
125
+
126
+
127
+ def downgrade() -> None:
128
+ # ### commands auto generated by Alembic - please adjust! ###
129
+ op.drop_index(op.f("ix_session_user_id"), table_name="session")
130
+ op.drop_table("session")
131
+
132
+ op.drop_index(op.f("ix_userrole_user_id"), table_name="userrole")
133
+ op.drop_index(op.f("ix_userrole_role_id"), table_name="userrole")
134
+ op.drop_table("userrole")
135
+
136
+ op.drop_index(op.f("ix_user_username"), table_name="user")
137
+ op.drop_index(op.f("ix_user_updated_by"), table_name="user")
138
+ op.drop_index(op.f("ix_user_updated_at"), table_name="user")
139
+ op.drop_index(op.f("ix_user_created_by"), table_name="user")
140
+ op.drop_index(op.f("ix_user_created_at"), table_name="user")
141
+ op.drop_table("user")
142
+
143
+ op.drop_index(op.f("ix_rolepermission_role_id"), table_name="rolepermission")
144
+ op.drop_index(op.f("ix_rolepermission_permission_id"), table_name="rolepermission")
145
+ op.drop_table("rolepermission")
146
+
147
+ op.drop_index(op.f("ix_role_name"), table_name="role")
148
+ op.drop_index(op.f("ix_role_updated_by"), table_name="role")
149
+ op.drop_index(op.f("ix_role_updated_at"), table_name="role")
150
+ op.drop_index(op.f("ix_role_created_by"), table_name="role")
151
+ op.drop_index(op.f("ix_role_created_at"), table_name="role")
152
+ op.drop_table("role")
153
+
154
+ op.drop_index(op.f("ix_permission_updated_by"), table_name="permission")
155
+ op.drop_index(op.f("ix_permission_updated_at"), table_name="permission")
156
+ op.drop_index(op.f("ix_permission_created_by"), table_name="permission")
157
+ op.drop_index(op.f("ix_permission_created_at"), table_name="permission")
158
+ op.drop_index(op.f("ix_permission_name"), table_name="permission")
159
+ op.drop_table("permission")
160
+ # ### end Alembic commands ###
@@ -1,6 +1,23 @@
1
- from my_app_name.schema.user import User
1
+ from my_app_name.schema.permission import Permission
2
+ from my_app_name.schema.role import Role, RolePermission
3
+ from my_app_name.schema.session import Session
4
+ from my_app_name.schema.user import User, UserRole
2
5
  from sqlalchemy import MetaData
3
6
 
4
7
  metadata = MetaData()
8
+
9
+ Permission.metadata = metadata
10
+ Permission.__table__.tometadata(metadata)
11
+
12
+ Role.metadata = metadata
13
+ Role.__table__.tometadata(metadata)
14
+ RolePermission.metadata = metadata
15
+ RolePermission.__table__.tometadata(metadata)
16
+
5
17
  User.metadata = metadata
6
18
  User.__table__.tometadata(metadata)
19
+ UserRole.metadata = metadata
20
+ UserRole.__table__.tometadata(metadata)
21
+
22
+ Session.metadata = metadata
23
+ Session.__table__.tometadata(metadata)
@@ -1,8 +1,11 @@
1
1
  from fastapi import FastAPI
2
- from my_app_name.common.app import app
2
+ from my_app_name.common.app_factory import app
3
3
  from my_app_name.common.schema import BasicResponse
4
4
  from my_app_name.config import APP_MAIN_MODULE, APP_MODE, APP_MODULES
5
- from my_app_name.module.auth.service.user.user_usecase_factory import user_usecase
5
+ from my_app_name.module.auth.service.permission.permission_service_factory import (
6
+ permission_service,
7
+ )
8
+ from my_app_name.module.auth.service.user.user_service_factory import user_service
6
9
 
7
10
 
8
11
  def serve_health_check(app: FastAPI):
@@ -31,7 +34,8 @@ def serve_route(app: FastAPI):
31
34
  serve_readiness_check(app)
32
35
 
33
36
  # Serve user endpoints for APIClient
34
- user_usecase.serve_route(app)
37
+ user_service.serve_route(app)
38
+ permission_service.serve_route(app)
35
39
 
36
40
 
37
41
  serve_route(app)
@@ -0,0 +1,117 @@
1
+ from logging import Logger
2
+
3
+ from my_app_name.common.base_service import BaseService
4
+ from my_app_name.module.auth.service.permission.repository.permission_repository import (
5
+ PermissionRepository,
6
+ )
7
+ from my_app_name.schema.permission import (
8
+ MultiplePermissionResponse,
9
+ PermissionCreateWithAudit,
10
+ PermissionResponse,
11
+ PermissionUpdateWithAudit,
12
+ )
13
+
14
+
15
+ class PermissionService(BaseService):
16
+
17
+ def __init__(self, logger: Logger, permission_repository: PermissionRepository):
18
+ super().__init__(logger)
19
+ self.permission_repository = permission_repository
20
+
21
+ @BaseService.route(
22
+ "/api/v1/permissions/{permission_id}",
23
+ methods=["get"],
24
+ response_model=PermissionResponse,
25
+ )
26
+ async def get_permission_by_id(self, permission_id: str) -> PermissionResponse:
27
+ return await self.permission_repository.get_by_id(permission_id)
28
+
29
+ @BaseService.route(
30
+ "/api/v1/permissions",
31
+ methods=["get"],
32
+ response_model=MultiplePermissionResponse,
33
+ )
34
+ async def get_permissions(
35
+ self,
36
+ page: int = 1,
37
+ page_size: int = 10,
38
+ sort: str | None = None,
39
+ filter: str | None = None,
40
+ ) -> MultiplePermissionResponse:
41
+ permissions = await self.permission_repository.get(
42
+ page, page_size, filter, sort
43
+ )
44
+ count = await self.permission_repository.count(filter)
45
+ return MultiplePermissionResponse(data=permissions, count=count)
46
+
47
+ @BaseService.route(
48
+ "/api/v1/permissions/bulk",
49
+ methods=["post"],
50
+ response_model=list[PermissionResponse],
51
+ )
52
+ async def create_permission_bulk(
53
+ self, data: list[PermissionCreateWithAudit]
54
+ ) -> list[PermissionResponse]:
55
+ permissions = await self.permission_repository.create_bulk(data)
56
+ return await self.permission_repository.get_by_ids(
57
+ [permission.id for permission in permissions]
58
+ )
59
+
60
+ @BaseService.route(
61
+ "/api/v1/permissions",
62
+ methods=["post"],
63
+ response_model=PermissionResponse,
64
+ )
65
+ async def create_permission(
66
+ self, data: PermissionCreateWithAudit
67
+ ) -> PermissionResponse:
68
+ permission = await self.permission_repository.create(data)
69
+ return await self.permission_repository.get_by_id(permission.id)
70
+
71
+ @BaseService.route(
72
+ "/api/v1/permissions/bulk",
73
+ methods=["put"],
74
+ response_model=PermissionResponse,
75
+ )
76
+ async def update_permission_bulk(
77
+ self, permission_ids: list[str], data: PermissionUpdateWithAudit
78
+ ) -> PermissionResponse:
79
+ permissions = await self.permission_repository.update_bulk(permission_ids, data)
80
+ return await self.permission_repository.get_by_ids(
81
+ [permission.id for permission in permissions]
82
+ )
83
+
84
+ @BaseService.route(
85
+ "/api/v1/permissions/{permission_id}",
86
+ methods=["put"],
87
+ response_model=PermissionResponse,
88
+ )
89
+ async def update_permission(
90
+ self, permission_id: str, data: PermissionUpdateWithAudit
91
+ ) -> PermissionResponse:
92
+ permission = await self.permission_repository.update(permission_id, data)
93
+ return await self.permission_repository.get_by_id(permission.id)
94
+
95
+ @BaseService.route(
96
+ "/api/v1/permissions/{permission_id}",
97
+ methods=["delete"],
98
+ response_model=PermissionResponse,
99
+ )
100
+ async def delete_permission_bulk(
101
+ self, permission_ids: list[str], deleted_by: str
102
+ ) -> PermissionResponse:
103
+ permissions = await self.permission_repository.delete_bulk(permission_ids)
104
+ return await self.permission_repository.get_by_ids(
105
+ [permission.id for permission in permissions]
106
+ )
107
+
108
+ @BaseService.route(
109
+ "/api/v1/permissions/{permission_id}",
110
+ methods=["delete"],
111
+ response_model=PermissionResponse,
112
+ )
113
+ async def delete_permission(
114
+ self, permission_id: str, deleted_by: str
115
+ ) -> PermissionResponse:
116
+ permission = await self.permission_repository.delete(permission_id)
117
+ return await self.permission_repository.get_by_id(permission.id)
@@ -0,0 +1,11 @@
1
+ from my_app_name.common.logger_factory import logger
2
+ from my_app_name.module.auth.service.permission.permission_service import (
3
+ PermissionService,
4
+ )
5
+ from my_app_name.module.auth.service.permission.repository.permission_repository_factory import (
6
+ permission_repository,
7
+ )
8
+
9
+ permission_service = PermissionService(
10
+ logger, permission_repository=permission_repository
11
+ )
@@ -0,0 +1,26 @@
1
+ from my_app_name.common.base_db_repository import BaseDBRepository
2
+ from my_app_name.module.auth.service.permission.repository.permission_repository import (
3
+ PermissionRepository,
4
+ )
5
+ from my_app_name.schema.permission import (
6
+ Permission,
7
+ PermissionCreateWithAudit,
8
+ PermissionResponse,
9
+ PermissionUpdateWithAudit,
10
+ )
11
+
12
+
13
+ class PermissionDBRepository(
14
+ BaseDBRepository[
15
+ Permission,
16
+ PermissionResponse,
17
+ PermissionCreateWithAudit,
18
+ PermissionUpdateWithAudit,
19
+ ],
20
+ PermissionRepository,
21
+ ):
22
+ db_model = Permission
23
+ response_model = PermissionResponse
24
+ create_model = PermissionCreateWithAudit
25
+ update_model = PermissionUpdateWithAudit
26
+ entity_name = "permission"
@@ -0,0 +1,61 @@
1
+ from abc import ABC, abstractmethod
2
+
3
+ from my_app_name.schema.permission import (
4
+ Permission,
5
+ PermissionCreateWithAudit,
6
+ PermissionResponse,
7
+ PermissionUpdateWithAudit,
8
+ )
9
+
10
+
11
+ class PermissionRepository(ABC):
12
+
13
+ @abstractmethod
14
+ async def get_by_id(self, id: str) -> PermissionResponse:
15
+ """Get permission by id"""
16
+
17
+ @abstractmethod
18
+ async def get_by_ids(self, id_list: list[str]) -> PermissionResponse:
19
+ """Get permissions by ids"""
20
+
21
+ @abstractmethod
22
+ async def get(
23
+ self,
24
+ page: int = 1,
25
+ page_size: int = 10,
26
+ filter: str | None = None,
27
+ sort: str | None = None,
28
+ ) -> list[Permission]:
29
+ """Get permissions by filter and sort"""
30
+
31
+ @abstractmethod
32
+ async def count(self, filter: str | None = None) -> int:
33
+ """Count permissions by filter"""
34
+
35
+ @abstractmethod
36
+ async def create(self, data: PermissionCreateWithAudit) -> Permission:
37
+ """Create a new permission"""
38
+
39
+ @abstractmethod
40
+ async def create_bulk(
41
+ self, data: list[PermissionCreateWithAudit]
42
+ ) -> list[Permission]:
43
+ """Create some permissions"""
44
+
45
+ @abstractmethod
46
+ async def delete(self, id: str) -> Permission:
47
+ """Delete a permission"""
48
+
49
+ @abstractmethod
50
+ async def delete_bulk(self, id_list: list[str]) -> list[Permission]:
51
+ """Delete some permissions"""
52
+
53
+ @abstractmethod
54
+ async def update(self, id: str, data: PermissionUpdateWithAudit) -> Permission:
55
+ """Update a permission"""
56
+
57
+ @abstractmethod
58
+ async def update_bulk(
59
+ self, id_list: list[str], data: PermissionUpdateWithAudit
60
+ ) -> list[Permission]:
61
+ """Update some permissions"""
@@ -0,0 +1,13 @@
1
+ from my_app_name.common.db_engine_factory import db_engine
2
+ from my_app_name.config import APP_REPOSITORY_TYPE
3
+ from my_app_name.module.auth.service.permission.repository.permission_db_repository import (
4
+ PermissionDBRepository,
5
+ )
6
+ from my_app_name.module.auth.service.permission.repository.permission_repository import (
7
+ PermissionRepository,
8
+ )
9
+
10
+ if APP_REPOSITORY_TYPE == "db":
11
+ permission_repository: PermissionRepository = PermissionDBRepository(db_engine)
12
+ else:
13
+ permission_repository: PermissionRepository = None