arpakitlib 1.7.257__py3-none-any.whl → 1.8.1__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 (294) hide show
  1. arpakitlib/{_arpakit_project_template → _arpakit_project_template_v_1}/README.md +1 -1
  2. arpakitlib/{_arpakit_project_template → _arpakit_project_template_v_1}/alembic/env.py +3 -3
  3. arpakitlib/_arpakit_project_template_v_1/api/asgi.py +3 -0
  4. arpakitlib/_arpakit_project_template_v_1/api/auth.py +235 -0
  5. arpakitlib/_arpakit_project_template_v_1/api/const.py +18 -0
  6. arpakitlib/_arpakit_project_template_v_1/api/create_api_app.py +71 -0
  7. arpakitlib/_arpakit_project_template_v_1/api/event.py +74 -0
  8. arpakitlib/_arpakit_project_template_v_1/api/exception.py +38 -0
  9. arpakitlib/_arpakit_project_template_v_1/api/exception_handler.py +308 -0
  10. arpakitlib/_arpakit_project_template_v_1/api/openapi_ui.py +28 -0
  11. arpakitlib/_arpakit_project_template_v_1/api/response.py +31 -0
  12. arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v_1}/api/router/main_router.py +4 -3
  13. arpakitlib/_arpakit_project_template_v_1/api/router/v1/arpakit_project_template.py +22 -0
  14. arpakitlib/_arpakit_project_template_v_1/api/router/v1/check_auth.py +30 -0
  15. arpakitlib/_arpakit_project_template_v_1/api/router/v1/clear_log_file.py +25 -0
  16. arpakitlib/_arpakit_project_template_v_1/api/router/v1/get_errors_info.py +24 -0
  17. arpakitlib/_arpakit_project_template_v_1/api/router/v1/get_log_file.py +23 -0
  18. arpakitlib/_arpakit_project_template_v_1/api/router/v1/healthcheck.py +21 -0
  19. arpakitlib/_arpakit_project_template_v_1/api/router/v1/main_router.py +67 -0
  20. arpakitlib/_arpakit_project_template_v_1/api/router/v1/now_utc_datetime.py +21 -0
  21. arpakitlib/_arpakit_project_template_v_1/api/router/v1/raise_fake_error.py +35 -0
  22. arpakitlib/_arpakit_project_template_v_1/api/schema/base_schema.py +26 -0
  23. arpakitlib/_arpakit_project_template_v_1/api/schema/common/in_.py +5 -0
  24. arpakitlib/_arpakit_project_template_v_1/api/schema/common/out.py +60 -0
  25. arpakitlib/_arpakit_project_template_v_1/api/schema/v1/in_.py +5 -0
  26. arpakitlib/_arpakit_project_template_v_1/api/schema/v1/out.py +47 -0
  27. arpakitlib/_arpakit_project_template_v_1/arpakitlib_project_template.json +3 -0
  28. arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v_1}/business_service/hello_world.py +1 -1
  29. arpakitlib/_arpakit_project_template_v_1/business_service/remove_operations.py +51 -0
  30. arpakitlib/_arpakit_project_template_v_1/command/alembic_history.sh +2 -0
  31. arpakitlib/_arpakit_project_template_v_1/command/alembic_revision_autogenerate.sh +2 -0
  32. arpakitlib/{_arpakit_project_template/manage/json_beautify.py → _arpakit_project_template_v_1/command/beautify_json.py} +2 -2
  33. arpakitlib/{_arpakit_project_template/src/core/_check_logging.py → _arpakit_project_template_v_1/command/check_logging.py} +3 -3
  34. arpakitlib/_arpakit_project_template_v_1/command/check_sqlalchemy_db.py +11 -0
  35. arpakitlib/_arpakit_project_template_v_1/command/drop_json_db.py +13 -0
  36. arpakitlib/_arpakit_project_template_v_1/command/drop_sqlalchemy_db.py +14 -0
  37. arpakitlib/{_arpakit_project_template/src/core/_generate_settings_env_example.py → _arpakit_project_template_v_1/command/generate_settings_env_example.py} +4 -4
  38. arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/hello_world.py +2 -2
  39. arpakitlib/_arpakit_project_template_v_1/command/init_json_db.py +11 -0
  40. arpakitlib/_arpakit_project_template_v_1/command/init_sqlalchemy_db.py +11 -0
  41. arpakitlib/_arpakit_project_template_v_1/command/reinit_json_db.py +13 -0
  42. arpakitlib/_arpakit_project_template_v_1/command/reinit_sqlalchemy_db.py +13 -0
  43. arpakitlib/_arpakit_project_template_v_1/command/remove_operations.py +13 -0
  44. arpakitlib/_arpakit_project_template_v_1/command/remove_story_logs.py +16 -0
  45. arpakitlib/_arpakit_project_template_v_1/command/rm_all_records_in_json_db.py +13 -0
  46. arpakitlib/{_arpakit_project_template/src/core/_show_settings.py → _arpakit_project_template_v_1/command/show_settings.py} +3 -3
  47. arpakitlib/{_arpakit_project_template/src/api/_start_api_with_reload.py → _arpakit_project_template_v_1/command/start_api_with_reload.py} +5 -5
  48. arpakitlib/{_arpakit_project_template/src/api/_start_api_without_reload.py → _arpakit_project_template_v_1/command/start_api_without_reload.py} +5 -5
  49. arpakitlib/_arpakit_project_template_v_1/command/start_async_operation_executor_worker.py +14 -0
  50. arpakitlib/_arpakit_project_template_v_1/command/start_async_scheduled_operation_creator_worker.py +14 -0
  51. arpakitlib/_arpakit_project_template_v_1/command/start_sync_operation_executor_worker.py +15 -0
  52. arpakitlib/_arpakit_project_template_v_1/command/start_sync_operation_executor_workers.py +22 -0
  53. arpakitlib/_arpakit_project_template_v_1/command/start_sync_scheduled_operation_creator_worker.py +12 -0
  54. arpakitlib/_arpakit_project_template_v_1/core/cache_file_storage_in_dir.py +23 -0
  55. arpakitlib/_arpakit_project_template_v_1/core/const.py +33 -0
  56. arpakitlib/_arpakit_project_template_v_1/core/dump_file_storage_in_dir.py +23 -0
  57. arpakitlib/_arpakit_project_template_v_1/core/jinja2_templates.py +14 -0
  58. arpakitlib/_arpakit_project_template_v_1/core/media_file_storage_in_dir.py +23 -0
  59. arpakitlib/_arpakit_project_template_v_1/core/settings.py +195 -0
  60. arpakitlib/_arpakit_project_template_v_1/core/util.py +29 -0
  61. arpakitlib/{_arpakit_project_template → _arpakit_project_template_v_1}/example.env +13 -7
  62. arpakitlib/_arpakit_project_template_v_1/json_db/json_db.py +28 -0
  63. arpakitlib/_arpakit_project_template_v_1/operation_execution/operation_executor_worker.py +256 -0
  64. arpakitlib/_arpakit_project_template_v_1/operation_execution/scheduled_operation_creator_worker.py +106 -0
  65. arpakitlib/_arpakit_project_template_v_1/operation_execution/scheduled_operations.py +49 -0
  66. arpakitlib/_arpakit_project_template_v_1/operation_execution/util.py +29 -0
  67. arpakitlib/_arpakit_project_template_v_1/resource/static/openapi-favicon.png +0 -0
  68. arpakitlib/_arpakit_project_template_v_1/resource/static/swagger-ui/index.html +19 -0
  69. arpakitlib/_arpakit_project_template_v_1/resource/static/swagger-ui/swagger-ui-bundle.js +2 -0
  70. arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/swagger-ui-es-bundle-core.js +1 -1
  71. arpakitlib/_arpakit_project_template_v_1/resource/static/swagger-ui/swagger-ui-es-bundle-core.js.map +1 -0
  72. arpakitlib/_arpakit_project_template_v_1/resource/static/swagger-ui/swagger-ui-es-bundle.js +2 -0
  73. arpakitlib/_arpakit_project_template_v_1/resource/static/swagger-ui/swagger-ui-standalone-preset.js +2 -0
  74. arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/swagger-ui.js +1 -1
  75. arpakitlib/_arpakit_project_template_v_1/resource/static/swagger-ui/swagger-ui.js.map +1 -0
  76. arpakitlib/_arpakit_project_template_v_1/sandbox/sandbox_1.py +14 -0
  77. arpakitlib/_arpakit_project_template_v_1/sandbox/sandbox_2.py +14 -0
  78. arpakitlib/_arpakit_project_template_v_1/sandbox/sandbox_3.py +14 -0
  79. arpakitlib/_arpakit_project_template_v_1/sandbox/sandbox_4.py +14 -0
  80. arpakitlib/_arpakit_project_template_v_1/sandbox/sandbox_5.py +14 -0
  81. arpakitlib/_arpakit_project_template_v_1/sandbox/sandbox_6.py +14 -0
  82. arpakitlib/_arpakit_project_template_v_1/sandbox/sandbox_7.py +14 -0
  83. arpakitlib/_arpakit_project_template_v_1/site/router/main_router.py +3 -0
  84. arpakitlib/_arpakit_project_template_v_1/sqladmin_/add_admin_in_app.py +24 -0
  85. arpakitlib/_arpakit_project_template_v_1/sqladmin_/admin_auth.py +54 -0
  86. arpakitlib/_arpakit_project_template_v_1/sqladmin_/model_view.py +95 -0
  87. arpakitlib/_arpakit_project_template_v_1/sqlalchemy_db/sqlalchemy_db.py +22 -0
  88. arpakitlib/_arpakit_project_template_v_1/sqlalchemy_db/sqlalchemy_model.py +129 -0
  89. arpakitlib/_arpakit_project_template_v_1/sqlalchemy_db/util.py +28 -0
  90. arpakitlib/{_arpakit_project_template/src/sandbox/sandbox_3.py → _arpakit_project_template_v_1/test_data/make_test_data_1.py} +8 -3
  91. arpakitlib/{_arpakit_project_template/src/sandbox/sandbox_4.py → _arpakit_project_template_v_1/test_data/make_test_data_2.py} +8 -3
  92. arpakitlib/{_arpakit_project_template/src/sandbox/sandbox_1.py → _arpakit_project_template_v_1/test_data/make_test_data_3.py} +8 -3
  93. arpakitlib/{_arpakit_project_template/src/sandbox/sandbox_2.py → _arpakit_project_template_v_1/test_data/make_test_data_4.py} +8 -3
  94. arpakitlib/_arpakit_project_template_v_1/test_data/make_test_data_5.py +22 -0
  95. arpakitlib/_arpakit_project_template_v_1/tg_bot/blank/blank.py +5 -0
  96. arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v_1}/tg_bot/blank/util.py +1 -1
  97. arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v_1}/tg_bot/const.py +6 -3
  98. arpakitlib/_arpakit_project_template_v_1/tg_bot/event.py +51 -0
  99. arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v_1}/tg_bot/filter/not_prod_mode.py +1 -1
  100. arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v_1}/tg_bot/filter/prod_mode.py +1 -1
  101. arpakitlib/_arpakit_project_template_v_1/tg_bot/kb/static_/__init__.py +0 -0
  102. arpakitlib/_arpakit_project_template_v_1/tg_bot/kb/static_/common.py +0 -0
  103. arpakitlib/_arpakit_project_template_v_1/tg_bot/middleware/__init__.py +0 -0
  104. arpakitlib/_arpakit_project_template_v_1/tg_bot/middleware/init_user.py +24 -0
  105. arpakitlib/_arpakit_project_template_v_1/tg_bot/middleware/middleware.py +12 -0
  106. arpakitlib/_arpakit_project_template_v_1/tg_bot/router/__init__.py +0 -0
  107. arpakitlib/_arpakit_project_template_v_1/tg_bot/router/arpakitlib_.py +10 -0
  108. arpakitlib/_arpakit_project_template_v_1/tg_bot/router/error.py +15 -0
  109. arpakitlib/_arpakit_project_template_v_1/tg_bot/router/healthcheck.py +10 -0
  110. arpakitlib/_arpakit_project_template_v_1/tg_bot/router/main_router.py +14 -0
  111. arpakitlib/_arpakit_project_template_v_1/tg_bot/start_tg_bot.py +34 -0
  112. arpakitlib/_arpakit_project_template_v_1/tg_bot/tg_bot.py +24 -0
  113. arpakitlib/_arpakit_project_template_v_1/tg_bot/tg_bot_dispatcher.py +19 -0
  114. arpakitlib/_arpakit_project_template_v_1/tg_bot/transmitted_tg_data.py +58 -0
  115. arpakitlib/_arpakit_project_template_v_1/tg_bot/util.py +0 -0
  116. arpakitlib/_arpakit_project_template_v_1/util/__init__.py +0 -0
  117. arpakitlib/_arpakit_project_template_v_1/util/read_arpakitlib_project_template_file.py +17 -0
  118. arpakitlib/ar_aiogram_util.py +41 -52
  119. arpakitlib/ar_arpakit_project_template_util.py +5 -11
  120. arpakitlib/ar_arpakitlib_cli_util.py +8 -2
  121. arpakitlib/ar_base_worker_util.py +35 -17
  122. arpakitlib/ar_class_util.py +11 -0
  123. arpakitlib/ar_func_util.py +19 -29
  124. arpakitlib/ar_http_request_util.py +10 -2
  125. arpakitlib/ar_rat_func_util.py +1 -1
  126. arpakitlib/ar_retry_func_util.py +4 -4
  127. arpakitlib/ar_schedule_uust_api_client_util.py +1 -1
  128. arpakitlib/ar_settings_util.py +3 -204
  129. arpakitlib/ar_sqladmin_util.py +7 -102
  130. arpakitlib/ar_sqlalchemy_util.py +65 -13
  131. arpakitlib/ar_type_util.py +0 -2
  132. {arpakitlib-1.7.257.dist-info → arpakitlib-1.8.1.dist-info}/METADATA +5 -3
  133. arpakitlib-1.8.1.dist-info/RECORD +261 -0
  134. {arpakitlib-1.7.257.dist-info → arpakitlib-1.8.1.dist-info}/WHEEL +1 -1
  135. arpakitlib/_arpakit_project_template/ARPAKITLIB +0 -1
  136. arpakitlib/_arpakit_project_template/manage/docker_ps.sh +0 -2
  137. arpakitlib/_arpakit_project_template/manage/git_branch.sh +0 -2
  138. arpakitlib/_arpakit_project_template/manage/poetry_add_plugin_export.sh +0 -2
  139. arpakitlib/_arpakit_project_template/manage/poetry_config_virtualenvs_in_project_true.sh +0 -2
  140. arpakitlib/_arpakit_project_template/manage/poetry_self_add_plugin_export.sh +0 -2
  141. arpakitlib/_arpakit_project_template/src/admin1/add_admin_in_app.py +0 -32
  142. arpakitlib/_arpakit_project_template/src/admin1/admin_auth.py +0 -29
  143. arpakitlib/_arpakit_project_template/src/admin1/model_view.py +0 -1
  144. arpakitlib/_arpakit_project_template/src/api/asgi.py +0 -3
  145. arpakitlib/_arpakit_project_template/src/api/auth.py +0 -53
  146. arpakitlib/_arpakit_project_template/src/api/const.py +0 -13
  147. arpakitlib/_arpakit_project_template/src/api/create_api_app.py +0 -43
  148. arpakitlib/_arpakit_project_template/src/api/create_handle_exception_.py +0 -59
  149. arpakitlib/_arpakit_project_template/src/api/event.py +0 -83
  150. arpakitlib/_arpakit_project_template/src/api/router/v1/get_api_error_info.py +0 -27
  151. arpakitlib/_arpakit_project_template/src/api/router/v1/main_router.py +0 -15
  152. arpakitlib/_arpakit_project_template/src/api/schema/v1/in_.py +0 -1
  153. arpakitlib/_arpakit_project_template/src/api/schema/v1/out.py +0 -1
  154. arpakitlib/_arpakit_project_template/src/api/transmitted_api_data.py +0 -7
  155. arpakitlib/_arpakit_project_template/src/api/util.py +0 -44
  156. arpakitlib/_arpakit_project_template/src/core/const.py +0 -41
  157. arpakitlib/_arpakit_project_template/src/core/settings.py +0 -21
  158. arpakitlib/_arpakit_project_template/src/core/util.py +0 -61
  159. arpakitlib/_arpakit_project_template/src/json_db/_drop_json_db.py +0 -13
  160. arpakitlib/_arpakit_project_template/src/json_db/_init_json_db.py +0 -11
  161. arpakitlib/_arpakit_project_template/src/json_db/_reinit_json_db.py +0 -13
  162. arpakitlib/_arpakit_project_template/src/json_db/_rm_all_records_in_json_db.py +0 -13
  163. arpakitlib/_arpakit_project_template/src/json_db/json_db.py +0 -11
  164. arpakitlib/_arpakit_project_template/src/json_db/util.py +0 -17
  165. arpakitlib/_arpakit_project_template/src/just_script/example.py +0 -16
  166. arpakitlib/_arpakit_project_template/src/operation_execution/_start_operation_executor_worker.py +0 -17
  167. arpakitlib/_arpakit_project_template/src/operation_execution/_start_scheduled_operation_creator_worker.py +0 -17
  168. arpakitlib/_arpakit_project_template/src/operation_execution/const.py +0 -9
  169. arpakitlib/_arpakit_project_template/src/operation_execution/operation_executor.py +0 -16
  170. arpakitlib/_arpakit_project_template/src/operation_execution/scheduled_operations.py +0 -29
  171. arpakitlib/_arpakit_project_template/src/operation_execution/util.py +0 -1
  172. arpakitlib/_arpakit_project_template/src/sandbox/sandbox_5.py +0 -17
  173. arpakitlib/_arpakit_project_template/src/sandbox/sandbox_6.py +0 -17
  174. arpakitlib/_arpakit_project_template/src/sandbox/sandbox_7.py +0 -17
  175. arpakitlib/_arpakit_project_template/src/sqlalchemy_db/_check_conn_sqlalchemy_db.py +0 -11
  176. arpakitlib/_arpakit_project_template/src/sqlalchemy_db/_drop_sqlalchemy_db.py +0 -13
  177. arpakitlib/_arpakit_project_template/src/sqlalchemy_db/_init_sqlalchemy_db.py +0 -11
  178. arpakitlib/_arpakit_project_template/src/sqlalchemy_db/_reinit_sqlalchemy_db.py +0 -13
  179. arpakitlib/_arpakit_project_template/src/sqlalchemy_db/_remove_operations.py +0 -15
  180. arpakitlib/_arpakit_project_template/src/sqlalchemy_db/_remove_story_logs.py +0 -16
  181. arpakitlib/_arpakit_project_template/src/sqlalchemy_db/sqlalchemy_model.py +0 -13
  182. arpakitlib/_arpakit_project_template/src/sqlalchemy_db/util.py +0 -27
  183. arpakitlib/_arpakit_project_template/src/test_data/make_test_data_1.py +0 -8
  184. arpakitlib/_arpakit_project_template/src/test_data/make_test_data_2.py +0 -8
  185. arpakitlib/_arpakit_project_template/src/test_data/make_test_data_3.py +0 -8
  186. arpakitlib/_arpakit_project_template/src/test_data/make_test_data_4.py +0 -8
  187. arpakitlib/_arpakit_project_template/src/test_data/make_test_data_5.py +0 -8
  188. arpakitlib/_arpakit_project_template/src/tg_bot/blank/blank.py +0 -10
  189. arpakitlib/_arpakit_project_template/src/tg_bot/event.py +0 -39
  190. arpakitlib/_arpakit_project_template/src/tg_bot/router/error.py +0 -3
  191. arpakitlib/_arpakit_project_template/src/tg_bot/router/router.py +0 -7
  192. arpakitlib/_arpakit_project_template/src/tg_bot/start_tg_bot.py +0 -11
  193. arpakitlib/_arpakit_project_template/src/tg_bot/transmitted_tg_data.py +0 -6
  194. arpakitlib/_arpakit_project_template/src/tg_bot/util.py +0 -44
  195. arpakitlib/ar_api_key_util.py +0 -21
  196. arpakitlib/ar_fastapi_static/swagger-ui/index.html +0 -19
  197. arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-bundle.js +0 -2
  198. arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-es-bundle-core.js.map +0 -1
  199. arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-es-bundle.js +0 -2
  200. arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-standalone-preset.js +0 -2
  201. arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui.js.map +0 -1
  202. arpakitlib/ar_fastapi_util.py +0 -862
  203. arpakitlib/ar_operation_execution_util.py +0 -504
  204. arpakitlib/ar_sqlalchemy_model_util.py +0 -183
  205. arpakitlib-1.7.257.dist-info/RECORD +0 -236
  206. /arpakitlib/{_arpakit_project_template → _arpakit_project_template_v_1}/.gitignore +0 -0
  207. /arpakitlib/{_arpakit_project_template → _arpakit_project_template_v_1}/.python-version +0 -0
  208. /arpakitlib/{_arpakit_project_template → _arpakit_project_template_v_1}/LICENSE +0 -0
  209. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/additional_model}/__init__.py +0 -0
  210. /arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v_1}/additional_model/additional_model.py +0 -0
  211. /arpakitlib/{_arpakit_project_template → _arpakit_project_template_v_1}/alembic/README +0 -0
  212. /arpakitlib/{_arpakit_project_template → _arpakit_project_template_v_1}/alembic/script.py.mako +0 -0
  213. /arpakitlib/{_arpakit_project_template → _arpakit_project_template_v_1}/alembic.ini +0 -0
  214. /arpakitlib/{_arpakit_project_template/manage/note → _arpakit_project_template_v_1/api}/__init__.py +0 -0
  215. /arpakitlib/{_arpakit_project_template/resource → _arpakit_project_template_v_1/api/router}/__init__.py +0 -0
  216. /arpakitlib/{_arpakit_project_template/resource/static → _arpakit_project_template_v_1/api/router/v1}/__init__.py +0 -0
  217. /arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v_1/api/schema}/__init__.py +0 -0
  218. /arpakitlib/{_arpakit_project_template/src/additional_model → _arpakit_project_template_v_1/api/schema/common}/__init__.py +0 -0
  219. /arpakitlib/{_arpakit_project_template/src/admin1 → _arpakit_project_template_v_1/api/schema/v1}/__init__.py +0 -0
  220. /arpakitlib/{_arpakit_project_template/manage/note/note_1.txt → _arpakit_project_template_v_1/api/util.py} +0 -0
  221. /arpakitlib/{_arpakit_project_template/src/api → _arpakit_project_template_v_1/business_service}/__init__.py +0 -0
  222. /arpakitlib/{_arpakit_project_template/src/api/router → _arpakit_project_template_v_1/celery_}/__init__.py +0 -0
  223. /arpakitlib/{_arpakit_project_template/src/api/router/v1 → _arpakit_project_template_v_1/command}/__init__.py +0 -0
  224. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/alembic_upgrade_head .sh +0 -0
  225. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/docker_ps_a.sh +0 -0
  226. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/docker_rm_postgres.sh +0 -0
  227. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/docker_run_postgres.sh +0 -0
  228. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/docker_start_postgres.sh +0 -0
  229. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/docker_stop_postgres.sh +0 -0
  230. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/git_commit.sh +0 -0
  231. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/git_push_arpakit_company_github_1.sh +0 -0
  232. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/git_push_arpakit_company_gitlab_1.sh +0 -0
  233. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/git_push_arpakit_github_1.sh +0 -0
  234. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/git_push_arpakit_gitlab_1.sh +0 -0
  235. /arpakitlib/{_arpakit_project_template/manage/git_remote_v.sh → _arpakit_project_template_v_1/command/git_remote.sh} +0 -0
  236. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/git_set_arpakit_company_origin.sh +0 -0
  237. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/git_set_arpakit_origin.sh +0 -0
  238. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/git_status.sh +0 -0
  239. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/poetry_check.sh +0 -0
  240. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/poetry_clear_cache.sh +0 -0
  241. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/poetry_config.sh +0 -0
  242. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/poetry_install.sh +0 -0
  243. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/poetry_lock.sh +0 -0
  244. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/poetry_remove_and_add_arpakitlib.sh +0 -0
  245. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/poetry_show.sh +0 -0
  246. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/poetry_show_arpakitlib.sh +0 -0
  247. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/poetry_update.sh +0 -0
  248. /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/poetry_update_arpakitlib.sh +0 -0
  249. /arpakitlib/{_arpakit_project_template/src/api/schema → _arpakit_project_template_v_1/core}/__init__.py +0 -0
  250. /arpakitlib/{_arpakit_project_template/src/api/schema/v1 → _arpakit_project_template_v_1/json_db}/__init__.py +0 -0
  251. /arpakitlib/{_arpakit_project_template/src/business_service → _arpakit_project_template_v_1/note}/__init__.py +0 -0
  252. /arpakitlib/{_arpakit_project_template/manage/note/note_2.txt → _arpakit_project_template_v_1/note/note_1.txt} +0 -0
  253. /arpakitlib/{_arpakit_project_template/manage/note/note_3.txt → _arpakit_project_template_v_1/note/note_2.txt} +0 -0
  254. /arpakitlib/{_arpakit_project_template/manage/note/note_4.txt → _arpakit_project_template_v_1/note/note_3.txt} +0 -0
  255. /arpakitlib/{_arpakit_project_template/manage/note/note_5.txt → _arpakit_project_template_v_1/note/note_4.txt} +0 -0
  256. /arpakitlib/{_arpakit_project_template/src/core/__init__.py → _arpakit_project_template_v_1/note/note_5.txt} +0 -0
  257. /arpakitlib/{_arpakit_project_template/src/json_db → _arpakit_project_template_v_1/operation_execution}/__init__.py +0 -0
  258. /arpakitlib/{_arpakit_project_template/src/just_script/__init__.py → _arpakit_project_template_v_1/operation_execution/const.py} +0 -0
  259. /arpakitlib/{_arpakit_project_template/src/operation_execution → _arpakit_project_template_v_1/resource}/__init__.py +0 -0
  260. /arpakitlib/{_arpakit_project_template/resource/static/healthcheck → _arpakit_project_template_v_1/resource/static/1} +0 -0
  261. /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/healthcheck +0 -0
  262. /arpakitlib/{_arpakit_project_template → _arpakit_project_template_v_1}/resource/static/helloworld +0 -0
  263. /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/redoc/redoc.standalone.js +0 -0
  264. /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/favicon-16x16.png +0 -0
  265. /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/favicon-32x32.png +0 -0
  266. /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/index.css +0 -0
  267. /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/oauth2-redirect.html +0 -0
  268. /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/swagger-initializer.js +0 -0
  269. /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/swagger-ui-bundle.js.map +0 -0
  270. /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/swagger-ui-es-bundle.js.map +0 -0
  271. /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/swagger-ui-standalone-preset.js.map +0 -0
  272. /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/swagger-ui.css +0 -0
  273. /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/swagger-ui.css.map +0 -0
  274. /arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v_1}/sandbox/__init__.py +0 -0
  275. /arpakitlib/{_arpakit_project_template/src/sqlalchemy_db → _arpakit_project_template_v_1/site}/__init__.py +0 -0
  276. /arpakitlib/{_arpakit_project_template/src/test_data/__init__.py → _arpakit_project_template_v_1/site/asgi.py} +0 -0
  277. /arpakitlib/{_arpakit_project_template/src/tg_bot/__init__.py → _arpakit_project_template_v_1/site/consts.py} +0 -0
  278. /arpakitlib/{_arpakit_project_template/src/tg_bot/blank/__init__.py → _arpakit_project_template_v_1/site/create_site_app.py} +0 -0
  279. /arpakitlib/{_arpakit_project_template/src/tg_bot/filter/__init__.py → _arpakit_project_template_v_1/site/event.py} +0 -0
  280. /arpakitlib/{_arpakit_project_template/src/tg_bot/handler/__init__.py → _arpakit_project_template_v_1/site/exception_handler.py} +0 -0
  281. /arpakitlib/{_arpakit_project_template/src/tg_bot/kb → _arpakit_project_template_v_1/site/router}/__init__.py +0 -0
  282. /arpakitlib/{_arpakit_project_template/src/tg_bot/kb/inline_ → _arpakit_project_template_v_1/sqladmin_}/__init__.py +0 -0
  283. /arpakitlib/{_arpakit_project_template/src/tg_bot/kb/static_ → _arpakit_project_template_v_1/sqlalchemy_db}/__init__.py +0 -0
  284. /arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v_1}/sqlalchemy_db/const.py +0 -0
  285. /arpakitlib/{_arpakit_project_template/src/tg_bot/middleware → _arpakit_project_template_v_1/test_data}/__init__.py +0 -0
  286. /arpakitlib/{_arpakit_project_template/src/tg_bot/router → _arpakit_project_template_v_1/tg_bot}/__init__.py +0 -0
  287. /arpakitlib/{_arpakit_project_template/src/util → _arpakit_project_template_v_1/tg_bot/blank}/__init__.py +0 -0
  288. /arpakitlib/{_arpakit_project_template/src/tg_bot/handler/cmd_arpakitlib.py → _arpakit_project_template_v_1/tg_bot/filter/__init__.py} +0 -0
  289. /arpakitlib/{_arpakit_project_template/src/tg_bot/handler/cmd_healthcheck.py → _arpakit_project_template_v_1/tg_bot/kb/__init__.py} +0 -0
  290. /arpakitlib/{_arpakit_project_template/src/tg_bot/kb/inline_/callback.py → _arpakit_project_template_v_1/tg_bot/kb/inline_/__init__.py} +0 -0
  291. /arpakitlib/{_arpakit_project_template/src/tg_bot/kb/inline_/common.py → _arpakit_project_template_v_1/tg_bot/kb/inline_/callback.py} +0 -0
  292. /arpakitlib/{_arpakit_project_template/src/tg_bot/kb/static_ → _arpakit_project_template_v_1/tg_bot/kb/inline_}/common.py +0 -0
  293. {arpakitlib-1.7.257.dist-info → arpakitlib-1.8.1.dist-info}/LICENSE +0 -0
  294. {arpakitlib-1.7.257.dist-info → arpakitlib-1.8.1.dist-info}/entry_points.txt +0 -0
