arpakitlib 1.8.15__py3-none-any.whl → 1.8.17__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.
- arpakitlib/_arpakit_project_template_v_4/arpakitlib_project_template_info.json +3 -0
- arpakitlib/_arpakit_project_template_v_4/command/beautify_json.py +10 -0
- arpakitlib/_arpakit_project_template_v_4/command/demojize.py +9 -0
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/drop_json_db.py +1 -1
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/drop_sqlalchemy_db.py +1 -1
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/generate_settings_env_example.py +2 -2
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/reinit_json_db.py +1 -1
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/reinit_sqlalchemy_db.py +1 -1
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/remove_operations.py +1 -1
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/remove_story_logs.py +1 -1
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/rm_all_records_in_json_db.py +1 -1
- arpakitlib/_arpakit_project_template_v_4/command/set_tg_bot_commands.py +16 -0
- arpakitlib/_arpakit_project_template_v_4/command/show_settings.py +10 -0
- arpakitlib/_arpakit_project_template_v_4/command/start_sqladmin.py +19 -0
- arpakitlib/_arpakit_project_template_v_4/command/start_sqladmin_for_prod.py +19 -0
- arpakitlib/_arpakit_project_template_v_4/command/start_sqladmin_with_reload.py +19 -0
- arpakitlib/_arpakit_project_template_v_4/command/start_tg_bot_for_prod.py +11 -0
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/example.env +11 -5
- arpakitlib/_arpakit_project_template_v_4/project/additional_model/common.py +8 -0
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/auth.py +111 -35
- arpakitlib/_arpakit_project_template_v_4/project/api/auth2.py +171 -0
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/create_api_app.py +7 -7
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/event.py +8 -8
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/exception.py +1 -1
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/exception_handler.py +38 -36
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/openapi_ui.py +1 -1
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/response.py +5 -5
- arpakitlib/_arpakit_project_template_v_4/project/api/router/admin/get_arpakitlib_project_template_info.py +23 -0
- arpakitlib/_arpakit_project_template_v_4/project/api/router/admin/get_auth_data.py +30 -0
- arpakitlib/_arpakit_project_template_v_4/project/api/router/admin/main_router.py +3 -0
- 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
- arpakitlib/_arpakit_project_template_v_4/project/api/router/client/main_router.py +3 -0
- arpakitlib/_arpakit_project_template_v_4/project/api/router/client/now_utc_datetime.py +22 -0
- arpakitlib/_arpakit_project_template_v_4/project/api/router/general/healthcheck.py +21 -0
- arpakitlib/_arpakit_project_template_v_4/project/api/router/general/main_router.py +10 -0
- arpakitlib/_arpakit_project_template_v_4/project/api/router/main_router.py +23 -0
- arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/admin/common.py +10 -0
- arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/admin/operation.py +23 -0
- arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/admin/story_log.py +17 -0
- arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/client/common.py +10 -0
- 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
- arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/common/raw_data.py +7 -0
- arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/common.py +5 -0
- arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/general/error.py +11 -0
- arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/general/errors_info_general.py +6 -0
- arpakitlib/_arpakit_project_template_v_4/project/api/schema/out/general/healthcheck.py +5 -0
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/core/const.py +2 -2
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/core/settings.py +43 -39
- arpakitlib/_arpakit_project_template_v_4/project/site/router/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/sqladmin_/__init__.py +0 -0
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqladmin_/admin_auth.py +17 -12
- arpakitlib/_arpakit_project_template_v_4/project/sqladmin_/asgi.py +3 -0
- arpakitlib/_arpakit_project_template_v_4/project/sqladmin_/create_sqladmin_app.py +49 -0
- arpakitlib/_arpakit_project_template_v_4/project/sqladmin_/event.py +40 -0
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqladmin_/model_view/operation.py +1 -1
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqladmin_/model_view/story_log.py +1 -1
- arpakitlib/_arpakit_project_template_v_4/project/sqlalchemy_db_/__init__.py +0 -0
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqlalchemy_db_/sqlalchemy_model/__init__.py +4 -0
- arpakitlib/_arpakit_project_template_v_4/project/sqlalchemy_db_/sqlalchemy_model/api_key.py +44 -0
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqlalchemy_db_/sqlalchemy_model/common.py +29 -6
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqlalchemy_db_/sqlalchemy_model/story_log.py +2 -1
- arpakitlib/_arpakit_project_template_v_4/project/sqlalchemy_db_/sqlalchemy_model/user.py +87 -0
- arpakitlib/_arpakit_project_template_v_4/project/sqlalchemy_db_/sqlalchemy_model/user_token.py +41 -0
- arpakitlib/_arpakit_project_template_v_4/project/test_data/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/blank/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/blank/admin.py +45 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/blank/client.py +44 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/blank/common.py +5 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/callback/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/callback/admin.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/callback/client.py +5 -0
- 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
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/tg_bot/const.py +22 -6
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/error_handler.py +37 -0
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/tg_bot/event.py +43 -13
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/filter_/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/filter_/is_private_chat.py +12 -0
- 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
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/filter_/not_prod_mode_filter.py +8 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/filter_/prod_mode_filter.py +8 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/filter_/user_roles_has_admin.py +27 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/filter_/user_roles_has_client.py +27 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/inline_/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/inline_/admin/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/inline_/admin/common.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/inline_/client/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/inline_/client/common.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/inline_/client/hello_world.py +16 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/inline_/common.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/static_/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/static_/admin/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/static_/admin/common.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/static_/client/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/static_/client/common.py +0 -0
- 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
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/kb/static_/common.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/middleware/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/middleware/common.py +13 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/middleware/init_user.py +84 -0
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/tg_bot/middleware/middleware.py +1 -2
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/admin/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/admin/arpakitlib_project_template_info.py +25 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/admin/main_router.py +15 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/admin/me.py +20 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/admin/raise_fake_error.py +20 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/admin/reinit_sqlalchemy_db.py +27 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/client/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/client/healthcheck.py +16 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/client/hello_world.py +44 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/client/main_router.py +14 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/client/start.py +33 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/router/main_router.py +13 -0
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/tg_bot/start_tg_bot.py +2 -2
- arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/tg_bot/tg_bot.py +7 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/util/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/util/etc.py +0 -0
- arpakitlib/_arpakit_project_template_v_4/project/tg_bot/util/set_tg_bot_commands.py +76 -0
- arpakitlib/_arpakit_project_template_v_4/project/util/__init__.py +0 -0
- arpakitlib/ar_aiogram_util.py +0 -3
- arpakitlib/ar_arpakit_schedule_uust_api_client_util.py +1 -65
- arpakitlib/ar_json_util.py +43 -12
- arpakitlib/ar_sqlalchemy_util.py +2 -2
- arpakitlib/ar_ssh_runner_util.py +2 -2
- arpakitlib/ar_str_util.py +15 -0
- {arpakitlib-1.8.15.dist-info → arpakitlib-1.8.17.dist-info}/METADATA +3 -1
- arpakitlib-1.8.17.dist-info/RECORD +330 -0
- arpakitlib/_arpakit_project_template_v_2/arpakitlib_project_template_info.json +0 -3
- arpakitlib/_arpakit_project_template_v_2/command/beautify_json.py +0 -10
- arpakitlib/_arpakit_project_template_v_2/command/show_settings.py +0 -10
- arpakitlib/_arpakit_project_template_v_2/project/additional_model/common.py +0 -1
- arpakitlib/_arpakit_project_template_v_2/project/api/router/general/get_auth_data.py +0 -31
- arpakitlib/_arpakit_project_template_v_2/project/api/router/general/healthcheck.py +0 -26
- arpakitlib/_arpakit_project_template_v_2/project/api/router/general/main_router.py +0 -24
- arpakitlib/_arpakit_project_template_v_2/project/api/router/general/now_utc_datetime.py +0 -26
- arpakitlib/_arpakit_project_template_v_2/project/api/router/main_router.py +0 -11
- arpakitlib/_arpakit_project_template_v_2/project/api/schema/common/in_.py +0 -5
- arpakitlib/_arpakit_project_template_v_2/project/api/schema/example/in_.py +0 -5
- arpakitlib/_arpakit_project_template_v_2/project/api/schema/example/out.py +0 -45
- arpakitlib/_arpakit_project_template_v_2/project/api/schema/general/in_.py +0 -5
- arpakitlib/_arpakit_project_template_v_2/project/api/schema/general/out.py +0 -14
- arpakitlib/_arpakit_project_template_v_2/project/tg_bot/blank/blank.py +0 -24
- arpakitlib/_arpakit_project_template_v_2/project/tg_bot/kb/inline_/common.py +0 -15
- arpakitlib/_arpakit_project_template_v_2/project/tg_bot/middleware/init_user.py +0 -21
- arpakitlib/_arpakit_project_template_v_2/project/tg_bot/router/arpakitlib_project_template_info.py +0 -14
- arpakitlib/_arpakit_project_template_v_2/project/tg_bot/router/error.py +0 -16
- arpakitlib/_arpakit_project_template_v_2/project/tg_bot/router/healthcheck.py +0 -11
- arpakitlib/_arpakit_project_template_v_2/project/tg_bot/router/main_router.py +0 -12
- arpakitlib/_arpakit_project_template_v_2/project/tg_bot/util.py +0 -1
- arpakitlib-1.8.15.dist-info/RECORD +0 -265
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/.gitignore +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/.python-version +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/LICENSE +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/README.md +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/alembic/README +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/alembic/env.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/alembic/script.py.mako +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/alembic/versions/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/alembic.ini +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/alembic_history.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/alembic_revision_autogenerate.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/alembic_upgrade_head.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/check_logging.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/check_sqlalchemy_db.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/docker_ps_a.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/docker_rm_postgres.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/docker_run_postgres.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/docker_start_postgres.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/docker_stop_postgres.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_commit.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_push_arpakit_company_github_1.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_push_arpakit_company_gitlab_1.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_push_arpakit_github_1.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_push_arpakit_gitlab_1.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_remote_v.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_set_arpakit_company_origin.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_set_arpakit_origin.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_set_divarteam_origin.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/git_status.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/hello_world.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/init_json_db.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/init_sqlalchemy_db.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_check.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_clear_cache.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_config.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_install.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_lock.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_remove_and_add_arpakitlib.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_show.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_show_arpakitlib.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_update.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/poetry_update_arpakitlib.sh +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/command/start_api_for_not_prod.py → _arpakit_project_template_v_4/command/start_api.py} +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/command/start_api_for_prod.py +0 -0
- /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
- /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
- /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
- /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
- /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
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/note/note_1.txt +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/note/note_2.txt +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/note/note_3.txt +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/note/note_4.txt +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/note/note_5.txt +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/additional_model/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/asgi.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/const.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/router/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/api/router/general → _arpakit_project_template_v_4/project/api/router/admin}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/api/schema → _arpakit_project_template_v_4/project/api/router/client}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/api/schema/common → _arpakit_project_template_v_4/project/api/router/general}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/api/schema/example → _arpakit_project_template_v_4/project/api/schema}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/api/schema/base_schema.py → _arpakit_project_template_v_4/project/api/schema/common.py} +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/api/schema/general → _arpakit_project_template_v_4/project/api/schema/in_}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/business_service → _arpakit_project_template_v_4/project/api/schema/in_/admin}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/api/util.py → _arpakit_project_template_v_4/project/api/schema/in_/admin/common.py} +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/celery_ → _arpakit_project_template_v_4/project/api/schema/in_/client}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/core/__init__.py → _arpakit_project_template_v_4/project/api/schema/in_/client/common.py} +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/json_db → _arpakit_project_template_v_4/project/api/schema/in_/general}/__init__.py +0 -0
- /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
- /arpakitlib/{_arpakit_project_template_v_2/project/resource → _arpakit_project_template_v_4/project/api/schema/out}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/sandbox → _arpakit_project_template_v_4/project/api/schema/out/admin}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/site → _arpakit_project_template_v_4/project/api/schema/out/client}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/site/router → _arpakit_project_template_v_4/project/api/schema/out/common}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/sqladmin_ → _arpakit_project_template_v_4/project/api/schema/out/general}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/site/consts.py → _arpakit_project_template_v_4/project/api/schema/out/general/common.py} +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/site/exception_handler.py → _arpakit_project_template_v_4/project/api/util.py} +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/sqlalchemy_db_ → _arpakit_project_template_v_4/project/business_service}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/business_service/hello_world.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/business_service/remove_operations.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/test_data → _arpakit_project_template_v_4/project/celery_}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/tg_bot → _arpakit_project_template_v_4/project/core}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/core/cache_file_storage_in_dir.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/core/dump_file_storage_in_dir.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/core/jinja2_templates.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/core/media_file_storage_in_dir.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/core/util.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/tg_bot/blank → _arpakit_project_template_v_4/project/json_db}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/json_db/json_db.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/more/helloworld +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/tg_bot/kb → _arpakit_project_template_v_4/project/operation_execution}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/operation_execution/const.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/operation_execution/operation_executor_worker.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/operation_execution/scheduled_operation_creator_worker.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/operation_execution/scheduled_operations.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/operation_execution/util.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/tg_bot/kb/inline_ → _arpakit_project_template_v_4/project/resource}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/1 +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/healthcheck +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/helloworld +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/openapi-favicon.png +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/redoc/redoc.standalone.js +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/favicon-16x16.png +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/favicon-32x32.png +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/index.css +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/index.html +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/oauth2-redirect.html +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-initializer.js +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui-bundle.js +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui-bundle.js.map +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui-es-bundle-core.js +0 -0
- /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
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui-es-bundle.js +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui-es-bundle.js.map +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui-standalone-preset.js +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui-standalone-preset.js.map +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui.css +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui.css.map +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui.js +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/resource/static/swagger-ui/swagger-ui.js.map +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/tg_bot/kb/static_ → _arpakit_project_template_v_4/project/sandbox}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sandbox/sandbox_1.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sandbox/sandbox_2.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sandbox/sandbox_3.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sandbox/sandbox_4.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sandbox/sandbox_5.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sandbox/sandbox_6.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sandbox/sandbox_7.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/tg_bot/middleware → _arpakit_project_template_v_4/project/site}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/site/asgi.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/tg_bot/router/__init__.py → _arpakit_project_template_v_4/project/site/consts.py} +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/site/create_site_app.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/site/event.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2/project/util/__init__.py → _arpakit_project_template_v_4/project/site/exception_handler.py} +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/site/router/main_router.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqladmin_/add_admin_in_app.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqladmin_/model_view/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqladmin_/model_view/common.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqlalchemy_db_/const.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqlalchemy_db_/sqlalchemy_db.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqlalchemy_db_/sqlalchemy_model/operation.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/sqlalchemy_db_/util.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/test_data/make_test_data_1.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/test_data/make_test_data_2.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/test_data/make_test_data_3.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/test_data/make_test_data_4.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/test_data/make_test_data_5.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/tg_bot/tg_bot_dispatcher.py +0 -0
- /arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/util/arpakitlib_project_template.py +0 -0
- {arpakitlib-1.8.15.dist-info → arpakitlib-1.8.17.dist-info}/LICENSE +0 -0
- {arpakitlib-1.8.15.dist-info → arpakitlib-1.8.17.dist-info}/WHEEL +0 -0
- {arpakitlib-1.8.15.dist-info → arpakitlib-1.8.17.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
|
9
|
-
from project.api.exception_handler import
|
10
|
-
from project.api.openapi_ui import
|
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=
|
31
|
-
on_shutdown=
|
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
|
-
|
47
|
+
add_local_openapi_ui_to_api_app(app=api_app)
|
48
48
|
|
49
|
-
|
49
|
+
add_exception_handler_to_api_app(app=api_app)
|
50
50
|
|
51
51
|
api_app.include_router(
|
52
52
|
prefix=prefix,
|
arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/event.py
RENAMED
@@ -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
|
17
|
+
# API STARTUP EVENTS
|
18
18
|
|
19
19
|
|
20
|
-
async def
|
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
|
60
|
-
res = [
|
59
|
+
def get_startup_api_events() -> list[Callable]:
|
60
|
+
res = [async_startup_api_event]
|
61
61
|
return res
|
62
62
|
|
63
63
|
|
64
|
-
# SHUTDOWN
|
64
|
+
# API SHUTDOWN EVENTS
|
65
65
|
|
66
66
|
|
67
|
-
async def
|
67
|
+
async def async_shutdown_api_event():
|
68
68
|
_logger.info("start")
|
69
69
|
_logger.info("finish")
|
70
70
|
|
71
71
|
|
72
|
-
def
|
73
|
-
res = [
|
72
|
+
def get_shutdown_api_events() -> list[Callable]:
|
73
|
+
res = [async_shutdown_api_event]
|
74
74
|
return res
|
arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/exception.py
RENAMED
@@ -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
|
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.
|
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
|
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
|
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 =
|
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
|
-
|
109
|
-
request=request,
|
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
|
-
|
118
|
-
request=request,
|
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
|
145
|
+
return async_func
|
145
146
|
|
146
147
|
|
147
|
-
def
|
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:
|
160
|
+
error_common_so: ErrorGeneralSO,
|
160
161
|
exception: Exception,
|
161
162
|
transmitted_kwargs: dict[str, Any],
|
162
163
|
**kwargs
|
163
|
-
)
|
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
|
168
|
+
return
|
168
169
|
|
169
170
|
if ignore_status_codes is not None and status_code in ignore_status_codes:
|
170
|
-
return
|
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
|
176
|
+
return
|
176
177
|
|
177
|
-
_logger.error(
|
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
|
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:
|
195
|
+
error_common_so: ErrorGeneralSO,
|
195
196
|
exception: Exception,
|
196
197
|
transmitted_kwargs: dict[str, Any],
|
197
198
|
**kwargs
|
198
|
-
)
|
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
|
203
|
+
return
|
203
204
|
|
204
205
|
if ignore_status_codes is not None and status_code in ignore_status_codes:
|
205
|
-
return
|
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
|
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.
|
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
|
-
"
|
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
|
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().
|
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
|
-
|
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
|
-
|
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
|
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
|
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(
|
arpakitlib/{_arpakit_project_template_v_2 → _arpakit_project_template_v_4}/project/api/response.py
RENAMED
@@ -2,8 +2,8 @@ from typing import Any
|
|
2
2
|
|
3
3
|
import fastapi
|
4
4
|
|
5
|
-
from arpakitlib.ar_json_util import
|
6
|
-
from project.api.schema.
|
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 =
|
15
|
+
content = transfer_data_to_json_str_to_data(content)
|
16
16
|
elif isinstance(content, list):
|
17
|
-
content =
|
17
|
+
content = transfer_data_to_json_str_to_data(content)
|
18
18
|
elif isinstance(content, BaseSO):
|
19
|
-
content =
|
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()))
|
@@ -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.
|
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,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)
|