arpakitlib 1.8.14__py3-none-any.whl → 1.8.16__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 (307) hide show
  1. arpakitlib/_arpakit_project_template_v_4/arpakitlib_project_template_info.json +3 -0
  2. arpakitlib/_arpakit_project_template_v_4/command/beautify_json.py +10 -0
  3. arpakitlib/_arpakit_project_template_v_4/command/demojize.py +9 -0
  4. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/drop_json_db.py +1 -1
  5. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/drop_sqlalchemy_db.py +1 -1
  6. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/generate_settings_env_example.py +2 -2
  7. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/reinit_json_db.py +1 -1
  8. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/reinit_sqlalchemy_db.py +1 -1
  9. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/remove_operations.py +1 -1
  10. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/remove_story_logs.py +1 -1
  11. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/rm_all_records_in_json_db.py +1 -1
  12. arpakitlib/_arpakit_project_template_v_4/command/set_tg_bot_commands.py +16 -0
  13. arpakitlib/_arpakit_project_template_v_4/command/show_settings.py +10 -0
  14. arpakitlib/_arpakit_project_template_v_4/command/start_sqladmin.py +19 -0
  15. arpakitlib/_arpakit_project_template_v_4/command/start_sqladmin_for_prod.py +19 -0
  16. arpakitlib/_arpakit_project_template_v_4/command/start_sqladmin_with_reload.py +19 -0
  17. arpakitlib/_arpakit_project_template_v_4/command/start_tg_bot_for_prod.py +11 -0
  18. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/example.env +11 -5
  19. arpakitlib/_arpakit_project_template_v_4/project/additional_model/common.py +8 -0
  20. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/auth.py +112 -36
  21. arpakitlib/_arpakit_project_template_v_4/project/api/auth2.py +171 -0
  22. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/create_api_app.py +7 -7
  23. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/event.py +8 -8
  24. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/exception.py +1 -1
  25. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/exception_handler.py +38 -36
  26. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/openapi_ui.py +1 -1
  27. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/response.py +5 -5
  28. arpakitlib/_arpakit_project_template_v_4/project/api/router/admin/get_arpakitlib_project_template_info.py +23 -0
  29. arpakitlib/_arpakit_project_template_v_4/project/api/router/admin/get_auth_data.py +30 -0
  30. arpakitlib/_arpakit_project_template_v_4/project/api/router/admin/main_router.py +3 -0
  31. arpakitlib/{_arpakit_project_template_v_2/project/api/router/general → _arpakit_project_template_v_4/project/api/router/client}/get_errors_info.py +3 -9
  32. arpakitlib/_arpakit_project_template_v_4/project/api/router/client/main_router.py +3 -0
  33. arpakitlib/_arpakit_project_template_v_4/project/api/router/client/now_utc_datetime.py +22 -0
  34. arpakitlib/_arpakit_project_template_v_4/project/api/router/general/healthcheck.py +21 -0
  35. arpakitlib/_arpakit_project_template_v_4/project/api/router/general/main_router.py +10 -0
  36. arpakitlib/_arpakit_project_template_v_4/project/api/router/main_router.py +23 -0
  37. arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/admin/common.py +10 -0
  38. arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/admin/operation.py +23 -0
  39. arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/admin/story_log.py +17 -0
  40. arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/client/common.py +10 -0
  41. arpakitlib/{_arpakit_project_template_v_2/project/api/schema/common/out.py → _arpakit_project_template_v_4/project/api/schema/out/common/datetime_.py} +2 -19
  42. arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/common/raw_data.py +7 -0
  43. arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/common.py +5 -0
  44. arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/general/error.py +11 -0
  45. arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/general/errors_info_general.py +6 -0
  46. arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/general/healthcheck.py +5 -0
  47. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/core/const.py +2 -2
  48. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/core/settings.py +43 -39
  49. arpakitlib/_arpakit_project_template_v_4/project/site/router/__init__.py +0 -0
  50. arpakitlib/_arpakit_project_template_v_4/project/sqladmin_/__init__.py +0 -0
  51. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqladmin_/admin_auth.py +17 -12
  52. arpakitlib/_arpakit_project_template_v_4/project/sqladmin_/asgi.py +3 -0
  53. arpakitlib/_arpakit_project_template_v_4/project/sqladmin_/create_sqladmin_app.py +49 -0
  54. arpakitlib/_arpakit_project_template_v_4/project/sqladmin_/event.py +40 -0
  55. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqladmin_/model_view/operation.py +1 -1
  56. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqladmin_/model_view/story_log.py +1 -1
  57. arpakitlib/_arpakit_project_template_v_4/project/sqlalchemy_db_/__init__.py +0 -0
  58. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqlalchemy_db_/sqlalchemy_model/__init__.py +4 -0
  59. arpakitlib/_arpakit_project_template_v_4/project/sqlalchemy_db_/sqlalchemy_model/api_key.py +44 -0
  60. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqlalchemy_db_/sqlalchemy_model/common.py +29 -6
  61. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqlalchemy_db_/sqlalchemy_model/story_log.py +2 -1
  62. arpakitlib/_arpakit_project_template_v_4/project/sqlalchemy_db_/sqlalchemy_model/user.py +87 -0
  63. arpakitlib/_arpakit_project_template_v_4/project/sqlalchemy_db_/sqlalchemy_model/user_token.py +41 -0
  64. arpakitlib/_arpakit_project_template_v_4/project/test_data/__init__.py +0 -0
  65. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/__init__.py +0 -0
  66. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/blank/__init__.py +0 -0
  67. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/blank/admin.py +45 -0
  68. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/blank/client.py +44 -0
  69. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/blank/common.py +5 -0
  70. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/callback/__init__.py +0 -0
  71. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/callback/admin.py +0 -0
  72. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/callback/client.py +5 -0
  73. arpakitlib/{_arpakit_project_template_v_2/project/tg_bot/kb/inline_/callback.py → _arpakit_project_template_v_4/project/tg_bot/callback/common.py} +7 -7
  74. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/tg_bot/const.py +22 -6
  75. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/error_handler.py +37 -0
  76. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/tg_bot/event.py +43 -13
  77. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/filter_/__init__.py +0 -0
  78. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/filter_/is_private_chat.py +12 -0
  79. arpakitlib/{_arpakit_project_template_v_2/project/tg_bot/filter_.py → _arpakit_project_template_v_4/project/tg_bot/filter_/message_text.py} +1 -22
  80. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/filter_/not_prod_mode_filter.py +8 -0
  81. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/filter_/prod_mode_filter.py +8 -0
  82. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/filter_/user_roles_has_admin.py +27 -0
  83. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/filter_/user_roles_has_client.py +27 -0
  84. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/__init__.py +0 -0
  85. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/inline_/__init__.py +0 -0
  86. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/inline_/admin/__init__.py +0 -0
  87. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/inline_/admin/common.py +0 -0
  88. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/inline_/client/__init__.py +0 -0
  89. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/inline_/client/common.py +0 -0
  90. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/inline_/client/hello_world.py +16 -0
  91. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/inline_/common.py +0 -0
  92. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/static_/__init__.py +0 -0
  93. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/static_/admin/__init__.py +0 -0
  94. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/static_/admin/common.py +0 -0
  95. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/static_/client/__init__.py +0 -0
  96. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/static_/client/common.py +0 -0
  97. arpakitlib/{_arpakit_project_template_v_2/project/tg_bot/kb/static_/common.py → _arpakit_project_template_v_4/project/tg_bot/kb/static_/client/hello_world.py} +3 -3
  98. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/static_/common.py +0 -0
  99. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/middleware/__init__.py +0 -0
  100. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/middleware/common.py +13 -0
  101. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/middleware/init_user.py +84 -0
  102. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/tg_bot/middleware/middleware.py +1 -2
  103. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/__init__.py +0 -0
  104. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/admin/__init__.py +0 -0
  105. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/admin/arpakitlib_project_template_info.py +25 -0
  106. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/admin/main_router.py +15 -0
  107. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/admin/me.py +20 -0
  108. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/admin/raise_fake_error.py +20 -0
  109. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/admin/reinit_sqlalchemy_db.py +27 -0
  110. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/client/__init__.py +0 -0
  111. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/client/healthcheck.py +16 -0
  112. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/client/hello_world.py +44 -0
  113. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/client/main_router.py +14 -0
  114. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/client/start.py +33 -0
  115. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/main_router.py +13 -0
  116. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/tg_bot/start_tg_bot.py +2 -2
  117. arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/tg_bot/tg_bot.py +7 -0
  118. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/util/__init__.py +0 -0
  119. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/util/etc.py +0 -0
  120. arpakitlib/_arpakit_project_template_v_4/project/tg_bot/util/set_tg_bot_commands.py +76 -0
  121. arpakitlib/_arpakit_project_template_v_4/project/util/__init__.py +0 -0
  122. arpakitlib/ar_aiogram_util.py +0 -3
  123. arpakitlib/ar_arpakit_schedule_uust_api_client_util.py +1 -65
  124. arpakitlib/ar_json_util.py +43 -12
  125. arpakitlib/ar_sqlalchemy_util.py +2 -2
  126. arpakitlib/ar_ssh_runner_util.py +2 -2
  127. arpakitlib/ar_str_util.py +15 -0
  128. {arpakitlib-1.8.14.dist-info → arpakitlib-1.8.16.dist-info}/METADATA +2 -1
  129. arpakitlib-1.8.16.dist-info/RECORD +330 -0
  130. arpakitlib/_arpakit_project_template_v_2/arpakitlib_project_template_info.json +0 -3
  131. arpakitlib/_arpakit_project_template_v_2/command/beautify_json.py +0 -10
  132. arpakitlib/_arpakit_project_template_v_2/command/show_settings.py +0 -10
  133. arpakitlib/_arpakit_project_template_v_2/project/additional_model/common.py +0 -1
  134. arpakitlib/_arpakit_project_template_v_2/project/api/router/general/get_auth_data.py +0 -31
  135. arpakitlib/_arpakit_project_template_v_2/project/api/router/general/healthcheck.py +0 -26
  136. arpakitlib/_arpakit_project_template_v_2/project/api/router/general/main_router.py +0 -24
  137. arpakitlib/_arpakit_project_template_v_2/project/api/router/general/now_utc_datetime.py +0 -26
  138. arpakitlib/_arpakit_project_template_v_2/project/api/router/main_router.py +0 -11
  139. arpakitlib/_arpakit_project_template_v_2/project/api/schema/common/in_.py +0 -5
  140. arpakitlib/_arpakit_project_template_v_2/project/api/schema/example/in_.py +0 -5
  141. arpakitlib/_arpakit_project_template_v_2/project/api/schema/example/out.py +0 -45
  142. arpakitlib/_arpakit_project_template_v_2/project/api/schema/general/in_.py +0 -5
  143. arpakitlib/_arpakit_project_template_v_2/project/api/schema/general/out.py +0 -14
  144. arpakitlib/_arpakit_project_template_v_2/project/tg_bot/blank/blank.py +0 -24
  145. arpakitlib/_arpakit_project_template_v_2/project/tg_bot/kb/inline_/common.py +0 -15
  146. arpakitlib/_arpakit_project_template_v_2/project/tg_bot/middleware/init_user.py +0 -21
  147. arpakitlib/_arpakit_project_template_v_2/project/tg_bot/router/arpakitlib_project_template_info.py +0 -14
  148. arpakitlib/_arpakit_project_template_v_2/project/tg_bot/router/error.py +0 -16
  149. arpakitlib/_arpakit_project_template_v_2/project/tg_bot/router/healthcheck.py +0 -11
  150. arpakitlib/_arpakit_project_template_v_2/project/tg_bot/router/main_router.py +0 -12
  151. arpakitlib/_arpakit_project_template_v_2/project/tg_bot/util.py +0 -1
  152. arpakitlib-1.8.14.dist-info/RECORD +0 -265
  153. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/.gitignore +0 -0
  154. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/.python-version +0 -0
  155. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/LICENSE +0 -0
  156. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/README.md +0 -0
  157. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/alembic/README +0 -0
  158. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/alembic/env.py +0 -0
  159. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/alembic/script.py.mako +0 -0
  160. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/alembic/versions/__init__.py +0 -0
  161. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/alembic.ini +0 -0
  162. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/__init__.py +0 -0
  163. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/alembic_history.sh +0 -0
  164. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/alembic_revision_autogenerate.sh +0 -0
  165. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/alembic_upgrade_head.sh +0 -0
  166. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/check_logging.py +0 -0
  167. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/check_sqlalchemy_db.py +0 -0
  168. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/docker_ps_a.sh +0 -0
  169. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/docker_rm_postgres.sh +0 -0
  170. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/docker_run_postgres.sh +0 -0
  171. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/docker_start_postgres.sh +0 -0
  172. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/docker_stop_postgres.sh +0 -0
  173. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_commit.sh +0 -0
  174. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_push_arpakit_company_github_1.sh +0 -0
  175. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_push_arpakit_company_gitlab_1.sh +0 -0
  176. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_push_arpakit_github_1.sh +0 -0
  177. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_push_arpakit_gitlab_1.sh +0 -0
  178. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_remote_v.sh +0 -0
  179. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_set_arpakit_company_origin.sh +0 -0
  180. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_set_arpakit_origin.sh +0 -0
  181. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_set_divarteam_origin.sh +0 -0
  182. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_status.sh +0 -0
  183. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/hello_world.py +0 -0
  184. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/init_json_db.py +0 -0
  185. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/init_sqlalchemy_db.py +0 -0
  186. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_check.sh +0 -0
  187. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_clear_cache.sh +0 -0
  188. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_config.sh +0 -0
  189. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_install.sh +0 -0
  190. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_lock.sh +0 -0
  191. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_remove_and_add_arpakitlib.sh +0 -0
  192. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_show.sh +0 -0
  193. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_show_arpakitlib.sh +0 -0
  194. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_update.sh +0 -0
  195. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_update_arpakitlib.sh +0 -0
  196. /arpakitlib/{_arpakit_project_template_v_2/command/start_api_for_not_prod.py → _arpakit_project_template_v_4/command/start_api.py} +0 -0
  197. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/start_api_for_prod.py +0 -0
  198. /arpakitlib/{_arpakit_project_template_v_2/command/start_api_with_reload_for_not_prod.py → _arpakit_project_template_v_4/command/start_api_with_reload.py} +0 -0
  199. /arpakitlib/{_arpakit_project_template_v_2/command/start_operation_executor_worker_for_not_prod.py → _arpakit_project_template_v_4/command/start_operation_executor_worker.py} +0 -0
  200. /arpakitlib/{_arpakit_project_template_v_2/command/start_operation_executor_workers_for_not_prod.py → _arpakit_project_template_v_4/command/start_operation_executor_workers.py} +0 -0
  201. /arpakitlib/{_arpakit_project_template_v_2/command/start_scheduled_operation_creator_worker_for_not_prod.py → _arpakit_project_template_v_4/command/start_scheduled_operation_creator_worker.py} +0 -0
  202. /arpakitlib/{_arpakit_project_template_v_2/command/start_tg_bot_for_prod.py → _arpakit_project_template_v_4/command/start_tg_bot.py} +0 -0
  203. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/note/note_1.txt +0 -0
  204. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/note/note_2.txt +0 -0
  205. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/note/note_3.txt +0 -0
  206. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/note/note_4.txt +0 -0
  207. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/note/note_5.txt +0 -0
  208. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/__init__.py +0 -0
  209. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/additional_model/__init__.py +0 -0
  210. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/__init__.py +0 -0
  211. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/asgi.py +0 -0
  212. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/const.py +0 -0
  213. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/router/__init__.py +0 -0
  214. /arpakitlib/{_arpakit_project_template_v_2/project/api/router/general → _arpakit_project_template_v_4/project/api/router/admin}/__init__.py +0 -0
  215. /arpakitlib/{_arpakit_project_template_v_2/project/api/schema → _arpakit_project_template_v_4/project/api/router/client}/__init__.py +0 -0
  216. /arpakitlib/{_arpakit_project_template_v_2/project/api/schema/common → _arpakit_project_template_v_4/project/api/router/general}/__init__.py +0 -0
  217. /arpakitlib/{_arpakit_project_template_v_2/project/api/schema/example → _arpakit_project_template_v_4/project/api/schema}/__init__.py +0 -0
  218. /arpakitlib/{_arpakit_project_template_v_2/project/api/schema/base_schema.py → _arpakit_project_template_v_4/project/api/schema/common.py} +0 -0
  219. /arpakitlib/{_arpakit_project_template_v_2/project/api/schema/general → _arpakit_project_template_v_4/project/api/schema/in_}/__init__.py +0 -0
  220. /arpakitlib/{_arpakit_project_template_v_2/project/business_service → _arpakit_project_template_v_4/project/api/schema/in_/admin}/__init__.py +0 -0
  221. /arpakitlib/{_arpakit_project_template_v_2/project/api/util.py → _arpakit_project_template_v_4/project/api/schema/in_/admin/common.py} +0 -0
  222. /arpakitlib/{_arpakit_project_template_v_2/project/celery_ → _arpakit_project_template_v_4/project/api/schema/in_/client}/__init__.py +0 -0
  223. /arpakitlib/{_arpakit_project_template_v_2/project/core/__init__.py → _arpakit_project_template_v_4/project/api/schema/in_/client/common.py} +0 -0
  224. /arpakitlib/{_arpakit_project_template_v_2/project/json_db → _arpakit_project_template_v_4/project/api/schema/in_/general}/__init__.py +0 -0
  225. /arpakitlib/{_arpakit_project_template_v_2/project/operation_execution/__init__.py → _arpakit_project_template_v_4/project/api/schema/in_/general/common.py} +0 -0
  226. /arpakitlib/{_arpakit_project_template_v_2/project/resource → _arpakit_project_template_v_4/project/api/schema/out}/__init__.py +0 -0
  227. /arpakitlib/{_arpakit_project_template_v_2/project/sandbox → _arpakit_project_template_v_4/project/api/schema/out/admin}/__init__.py +0 -0
  228. /arpakitlib/{_arpakit_project_template_v_2/project/site → _arpakit_project_template_v_4/project/api/schema/out/client}/__init__.py +0 -0
  229. /arpakitlib/{_arpakit_project_template_v_2/project/site/router → _arpakit_project_template_v_4/project/api/schema/out/common}/__init__.py +0 -0
  230. /arpakitlib/{_arpakit_project_template_v_2/project/sqladmin_ → _arpakit_project_template_v_4/project/api/schema/out/general}/__init__.py +0 -0
  231. /arpakitlib/{_arpakit_project_template_v_2/project/site/consts.py → _arpakit_project_template_v_4/project/api/schema/out/general/common.py} +0 -0
  232. /arpakitlib/{_arpakit_project_template_v_2/project/site/exception_handler.py → _arpakit_project_template_v_4/project/api/util.py} +0 -0
  233. /arpakitlib/{_arpakit_project_template_v_2/project/sqlalchemy_db_ → _arpakit_project_template_v_4/project/business_service}/__init__.py +0 -0
  234. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/business_service/hello_world.py +0 -0
  235. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/business_service/remove_operations.py +0 -0
  236. /arpakitlib/{_arpakit_project_template_v_2/project/test_data → _arpakit_project_template_v_4/project/celery_}/__init__.py +0 -0
  237. /arpakitlib/{_arpakit_project_template_v_2/project/tg_bot → _arpakit_project_template_v_4/project/core}/__init__.py +0 -0
  238. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/core/cache_file_storage_in_dir.py +0 -0
  239. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/core/dump_file_storage_in_dir.py +0 -0
  240. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/core/jinja2_templates.py +0 -0
  241. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/core/media_file_storage_in_dir.py +0 -0
  242. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/core/util.py +0 -0
  243. /arpakitlib/{_arpakit_project_template_v_2/project/tg_bot/blank → _arpakit_project_template_v_4/project/json_db}/__init__.py +0 -0
  244. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/json_db/json_db.py +0 -0
  245. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/more/helloworld +0 -0
  246. /arpakitlib/{_arpakit_project_template_v_2/project/tg_bot/kb → _arpakit_project_template_v_4/project/operation_execution}/__init__.py +0 -0
  247. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/operation_execution/const.py +0 -0
  248. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/operation_execution/operation_executor_worker.py +0 -0
  249. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/operation_execution/scheduled_operation_creator_worker.py +0 -0
  250. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/operation_execution/scheduled_operations.py +0 -0
  251. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/operation_execution/util.py +0 -0
  252. /arpakitlib/{_arpakit_project_template_v_2/project/tg_bot/kb/inline_ → _arpakit_project_template_v_4/project/resource}/__init__.py +0 -0
  253. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/1 +0 -0
  254. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/healthcheck +0 -0
  255. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/helloworld +0 -0
  256. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/openapi-favicon.png +0 -0
  257. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/redoc/redoc.standalone.js +0 -0
  258. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/favicon-16x16.png +0 -0
  259. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/favicon-32x32.png +0 -0
  260. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/index.css +0 -0
  261. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/index.html +0 -0
  262. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/oauth2-redirect.html +0 -0
  263. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-initializer.js +0 -0
  264. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui-bundle.js +0 -0
  265. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui-bundle.js.map +0 -0
  266. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui-es-bundle-core.js +0 -0
  267. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui-es-bundle-core.js.map +0 -0
  268. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui-es-bundle.js +0 -0
  269. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui-es-bundle.js.map +0 -0
  270. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui-standalone-preset.js +0 -0
  271. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui-standalone-preset.js.map +0 -0
  272. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui.css +0 -0
  273. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui.css.map +0 -0
  274. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui.js +0 -0
  275. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui.js.map +0 -0
  276. /arpakitlib/{_arpakit_project_template_v_2/project/tg_bot/kb/static_ → _arpakit_project_template_v_4/project/sandbox}/__init__.py +0 -0
  277. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sandbox/sandbox_1.py +0 -0
  278. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sandbox/sandbox_2.py +0 -0
  279. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sandbox/sandbox_3.py +0 -0
  280. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sandbox/sandbox_4.py +0 -0
  281. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sandbox/sandbox_5.py +0 -0
  282. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sandbox/sandbox_6.py +0 -0
  283. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sandbox/sandbox_7.py +0 -0
  284. /arpakitlib/{_arpakit_project_template_v_2/project/tg_bot/middleware → _arpakit_project_template_v_4/project/site}/__init__.py +0 -0
  285. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/site/asgi.py +0 -0
  286. /arpakitlib/{_arpakit_project_template_v_2/project/tg_bot/router/__init__.py → _arpakit_project_template_v_4/project/site/consts.py} +0 -0
  287. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/site/create_site_app.py +0 -0
  288. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/site/event.py +0 -0
  289. /arpakitlib/{_arpakit_project_template_v_2/project/util/__init__.py → _arpakit_project_template_v_4/project/site/exception_handler.py} +0 -0
  290. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/site/router/main_router.py +0 -0
  291. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqladmin_/add_admin_in_app.py +0 -0
  292. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqladmin_/model_view/__init__.py +0 -0
  293. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqladmin_/model_view/common.py +0 -0
  294. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqlalchemy_db_/const.py +0 -0
  295. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqlalchemy_db_/sqlalchemy_db.py +0 -0
  296. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqlalchemy_db_/sqlalchemy_model/operation.py +0 -0
  297. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqlalchemy_db_/util.py +0 -0
  298. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/test_data/make_test_data_1.py +0 -0
  299. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/test_data/make_test_data_2.py +0 -0
  300. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/test_data/make_test_data_3.py +0 -0
  301. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/test_data/make_test_data_4.py +0 -0
  302. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/test_data/make_test_data_5.py +0 -0
  303. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/tg_bot/tg_bot_dispatcher.py +0 -0
  304. /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/util/arpakitlib_project_template.py +0 -0
  305. {arpakitlib-1.8.14.dist-info → arpakitlib-1.8.16.dist-info}/LICENSE +0 -0
  306. {arpakitlib-1.8.14.dist-info → arpakitlib-1.8.16.dist-info}/WHEEL +0 -0
  307. {arpakitlib-1.8.14.dist-info → arpakitlib-1.8.16.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,171 @@
1
+ from typing import Callable
2
+
3
+ import fastapi
4
+ import fastapi.exceptions
5
+ import fastapi.responses
6
+ import fastapi.security
7
+ from fastapi import Security
8
+ from fastapi.security import APIKeyHeader
9
+ from pydantic import BaseModel, ConfigDict
10
+
11
+ from arpakitlib.ar_func_util import is_async_callable, is_sync_function
12
+ from arpakitlib.ar_json_util import transfer_data_to_json_str_to_data
13
+ from project.api.const import APIErrorCodes
14
+ from project.api.exception import APIException
15
+ from project.core.settings import get_cached_settings
16
+
17
+
18
+ class APIAuthData(BaseModel):
19
+ model_config = ConfigDict(extra="forbid", arbitrary_types_allowed=True, from_attributes=True)
20
+
21
+ api_key_string: str | None = None
22
+ user_token_string: str | None = None
23
+
24
+ prod_mode: bool = False
25
+
26
+
27
+ def api_auth(
28
+ *,
29
+ middleware_funcs: list[Callable] | None = None
30
+ ) -> Callable:
31
+ if middleware_funcs is None:
32
+ middleware_funcs = []
33
+
34
+ async def async_func(
35
+ *,
36
+ ac: fastapi.security.HTTPAuthorizationCredentials | None = fastapi.Security(
37
+ fastapi.security.HTTPBearer(auto_error=False)
38
+ ),
39
+ api_key_string: str | None = Security(
40
+ APIKeyHeader(name="apikey", auto_error=False)
41
+ ),
42
+ request: fastapi.requests.Request
43
+ ) -> APIAuthData:
44
+
45
+ api_auth_data = APIAuthData(
46
+ prod_mode=get_cached_settings().prod_mode
47
+ )
48
+
49
+ # parse api_key
50
+
51
+ api_auth_data.api_key_string = api_key_string
52
+
53
+ if not api_auth_data.api_key_string and "api_key" in request.headers.keys():
54
+ api_auth_data.api_key_string = request.headers["api_key"]
55
+ if not api_auth_data.api_key_string and "api-key" in request.headers.keys():
56
+ api_auth_data.api_key_string = request.headers["api-key"]
57
+ if not api_auth_data.api_key_string and "apikey" in request.headers.keys():
58
+ api_auth_data.api_key_string = request.headers["apikey"]
59
+
60
+ if not api_auth_data.api_key_string and "api_key" in request.query_params.keys():
61
+ api_auth_data.api_key_string = request.query_params["api_key"]
62
+ if not api_auth_data.api_key_string and "api-key" in request.query_params.keys():
63
+ api_auth_data.api_key_string = request.query_params["api-key"]
64
+ if not api_auth_data.api_key_string and "apikey" in request.query_params.keys():
65
+ api_auth_data.api_key_string = request.query_params["apikey"]
66
+
67
+ if api_auth_data.api_key_string:
68
+ api_auth_data.api_key_string = api_auth_data.api_key_string.strip()
69
+ if not api_auth_data.api_key_string:
70
+ api_auth_data.api_key_string = None
71
+
72
+ # parse user_token
73
+
74
+ api_auth_data.user_token_string = ac.credentials if ac and ac.credentials and ac.credentials.strip() else None
75
+
76
+ if not api_auth_data.user_token_string and "token" in request.headers.keys():
77
+ api_auth_data.user_token_string = request.headers["token"]
78
+
79
+ if not api_auth_data.user_token_string and "user_token" in request.headers.keys():
80
+ api_auth_data.user_token_string = request.headers["user_token"]
81
+ if not api_auth_data.user_token_string and "user-token" in request.headers.keys():
82
+ api_auth_data.user_token_string = request.headers["user-token"]
83
+ if not api_auth_data.user_token_string and "usertoken" in request.headers.keys():
84
+ api_auth_data.user_token_string = request.headers["usertoken"]
85
+
86
+ if not api_auth_data.user_token_string and "token" in request.query_params.keys():
87
+ api_auth_data.user_token_string = request.query_params["token"]
88
+
89
+ if not api_auth_data.user_token_string and "user_token" in request.query_params.keys():
90
+ api_auth_data.user_token_string = request.query_params["user_token"]
91
+ if not api_auth_data.user_token_string and "user-token" in request.query_params.keys():
92
+ api_auth_data.user_token_string = request.query_params["user-token"]
93
+ if not api_auth_data.user_token_string and "usertoken" in request.query_params.keys():
94
+ api_auth_data.user_token_string = request.query_params["usertoken"]
95
+
96
+ if api_auth_data.user_token_string:
97
+ api_auth_data.user_token_string = api_auth_data.user_token_string.strip()
98
+ if not api_auth_data.user_token_string:
99
+ api_auth_data.user_token_string = None
100
+
101
+ # middleware_funcs
102
+
103
+ for middleware_func in middleware_funcs:
104
+ if is_async_callable(middleware_func):
105
+ await middleware_func(
106
+ api_auth_data=api_auth_data,
107
+ request=request
108
+ )
109
+ elif is_sync_function(middleware_func):
110
+ middleware_func(
111
+ api_auth_data=api_auth_data,
112
+ request=request
113
+ )
114
+ else:
115
+ raise TypeError("unknown middleware_func type")
116
+
117
+ return api_auth_data
118
+
119
+ return async_func
120
+
121
+
122
+ def require_api_key_string_middleware_func():
123
+ def func(*, api_auth_data: APIAuthData, request: fastapi.requests.Request):
124
+ if api_auth_data.api_key_string is None:
125
+ raise APIException(
126
+ status_code=fastapi.status.HTTP_401_UNAUTHORIZED,
127
+ error_code=APIErrorCodes.cannot_authorize,
128
+ error_description="api_key string is required",
129
+ error_data=transfer_data_to_json_str_to_data(api_auth_data.model_dump())
130
+ )
131
+
132
+ return func
133
+
134
+
135
+ def require_user_token_string_middleware_func():
136
+ def func(*, api_auth_data: APIAuthData, request: fastapi.requests.Request):
137
+ if api_auth_data.user_token_string is None:
138
+ raise APIException(
139
+ status_code=fastapi.status.HTTP_401_UNAUTHORIZED,
140
+ error_code=APIErrorCodes.cannot_authorize,
141
+ error_description="user_token string is required",
142
+ error_data=transfer_data_to_json_str_to_data(api_auth_data.model_dump())
143
+ )
144
+
145
+ return func
146
+
147
+
148
+ def require_prod_mode_middleware_func():
149
+ def func(*, api_auth_data: APIAuthData, request: fastapi.requests.Request):
150
+ if not get_cached_settings().prod_mode:
151
+ raise APIException(
152
+ status_code=fastapi.status.HTTP_401_UNAUTHORIZED,
153
+ error_code=APIErrorCodes.cannot_authorize,
154
+ error_description=f"prod_mode={get_cached_settings().prod_mode}",
155
+ error_data=transfer_data_to_json_str_to_data(api_auth_data.model_dump())
156
+ )
157
+
158
+ return func
159
+
160
+
161
+ def require_not_prod_mode_middleware_func():
162
+ def func(*, api_auth_data: APIAuthData, request: fastapi.requests.Request):
163
+ if get_cached_settings().prod_mode:
164
+ raise APIException(
165
+ status_code=fastapi.status.HTTP_401_UNAUTHORIZED,
166
+ error_code=APIErrorCodes.cannot_authorize,
167
+ error_description=f"prod_mode={get_cached_settings().prod_mode}",
168
+ error_data=transfer_data_to_json_str_to_data(api_auth_data.model_dump())
169
+ )
170
+
171
+ return func
@@ -5,9 +5,9 @@ from fastapi import FastAPI
5
5
  from fastapi.middleware.cors import CORSMiddleware
6
6
  from fastapi.staticfiles import StaticFiles
7
7
 
8
- from project.api.event import get_api_startup_events, get_api_shutdown_events
9
- from project.api.exception_handler import add_exception_handler_to_app
10
- from project.api.openapi_ui import add_local_openapi_ui_to_app
8
+ from project.api.event import get_startup_api_events, get_shutdown_api_events
9
+ from project.api.exception_handler import add_exception_handler_to_api_app
10
+ from project.api.openapi_ui import add_local_openapi_ui_to_api_app
11
11
  from project.api.router.main_router import main_api_router
12
12
  from project.core.const import ProjectPaths
13
13
  from project.core.settings import get_cached_settings
@@ -27,8 +27,8 @@ def create_api_app(*, prefix: str = "/api") -> FastAPI:
27
27
  docs_url=None,
28
28
  redoc_url=None,
29
29
  openapi_url="/openapi",
30
- on_startup=get_api_startup_events(),
31
- on_shutdown=get_api_shutdown_events(),
30
+ on_startup=get_startup_api_events(),
31
+ on_shutdown=get_shutdown_api_events(),
32
32
  contact={
33
33
  "name": "ARPAKIT Company",
34
34
  "url": "https://arpakit.com/",
@@ -44,9 +44,9 @@ def create_api_app(*, prefix: str = "/api") -> FastAPI:
44
44
  allow_headers=["*"],
45
45
  )
46
46
 
47
- add_local_openapi_ui_to_app(app=api_app)
47
+ add_local_openapi_ui_to_api_app(app=api_app)
48
48
 
49
- add_exception_handler_to_app(app=api_app)
49
+ add_exception_handler_to_api_app(app=api_app)
50
50
 
51
51
  api_app.include_router(
52
52
  prefix=prefix,
@@ -14,10 +14,10 @@ from project.sqlalchemy_db_.sqlalchemy_db import get_cached_sqlalchemy_db
14
14
  _logger = logging.getLogger(__name__)
15
15
 
16
16
 
17
- # STARTUP API EVENTS
17
+ # API STARTUP EVENTS
18
18
 
19
19
 
20
- async def async_api_startup_event():
20
+ async def async_startup_api_event():
21
21
  _logger.info("start")
22
22
 
23
23
  if get_cached_media_file_storage_in_dir() is not None:
@@ -56,19 +56,19 @@ async def async_api_startup_event():
56
56
  _logger.info("finish")
57
57
 
58
58
 
59
- def get_api_startup_events() -> list[Callable]:
60
- res = [async_api_startup_event]
59
+ def get_startup_api_events() -> list[Callable]:
60
+ res = [async_startup_api_event]
61
61
  return res
62
62
 
63
63
 
64
- # SHUTDOWN API EVENTS
64
+ # API SHUTDOWN EVENTS
65
65
 
66
66
 
67
- async def async_api_shutdown_event():
67
+ async def async_shutdown_api_event():
68
68
  _logger.info("start")
69
69
  _logger.info("finish")
70
70
 
71
71
 
72
- def get_api_shutdown_events() -> list[Callable]:
73
- res = [async_api_shutdown_event]
72
+ def get_shutdown_api_events() -> list[Callable]:
73
+ res = [async_shutdown_api_event]
74
74
  return res
@@ -1,9 +1,9 @@
1
1
  from typing import Any
2
2
 
3
3
  import fastapi.security
4
+ from project.api.schema.out.common.error import ErrorCommonSO
4
5
 
5
6
  from project.api.const import APIErrorCodes
6
- from project.api.schema.common.out import ErrorCommonSO
7
7
 
8
8
 
9
9
  class APIException(fastapi.exceptions.HTTPException):
@@ -11,12 +11,11 @@ from arpakitlib.ar_datetime_util import now_utc_dt
11
11
  from arpakitlib.ar_dict_util import combine_dicts
12
12
  from arpakitlib.ar_exception_util import exception_to_traceback_str
13
13
  from arpakitlib.ar_func_util import raise_if_not_async_callable, is_async_callable, is_sync_function
14
- from arpakitlib.ar_json_util import safely_transfer_obj_to_json_str
15
- from arpakitlib.ar_type_util import raise_for_type
14
+ from arpakitlib.ar_json_util import transfer_data_to_json_str
16
15
  from project.api.const import APIErrorCodes
17
16
  from project.api.exception import APIException
18
17
  from project.api.response import APIJSONResponse
19
- from project.api.schema.common.out import ErrorCommonSO
18
+ from project.api.schema.out.general.error import ErrorGeneralSO
20
19
  from project.core.settings import get_cached_settings
21
20
  from project.sqlalchemy_db_.sqlalchemy_db import get_cached_sqlalchemy_db
22
21
  from project.sqlalchemy_db_.sqlalchemy_model import StoryLogDBM
@@ -24,7 +23,7 @@ from project.sqlalchemy_db_.sqlalchemy_model import StoryLogDBM
24
23
  _logger = logging.getLogger(__name__)
25
24
 
26
25
 
27
- def create_exception_handler(
26
+ def create_api_exception_handler(
28
27
  *,
29
28
  funcs_before: list[Callable | None] | None = None,
30
29
  async_funcs_after: list[Callable | None] | None = None
@@ -37,13 +36,13 @@ def create_exception_handler(
37
36
  async_funcs_after = []
38
37
  async_funcs_after = [v for v in async_funcs_after if v is not None]
39
38
 
40
- async def func(
39
+ async def async_func(
41
40
  request: fastapi.requests.Request,
42
41
  exception: Exception
43
42
  ) -> APIJSONResponse:
44
43
  status_code = fastapi.status.HTTP_500_INTERNAL_SERVER_ERROR
45
44
 
46
- error_common_so = ErrorCommonSO(
45
+ error_common_so = ErrorGeneralSO(
47
46
  has_error=True,
48
47
  error_code=APIErrorCodes.unknown_error,
49
48
  error_data={
@@ -105,8 +104,11 @@ def create_exception_handler(
105
104
  for func_before in funcs_before:
106
105
  if is_async_callable(func_before):
107
106
  try:
108
- _func_before_res = await func_before(
109
- request=request, status_code=status_code, error_common_so=error_common_so, exception=exception,
107
+ await func_before(
108
+ request=request,
109
+ status_code=status_code,
110
+ error_common_so=error_common_so,
111
+ exception=exception,
110
112
  transmitted_kwargs=_transmitted_kwargs
111
113
  )
112
114
  except Exception as exception_:
@@ -114,8 +116,11 @@ def create_exception_handler(
114
116
  raise exception_
115
117
  elif is_sync_function(func_before):
116
118
  try:
117
- _func_before_res = func_before(
118
- request=request, status_code=status_code, error_common_so=error_common_so, exception=exception,
119
+ func_before(
120
+ request=request,
121
+ status_code=status_code,
122
+ error_common_so=error_common_so,
123
+ exception=exception,
119
124
  transmitted_kwargs=_transmitted_kwargs
120
125
  )
121
126
  except Exception as exception_:
@@ -123,10 +128,6 @@ def create_exception_handler(
123
128
  raise exception_
124
129
  else:
125
130
  raise TypeError("unknown func_before type")
126
- if _func_before_res is not None:
127
- error_common_so, _transmitted_kwargs = _func_before_res[0], _func_before_res[1]
128
- raise_for_type(error_common_so, ErrorCommonSO)
129
- raise_for_type(_transmitted_kwargs, dict)
130
131
 
131
132
  # async_funcs_after
132
133
 
@@ -141,10 +142,10 @@ def create_exception_handler(
141
142
  status_code=status_code
142
143
  )
143
144
 
144
- return func
145
+ return async_func
145
146
 
146
147
 
147
- def logging__api_func_before_in_handle_exception(
148
+ def logging_func_before_in_api_exception_handler(
148
149
  *,
149
150
  ignore_api_error_codes: list[str] | None = None,
150
151
  ignore_status_codes: list[int] | None = None,
@@ -156,30 +157,30 @@ def logging__api_func_before_in_handle_exception(
156
157
  *,
157
158
  request: fastapi.requests.Request,
158
159
  status_code: int,
159
- error_common_so: ErrorCommonSO,
160
+ error_common_so: ErrorGeneralSO,
160
161
  exception: Exception,
161
162
  transmitted_kwargs: dict[str, Any],
162
163
  **kwargs
163
- ) -> (ErrorCommonSO, dict[str, Any]):
164
+ ):
164
165
  transmitted_kwargs[current_func_name] = now_utc_dt()
165
166
 
166
167
  if ignore_api_error_codes is not None and error_common_so.error_code in ignore_api_error_codes:
167
- return error_common_so, transmitted_kwargs
168
+ return
168
169
 
169
170
  if ignore_status_codes is not None and status_code in ignore_status_codes:
170
- return error_common_so, transmitted_kwargs
171
+ return
171
172
 
172
173
  if ignore_exception_types is not None and (
173
174
  exception in ignore_exception_types or type(exception) in ignore_exception_types
174
175
  ):
175
- return error_common_so, transmitted_kwargs
176
+ return
176
177
 
177
- _logger.error(safely_transfer_obj_to_json_str(error_common_so.model_dump()), exc_info=False)
178
+ _logger.error(transfer_data_to_json_str(error_common_so.model_dump()), exc_info=False)
178
179
 
179
180
  return func
180
181
 
181
182
 
182
- def story_log__api_func_before_in_handle_exception(
183
+ def create_story_log_func_before_in_api_exception_handler(
183
184
  *,
184
185
  ignore_api_error_codes: list[str] | None = None,
185
186
  ignore_status_codes: list[int] | None = None,
@@ -191,32 +192,33 @@ def story_log__api_func_before_in_handle_exception(
191
192
  *,
192
193
  request: fastapi.requests.Request,
193
194
  status_code: int,
194
- error_common_so: ErrorCommonSO,
195
+ error_common_so: ErrorGeneralSO,
195
196
  exception: Exception,
196
197
  transmitted_kwargs: dict[str, Any],
197
198
  **kwargs
198
- ) -> (ErrorCommonSO, dict[str, Any]):
199
+ ):
199
200
  transmitted_kwargs[current_func_name] = now_utc_dt()
200
201
 
201
202
  if ignore_api_error_codes is not None and error_common_so.error_code in ignore_api_error_codes:
202
- return error_common_so, transmitted_kwargs
203
+ return
203
204
 
204
205
  if ignore_status_codes is not None and status_code in ignore_status_codes:
205
- return error_common_so, transmitted_kwargs
206
+ return
206
207
 
207
208
  if ignore_exception_types is not None and (
208
209
  exception in ignore_exception_types or type(exception) in ignore_exception_types
209
210
  ):
210
- return error_common_so, transmitted_kwargs
211
+ return
211
212
 
212
213
  async with get_cached_sqlalchemy_db().new_async_session() as session:
213
214
  story_log_dbm = StoryLogDBM(
214
215
  level=StoryLogDBM.Levels.error,
215
- type=StoryLogDBM.Types.error_in_api_route,
216
+ type=StoryLogDBM.Types.error_in_api,
216
217
  title=f"{status_code}, {type(exception)}",
217
218
  data={
219
+ "exception_str": str(exception),
218
220
  "error_common_so": error_common_so.model_dump(),
219
- "traceback_str": exception_to_traceback_str(exception=exception)
221
+ "error_traceback_str": exception_to_traceback_str(exception=exception)
220
222
  }
221
223
  )
222
224
  session.add(story_log_dbm)
@@ -226,7 +228,7 @@ def story_log__api_func_before_in_handle_exception(
226
228
  error_common_so.error_data.update({"story_log_long_id": story_log_dbm.long_id})
227
229
  transmitted_kwargs["story_log_id"] = story_log_dbm.id
228
230
 
229
- return error_common_so, transmitted_kwargs
231
+ return
230
232
 
231
233
  return async_func
232
234
 
@@ -236,11 +238,11 @@ def get_exception_handler() -> Callable:
236
238
  async_funcs_after = []
237
239
 
238
240
  if (
239
- get_cached_settings().api_story_log__api_func_before_in_exception_handler
241
+ get_cached_settings().api_create_story_log_func_before_in_api_exception_handler
240
242
  and get_cached_sqlalchemy_db() is not None
241
243
  ):
242
244
  funcs_before.append(
243
- story_log__api_func_before_in_handle_exception(
245
+ create_story_log_func_before_in_api_exception_handler(
244
246
  ignore_api_error_codes=[
245
247
  APIErrorCodes.cannot_authorize,
246
248
  APIErrorCodes.error_in_request,
@@ -258,7 +260,7 @@ def get_exception_handler() -> Callable:
258
260
  )
259
261
 
260
262
  funcs_before.append(
261
- logging__api_func_before_in_handle_exception(
263
+ logging_func_before_in_api_exception_handler(
262
264
  ignore_api_error_codes=[
263
265
  APIErrorCodes.cannot_authorize,
264
266
  APIErrorCodes.error_in_request,
@@ -275,13 +277,13 @@ def get_exception_handler() -> Callable:
275
277
  )
276
278
  )
277
279
 
278
- return create_exception_handler(
280
+ return create_api_exception_handler(
279
281
  funcs_before=funcs_before,
280
282
  async_funcs_after=async_funcs_after
281
283
  )
282
284
 
283
285
 
284
- def add_exception_handler_to_app(*, app: fastapi.FastAPI) -> fastapi.FastAPI:
286
+ def add_exception_handler_to_api_app(*, app: fastapi.FastAPI) -> fastapi.FastAPI:
285
287
  exception_handler = get_exception_handler()
286
288
 
287
289
  app.add_exception_handler(
@@ -2,7 +2,7 @@ from fastapi import FastAPI
2
2
  from fastapi.openapi.docs import get_swagger_ui_html, get_redoc_html
3
3
 
4
4
 
5
- def add_local_openapi_ui_to_app(
5
+ def add_local_openapi_ui_to_api_app(
6
6
  *,
7
7
  app: FastAPI
8
8
  ):
@@ -2,8 +2,8 @@ from typing import Any
2
2
 
3
3
  import fastapi
4
4
 
5
- from arpakitlib.ar_json_util import safely_transfer_obj_to_json_str_to_json_obj
6
- from project.api.schema.base_schema import BaseSO
5
+ from arpakitlib.ar_json_util import transfer_data_to_json_str_to_data
6
+ from project.api.schema.common import BaseSO
7
7
 
8
8
 
9
9
  class APIJSONResponse(fastapi.responses.JSONResponse):
@@ -12,11 +12,11 @@ class APIJSONResponse(fastapi.responses.JSONResponse):
12
12
  content: dict[str, Any] | list[Any] | BaseSO | None, status_code: int = fastapi.status.HTTP_200_OK
13
13
  ):
14
14
  if isinstance(content, dict):
15
- content = safely_transfer_obj_to_json_str_to_json_obj(content)
15
+ content = transfer_data_to_json_str_to_data(content)
16
16
  elif isinstance(content, list):
17
- content = safely_transfer_obj_to_json_str_to_json_obj(content)
17
+ content = transfer_data_to_json_str_to_data(content)
18
18
  elif isinstance(content, BaseSO):
19
- content = safely_transfer_obj_to_json_str_to_json_obj(content.model_dump())
19
+ content = transfer_data_to_json_str_to_data(content.model_dump())
20
20
  elif content is None:
21
21
  content = None
22
22
  else:
@@ -0,0 +1,23 @@
1
+ import fastapi
2
+ from fastapi import APIRouter
3
+
4
+ from project.api.schema.out.common.raw_data import RawDataCommonSO
5
+ from project.api.schema.out.general.error import ErrorGeneralSO
6
+ from project.util.arpakitlib_project_template import get_arpakitlib_project_template_info
7
+
8
+ api_router = APIRouter()
9
+
10
+
11
+ @api_router.get(
12
+ "",
13
+ name="Get arpakitlib project template info",
14
+ status_code=fastapi.status.HTTP_200_OK,
15
+ response_model=RawDataCommonSO | ErrorGeneralSO
16
+ )
17
+ async def _(
18
+ *,
19
+ request: fastapi.requests.Request,
20
+ response: fastapi.responses.Response
21
+ ):
22
+ arpakitlib_project_template_data = get_arpakitlib_project_template_info()
23
+ return RawDataCommonSO(data=arpakitlib_project_template_data)
@@ -0,0 +1,30 @@
1
+ import fastapi.requests
2
+ from fastapi import APIRouter
3
+ from project.api.schema.out.common.error import ErrorCommonSO
4
+
5
+ from arpakitlib.ar_json_util import transfer_data_to_json_str_to_data
6
+ from project.api.auth import APIAuthData, api_auth
7
+ from project.api.schema.out.common.raw_data import RawDataCommonSO
8
+
9
+ api_router = APIRouter()
10
+
11
+
12
+ @api_router.get(
13
+ path="",
14
+ name="Get auth data",
15
+ status_code=fastapi.status.HTTP_200_OK,
16
+ response_model=RawDataCommonSO | ErrorCommonSO,
17
+ )
18
+ async def _(
19
+ *,
20
+ request: fastapi.requests.Request,
21
+ response: fastapi.responses.Response,
22
+ api_auth_data: APIAuthData = fastapi.Depends(api_auth(
23
+ require_not_prod_mode=True,
24
+ try_find_api_key_dbm_from_sqlalchemy_db=True,
25
+ try_find_user_token_dbm_from_sqlalchemy_db=True,
26
+ require_api_key_dbm_from_sqlalchemy_db=True,
27
+ require_user_token_dbm_from_sqlalchemy_db=True
28
+ ))
29
+ ):
30
+ return RawDataCommonSO(data=transfer_data_to_json_str_to_data(api_auth_data.model_dump()))
@@ -0,0 +1,3 @@
1
+ from fastapi import APIRouter
2
+
3
+ main_admin_api_router = APIRouter()
@@ -1,11 +1,9 @@
1
1
  import fastapi.requests
2
2
  from fastapi import APIRouter
3
+ from project.api.schema.out.common.error import ErrorCommonSO
3
4
 
4
- from project.api.auth import APIAuthData, api_auth, \
5
- correct_api_keys_from_settings__is_api_key_correct_func
6
5
  from project.api.const import APIErrorCodes, APIErrorSpecificationCodes
7
- from project.api.schema.common.out import ErrorCommonSO
8
- from project.api.schema.general.out import ErrorsInfoGeneralSO
6
+ from project.api.schema.out.general.errors_info_general import ErrorsInfoGeneralSO
9
7
 
10
8
  api_router = APIRouter()
11
9
 
@@ -19,11 +17,7 @@ api_router = APIRouter()
19
17
  async def _(
20
18
  *,
21
19
  request: fastapi.requests.Request,
22
- response: fastapi.responses.Response,
23
- api_auth_data: APIAuthData = fastapi.Depends(api_auth(
24
- validate_api_key_func=correct_api_keys_from_settings__is_api_key_correct_func(),
25
- require_correct_api_key=True,
26
- ))
20
+ response: fastapi.responses.Response
27
21
  ):
28
22
  return ErrorsInfoGeneralSO(
29
23
  api_error_codes=APIErrorCodes.values_list(),
@@ -0,0 +1,3 @@
1
+ from fastapi import APIRouter
2
+
3
+ main_client_api_router = APIRouter()
@@ -0,0 +1,22 @@
1
+ import fastapi
2
+ from fastapi import APIRouter
3
+
4
+ from arpakitlib.ar_datetime_util import now_utc_dt
5
+ from project.api.schema.out.common.datetime_ import DatetimeCommonSO
6
+ from project.api.schema.out.general.error import ErrorGeneralSO
7
+
8
+ api_router = APIRouter()
9
+
10
+
11
+ @api_router.get(
12
+ "",
13
+ name="Now UTC datetime",
14
+ status_code=fastapi.status.HTTP_200_OK,
15
+ response_model=DatetimeCommonSO | ErrorGeneralSO,
16
+ )
17
+ async def _(
18
+ *,
19
+ request: fastapi.requests.Request,
20
+ response: fastapi.responses.Response
21
+ ):
22
+ return DatetimeCommonSO.from_datetime(datetime_=now_utc_dt())
@@ -0,0 +1,21 @@
1
+ import fastapi
2
+ from fastapi import APIRouter
3
+ from project.api.schema.out.common.error import ErrorCommonSO
4
+
5
+ from project.api.schema.out.general.healthcheck import HealthcheckGeneralSO
6
+
7
+ api_router = APIRouter()
8
+
9
+
10
+ @api_router.get(
11
+ "",
12
+ name="Healthcheck",
13
+ status_code=fastapi.status.HTTP_200_OK,
14
+ response_model=HealthcheckGeneralSO | ErrorCommonSO,
15
+ )
16
+ async def _(
17
+ *,
18
+ request: fastapi.requests.Request,
19
+ response: fastapi.responses.Response
20
+ ):
21
+ return HealthcheckGeneralSO(is_ok=True)
@@ -0,0 +1,10 @@
1
+ from fastapi import APIRouter
2
+
3
+ from project.api.router.general import healthcheck
4
+
5
+ main_general_api_router = APIRouter()
6
+
7
+ main_general_api_router.include_router(
8
+ router=healthcheck.api_router,
9
+ prefix="/healthcheck"
10
+ )