@@ -1,4 +1,4 @@
1
- # {{PROJECT_NAME}}
1
+ # ...
2
2
 
3
3
  ## ❤️ Made by ARPAKIT Company ❤️
4
4
 
@@ -5,8 +5,8 @@ from sqlalchemy import engine_from_config
5
5
  from sqlalchemy import pool
6
6
 
7
7
  from arpakitlib.ar_type_util import raise_for_type
8
- from src.core.settings import get_cached_settings
9
- from src.sqlalchemy_db.util import get_base_dbm
8
+ from core.settings import get_cached_settings
9
+ from sqlalchemy_db.sqlalchemy_model import get_simple_dbm
10
10
 
11
11
  # this is the Alembic Config object, which provides
12
12
  # access to the values within the .ini file in use.
@@ -24,7 +24,7 @@ if config.config_file_name is not None:
24
24
  # for 'autogenerate' support
25
25
  # from myapp import mymodel
26
26
  # target_metadata = mymodel.Base.metadata
27
- target_metadata = get_base_dbm().metadata
27
+ target_metadata = get_simple_dbm().metadata
28
28
 
29
29
 
30
30
  # other values from the config, defined by the needs of env.py,
@@ -0,0 +1,3 @@
1
+ from api.create_api_app import create_api_app
2
+
3
+ app = create_api_app()
@@ -0,0 +1,235 @@
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 api.const import APIErrorCodes
12
+ from api.exception import APIException
13
+ from arpakitlib.ar_func_util import is_async_callable, is_sync_function
14
+ from arpakitlib.ar_json_util import safely_transfer_obj_to_json_str_to_json_obj
15
+ from arpakitlib.ar_type_util import raise_for_type
16
+ from core.settings import get_cached_settings
17
+
18
+
19
+ class APIAuthData(BaseModel):
20
+ model_config = ConfigDict(extra="forbid", arbitrary_types_allowed=True, from_attributes=True)
21
+
22
+ require_api_key_string: bool = False
23
+ require_token_string: bool = False
24
+
25
+ require_correct_api_key: bool = False
26
+ require_correct_token: bool = False
27
+
28
+ token_string: str | None = None
29
+ api_key_string: str | None = None
30
+
31
+ is_token_correct: bool | None = None
32
+ is_api_key_correct: bool | None = None
33
+
34
+
35
+ def api_auth(
36
+ *,
37
+ require_api_key_string: bool = False,
38
+ require_token_string: bool = False,
39
+ validate_api_key_func: Callable | None = None,
40
+ validate_token_func: Callable | None = None,
41
+ correct_api_keys: str | list[str] | None = None,
42
+ correct_tokens: str | list[str] | None = None,
43
+ require_correct_api_key: bool = False,
44
+ require_correct_token: bool = False
45
+ ) -> Callable:
46
+ if isinstance(correct_api_keys, str):
47
+ correct_api_keys = [correct_api_keys]
48
+ if correct_api_keys is not None:
49
+ raise_for_type(correct_api_keys, list)
50
+
51
+ if validate_api_key_func is None and correct_api_keys is not None:
52
+ validate_api_key_func = lambda *args, **kwargs_: kwargs_["api_auth_data"].api_key_string in correct_api_keys
53
+
54
+ if isinstance(correct_tokens, str):
55
+ correct_tokens = [correct_tokens]
56
+ if correct_tokens is not None:
57
+ raise_for_type(correct_tokens, list)
58
+
59
+ if validate_token_func is None and correct_tokens is not None:
60
+ validate_token_func = lambda *args, **kwargs_: kwargs_["api_auth_data"].token_string in correct_tokens
61
+
62
+ if require_correct_api_key is True:
63
+ require_api_key_string = True
64
+
65
+ if require_correct_token is True:
66
+ require_token_string = True
67
+
68
+ async def func(
69
+ *,
70
+ ac: fastapi.security.HTTPAuthorizationCredentials | None = fastapi.Security(
71
+ fastapi.security.HTTPBearer(auto_error=False)
72
+ ),
73
+ api_key_string: str | None = Security(
74
+ APIKeyHeader(name="apikey", auto_error=False)
75
+ ),
76
+ request: fastapi.requests.Request
77
+ ) -> APIAuthData:
78
+
79
+ api_auth_data = APIAuthData(
80
+ require_api_key_string=require_api_key_string,
81
+ require_token_string=require_token_string,
82
+ require_correct_api_key=require_correct_api_key,
83
+ require_correct_token=require_correct_token
84
+ )
85
+
86
+ # parse api_key
87
+
88
+ api_auth_data.api_key_string = api_key_string
89
+
90
+ if not api_auth_data.api_key_string and "api_key" in request.headers.keys():
91
+ api_auth_data.api_key_string = request.headers["api_key"]
92
+ if not api_auth_data.api_key_string and "api-key" in request.headers.keys():
93
+ api_auth_data.api_key_string = request.headers["api-key"]
94
+ if not api_auth_data.api_key_string and "apikey" in request.headers.keys():
95
+ api_auth_data.api_key_string = request.headers["apikey"]
96
+
97
+ if not api_auth_data.api_key_string and "api_key" in request.query_params.keys():
98
+ api_auth_data.api_key_string = request.query_params["api_key"]
99
+ if not api_auth_data.api_key_string and "api-key" in request.query_params.keys():
100
+ api_auth_data.api_key_string = request.query_params["api-key"]
101
+ if not api_auth_data.api_key_string and "apikey" in request.query_params.keys():
102
+ api_auth_data.api_key_string = request.query_params["apikey"]
103
+
104
+ # parse token
105
+
106
+ api_auth_data.token_string = ac.credentials if ac and ac.credentials and ac.credentials.strip() else None
107
+
108
+ if not api_auth_data.token_string and "token" in request.headers.keys():
109
+ api_auth_data.token_string = request.headers["token"]
110
+
111
+ if not api_auth_data.token_string and "user_token" in request.headers.keys():
112
+ api_auth_data.token_string = request.headers["user_token"]
113
+ if not api_auth_data.token_string and "user-token" in request.headers.keys():
114
+ api_auth_data.token_string = request.headers["user-token"]
115
+ if not api_auth_data.token_string and "usertoken" in request.headers.keys():
116
+ api_auth_data.token_string = request.headers["usertoken"]
117
+
118
+ if not api_auth_data.token_string and "token" in request.query_params.keys():
119
+ api_auth_data.token_string = request.query_params["token"]
120
+
121
+ if not api_auth_data.token_string and "user_token" in request.query_params.keys():
122
+ api_auth_data.token_string = request.query_params["user_token"]
123
+ if not api_auth_data.token_string and "user-token" in request.query_params.keys():
124
+ api_auth_data.token_string = request.query_params["user-token"]
125
+ if not api_auth_data.token_string and "usertoken" in request.query_params.keys():
126
+ api_auth_data.token_string = request.query_params["usertoken"]
127
+
128
+ if api_auth_data.token_string:
129
+ api_auth_data.token_string = api_auth_data.token_string.strip()
130
+ if not api_auth_data.token_string:
131
+ api_auth_data.token_string = None
132
+
133
+ # require_api_key_string
134
+
135
+ if require_api_key_string and not api_auth_data.api_key_string:
136
+ raise APIException(
137
+ status_code=fastapi.status.HTTP_401_UNAUTHORIZED,
138
+ error_code=APIErrorCodes.cannot_authorize,
139
+ error_data=safely_transfer_obj_to_json_str_to_json_obj(api_auth_data.model_dump())
140
+ )
141
+
142
+ # require_token_string
143
+
144
+ if require_token_string and not api_auth_data.token_string:
145
+ raise APIException(
146
+ status_code=fastapi.status.HTTP_401_UNAUTHORIZED,
147
+ error_code=APIErrorCodes.cannot_authorize,
148
+ error_data=safely_transfer_obj_to_json_str_to_json_obj(api_auth_data.model_dump())
149
+ )
150
+
151
+ # validate_api_key_func
152
+
153
+ if validate_api_key_func is not None:
154
+ if is_async_callable(validate_api_key_func):
155
+ api_auth_data.is_api_key_correct = await validate_api_key_func(
156
+ api_auth_data=api_auth_data,
157
+ request=request
158
+ )
159
+ elif is_sync_function(validate_api_key_func):
160
+ api_auth_data.is_api_key_correct = validate_api_key_func()
161
+ else:
162
+ raise TypeError("unknown validate_api_key_func type")
163
+
164
+ # validate_token_func
165
+
166
+ if validate_token_func is not None:
167
+ if is_async_callable(validate_token_func):
168
+ api_auth_data.is_token_correct = await validate_token_func(
169
+ api_auth_data=api_auth_data,
170
+ request=request
171
+ )
172
+ elif is_sync_function(validate_token_func):
173
+ api_auth_data.is_token_correct = validate_token_func()
174
+ else:
175
+ raise TypeError("unknown validate_token_func type")
176
+
177
+ # require_correct_api_key
178
+
179
+ if require_correct_api_key:
180
+ if not api_auth_data.is_api_key_correct:
181
+ raise APIException(
182
+ status_code=fastapi.status.HTTP_401_UNAUTHORIZED,
183
+ error_code=APIErrorCodes.cannot_authorize,
184
+ error_description="not api_auth_data.is_api_key_correct",
185
+ error_data=safely_transfer_obj_to_json_str_to_json_obj(api_auth_data.model_dump()),
186
+ )
187
+
188
+ # require_correct_token
189
+
190
+ if require_correct_token:
191
+ if not api_auth_data.is_token_correct:
192
+ raise APIException(
193
+ status_code=fastapi.status.HTTP_401_UNAUTHORIZED,
194
+ error_code=APIErrorCodes.cannot_authorize,
195
+ error_description="not api_auth_data.is_token_correct",
196
+ error_data=safely_transfer_obj_to_json_str_to_json_obj(api_auth_data.model_dump())
197
+ )
198
+
199
+ return api_auth_data
200
+
201
+ return func
202
+
203
+
204
+ def correct_api_keys_from_settings__validate_api_key_func() -> Callable:
205
+ async def func(
206
+ *,
207
+ api_auth_data: APIAuthData,
208
+ request: fastapi.requests.Request,
209
+ ):
210
+ if get_cached_settings().api_correct_api_keys is None:
211
+ return False
212
+ if api_auth_data.api_key_string is None:
213
+ return False
214
+ if api_auth_data.api_key_string.strip() not in get_cached_settings().api_correct_api_keys:
215
+ return False
216
+ return True
217
+
218
+ return func
219
+
220
+
221
+ def correct_tokens_from_settings__validate_api_key_func() -> Callable:
222
+ async def func(
223
+ *,
224
+ api_auth_data: APIAuthData,
225
+ request: fastapi.requests.Request,
226
+ ):
227
+ if get_cached_settings().api_correct_tokens is None:
228
+ return False
229
+ if api_auth_data.token_string is None:
230
+ return False
231
+ if api_auth_data.token_string.strip() not in get_cached_settings().api_correct_tokens:
232
+ return False
233
+ return True
234
+
235
+ return func
@@ -0,0 +1,18 @@
1
+ from arpakitlib.ar_enumeration_util import Enumeration
2
+
3
+
4
+ class APIErrorCodes(Enumeration):
5
+ cannot_authorize = "CANNOT_AUTHORIZE"
6
+ unknown_error = "UNKNOWN_ERROR"
7
+ error_in_request = "ERROR_IN_REQUEST"
8
+ not_found = "NOT_FOUND"
9
+
10
+
11
+ class APIErrorSpecificationCodes(Enumeration):
12
+ pass
13
+
14
+
15
+ if __name__ == '__main__':
16
+ print(APIErrorCodes.str_for_print())
17
+ print()
18
+ print(APIErrorSpecificationCodes.str_for_print())
@@ -0,0 +1,71 @@
1
+ import logging
2
+ import os
3
+
4
+ from fastapi import FastAPI
5
+ from fastapi.middleware.cors import CORSMiddleware
6
+ from fastapi.staticfiles import StaticFiles
7
+
8
+ from api.event import get_api_startup_events, get_api_shutdown_events
9
+ from api.exception_handler import add_exception_handler_to_app
10
+ from api.openapi_ui import add_local_openapi_ui_to_app
11
+ from api.router.main_router import main_api_router
12
+ from core.const import ProjectPaths
13
+ from core.settings import get_cached_settings
14
+ from core.util import setup_logging
15
+
16
+ _logger = logging.getLogger(__name__)
17
+
18
+
19
+ def create_api_app(*, prefix: str = "/api") -> FastAPI:
20
+ setup_logging()
21
+
22
+ _logger.info("start")
23
+
24
+ api_app = FastAPI(
25
+ title=get_cached_settings().project_name,
26
+ description=get_cached_settings().project_name,
27
+ docs_url=None,
28
+ redoc_url=None,
29
+ openapi_url="/openapi",
30
+ on_startup=get_api_startup_events(),
31
+ on_shutdown=get_api_shutdown_events(),
32
+ contact={
33
+ "name": "ARPAKIT Company",
34
+ "url": "https://arpakit.com/",
35
+ "email": "support@arpakit.com",
36
+ },
37
+ )
38
+
39
+ api_app.add_middleware(
40
+ CORSMiddleware,
41
+ allow_origins=["*"],
42
+ allow_credentials=True,
43
+ allow_methods=["*"],
44
+ allow_headers=["*"],
45
+ )
46
+
47
+ add_local_openapi_ui_to_app(app=api_app)
48
+
49
+ add_exception_handler_to_app(app=api_app)
50
+
51
+ api_app.include_router(
52
+ prefix=prefix,
53
+ router=main_api_router
54
+ )
55
+
56
+ if get_cached_settings().media_dirpath is not None:
57
+ if not os.path.exists(get_cached_settings().media_dirpath):
58
+ os.makedirs(get_cached_settings().media_dirpath, exist_ok=True)
59
+ api_app.mount("/media", StaticFiles(directory=get_cached_settings().media_dirpath), name="media")
60
+
61
+ if not os.path.exists(ProjectPaths.static_dirpath):
62
+ os.makedirs(ProjectPaths.static_dirpath, exist_ok=True)
63
+ api_app.mount("/static", StaticFiles(directory=ProjectPaths.static_dirpath), name="static")
64
+
65
+ if get_cached_settings().api_enable_sqladmin:
66
+ from sqladmin_.add_admin_in_app import add_sqladmin_in_app
67
+ add_sqladmin_in_app(app=api_app)
68
+
69
+ _logger.info("finish")
70
+
71
+ return api_app
@@ -0,0 +1,74 @@
1
+ import logging
2
+ from typing import Callable
3
+
4
+ from arpakitlib.ar_base_worker_util import safe_run_worker_in_background, SafeRunInBackgroundModes
5
+ from core.cache_file_storage_in_dir import get_cached_cache_file_storage_in_dir
6
+ from core.dump_file_storage_in_dir import get_cached_dump_file_storage_in_dir
7
+ from core.media_file_storage_in_dir import get_cached_media_file_storage_in_dir
8
+ from core.settings import get_cached_settings
9
+ from json_db.json_db import get_cached_json_db
10
+ from operation_execution.operation_executor_worker import create_operation_executor_worker
11
+ from operation_execution.scheduled_operation_creator_worker import create_scheduled_operation_creator_worker
12
+ from sqlalchemy_db.sqlalchemy_db import get_cached_sqlalchemy_db
13
+
14
+ _logger = logging.getLogger(__name__)
15
+
16
+
17
+ # STARTUP API EVENTS
18
+
19
+
20
+ async def async_api_startup_event():
21
+ _logger.info("start")
22
+
23
+ if get_cached_media_file_storage_in_dir() is not None:
24
+ get_cached_media_file_storage_in_dir().init()
25
+
26
+ if get_cached_cache_file_storage_in_dir() is not None:
27
+ get_cached_cache_file_storage_in_dir().init()
28
+
29
+ if get_cached_dump_file_storage_in_dir() is not None:
30
+ get_cached_dump_file_storage_in_dir().init()
31
+
32
+ if (
33
+ get_cached_sqlalchemy_db() is not None
34
+ and get_cached_settings().api_init_sqlalchemy_db
35
+ ):
36
+ get_cached_sqlalchemy_db().init()
37
+
38
+ if (
39
+ get_cached_json_db() is not None
40
+ and get_cached_settings().api_init_json_db
41
+ ):
42
+ get_cached_json_db().init()
43
+
44
+ if get_cached_settings().api_start_operation_executor_worker:
45
+ _ = safe_run_worker_in_background(
46
+ worker=create_operation_executor_worker(),
47
+ mode=SafeRunInBackgroundModes.thread
48
+ )
49
+
50
+ if get_cached_settings().api_start_scheduled_operation_creator_worker:
51
+ _ = safe_run_worker_in_background(
52
+ worker=create_scheduled_operation_creator_worker(),
53
+ mode=SafeRunInBackgroundModes.async_task
54
+ )
55
+
56
+ _logger.info("finish")
57
+
58
+
59
+ def get_api_startup_events() -> list[Callable]:
60
+ res = [async_api_startup_event]
61
+ return res
62
+
63
+
64
+ # SHUTDOWN API EVENTS
65
+
66
+
67
+ async def async_api_shutdown_event():
68
+ _logger.info("start")
69
+ _logger.info("finish")
70
+
71
+
72
+ def get_api_shutdown_events() -> list[Callable]:
73
+ res = [async_api_shutdown_event]
74
+ return res
@@ -0,0 +1,38 @@
1
+ from typing import Any
2
+
3
+ import fastapi.security
4
+
5
+ from api.const import APIErrorCodes
6
+ from api.schema.common.out import ErrorCommonSO
7
+
8
+
9
+ class APIException(fastapi.exceptions.HTTPException):
10
+ def __init__(
11
+ self,
12
+ *,
13
+ status_code: int = fastapi.status.HTTP_400_BAD_REQUEST,
14
+ error_code: str | None = APIErrorCodes.unknown_error,
15
+ error_specification_code: str | None = None,
16
+ error_description: str | None = None,
17
+ error_data: dict[str, Any] | None = None
18
+ ):
19
+ self.status_code = status_code
20
+ self.error_code = error_code
21
+ self.error_specification_code = error_specification_code
22
+ self.error_description = error_description
23
+ if error_data is None:
24
+ error_data = {}
25
+ self.error_data = error_data
26
+
27
+ self.error_common_so = ErrorCommonSO(
28
+ has_error=True,
29
+ error_code=self.error_code,
30
+ error_specification_code=self.error_specification_code,
31
+ error_description=self.error_description,
32
+ error_data=self.error_data
33
+ )
34
+
35
+ super().__init__(
36
+ status_code=self.status_code,
37
+ detail=self.error_common_so.model_dump(mode="json")
38
+ )