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.
- arpakitlib/{_arpakit_project_template → _arpakit_project_template_v_1}/README.md +1 -1
- arpakitlib/{_arpakit_project_template → _arpakit_project_template_v_1}/alembic/env.py +3 -3
- arpakitlib/_arpakit_project_template_v_1/api/asgi.py +3 -0
- arpakitlib/_arpakit_project_template_v_1/api/auth.py +235 -0
- arpakitlib/_arpakit_project_template_v_1/api/const.py +18 -0
- arpakitlib/_arpakit_project_template_v_1/api/create_api_app.py +71 -0
- arpakitlib/_arpakit_project_template_v_1/api/event.py +74 -0
- arpakitlib/_arpakit_project_template_v_1/api/exception.py +38 -0
- arpakitlib/_arpakit_project_template_v_1/api/exception_handler.py +308 -0
- arpakitlib/_arpakit_project_template_v_1/api/openapi_ui.py +28 -0
- arpakitlib/_arpakit_project_template_v_1/api/response.py +31 -0
- arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v_1}/api/router/main_router.py +4 -3
- arpakitlib/_arpakit_project_template_v_1/api/router/v1/arpakit_project_template.py +22 -0
- arpakitlib/_arpakit_project_template_v_1/api/router/v1/check_auth.py +30 -0
- arpakitlib/_arpakit_project_template_v_1/api/router/v1/clear_log_file.py +25 -0
- arpakitlib/_arpakit_project_template_v_1/api/router/v1/get_errors_info.py +24 -0
- arpakitlib/_arpakit_project_template_v_1/api/router/v1/get_log_file.py +23 -0
- arpakitlib/_arpakit_project_template_v_1/api/router/v1/healthcheck.py +21 -0
- arpakitlib/_arpakit_project_template_v_1/api/router/v1/main_router.py +67 -0
- arpakitlib/_arpakit_project_template_v_1/api/router/v1/now_utc_datetime.py +21 -0
- arpakitlib/_arpakit_project_template_v_1/api/router/v1/raise_fake_error.py +35 -0
- arpakitlib/_arpakit_project_template_v_1/api/schema/base_schema.py +26 -0
- arpakitlib/_arpakit_project_template_v_1/api/schema/common/in_.py +5 -0
- arpakitlib/_arpakit_project_template_v_1/api/schema/common/out.py +60 -0
- arpakitlib/_arpakit_project_template_v_1/api/schema/v1/in_.py +5 -0
- arpakitlib/_arpakit_project_template_v_1/api/schema/v1/out.py +47 -0
- arpakitlib/_arpakit_project_template_v_1/arpakitlib_project_template.json +3 -0
- arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v_1}/business_service/hello_world.py +1 -1
- arpakitlib/_arpakit_project_template_v_1/business_service/remove_operations.py +51 -0
- arpakitlib/_arpakit_project_template_v_1/command/alembic_history.sh +2 -0
- arpakitlib/_arpakit_project_template_v_1/command/alembic_revision_autogenerate.sh +2 -0
- arpakitlib/{_arpakit_project_template/manage/json_beautify.py → _arpakit_project_template_v_1/command/beautify_json.py} +2 -2
- arpakitlib/{_arpakit_project_template/src/core/_check_logging.py → _arpakit_project_template_v_1/command/check_logging.py} +3 -3
- arpakitlib/_arpakit_project_template_v_1/command/check_sqlalchemy_db.py +11 -0
- arpakitlib/_arpakit_project_template_v_1/command/drop_json_db.py +13 -0
- arpakitlib/_arpakit_project_template_v_1/command/drop_sqlalchemy_db.py +14 -0
- arpakitlib/{_arpakit_project_template/src/core/_generate_settings_env_example.py → _arpakit_project_template_v_1/command/generate_settings_env_example.py} +4 -4
- arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/hello_world.py +2 -2
- arpakitlib/_arpakit_project_template_v_1/command/init_json_db.py +11 -0
- arpakitlib/_arpakit_project_template_v_1/command/init_sqlalchemy_db.py +11 -0
- arpakitlib/_arpakit_project_template_v_1/command/reinit_json_db.py +13 -0
- arpakitlib/_arpakit_project_template_v_1/command/reinit_sqlalchemy_db.py +13 -0
- arpakitlib/_arpakit_project_template_v_1/command/remove_operations.py +13 -0
- arpakitlib/_arpakit_project_template_v_1/command/remove_story_logs.py +16 -0
- arpakitlib/_arpakit_project_template_v_1/command/rm_all_records_in_json_db.py +13 -0
- arpakitlib/{_arpakit_project_template/src/core/_show_settings.py → _arpakit_project_template_v_1/command/show_settings.py} +3 -3
- arpakitlib/{_arpakit_project_template/src/api/_start_api_with_reload.py → _arpakit_project_template_v_1/command/start_api_with_reload.py} +5 -5
- arpakitlib/{_arpakit_project_template/src/api/_start_api_without_reload.py → _arpakit_project_template_v_1/command/start_api_without_reload.py} +5 -5
- arpakitlib/_arpakit_project_template_v_1/command/start_async_operation_executor_worker.py +14 -0
- arpakitlib/_arpakit_project_template_v_1/command/start_async_scheduled_operation_creator_worker.py +14 -0
- arpakitlib/_arpakit_project_template_v_1/command/start_sync_operation_executor_worker.py +15 -0
- arpakitlib/_arpakit_project_template_v_1/command/start_sync_operation_executor_workers.py +22 -0
- arpakitlib/_arpakit_project_template_v_1/command/start_sync_scheduled_operation_creator_worker.py +12 -0
- arpakitlib/_arpakit_project_template_v_1/core/cache_file_storage_in_dir.py +23 -0
- arpakitlib/_arpakit_project_template_v_1/core/const.py +33 -0
- arpakitlib/_arpakit_project_template_v_1/core/dump_file_storage_in_dir.py +23 -0
- arpakitlib/_arpakit_project_template_v_1/core/jinja2_templates.py +14 -0
- arpakitlib/_arpakit_project_template_v_1/core/media_file_storage_in_dir.py +23 -0
- arpakitlib/_arpakit_project_template_v_1/core/settings.py +195 -0
- arpakitlib/_arpakit_project_template_v_1/core/util.py +29 -0
- arpakitlib/{_arpakit_project_template → _arpakit_project_template_v_1}/example.env +13 -7
- arpakitlib/_arpakit_project_template_v_1/json_db/json_db.py +28 -0
- arpakitlib/_arpakit_project_template_v_1/operation_execution/operation_executor_worker.py +256 -0
- arpakitlib/_arpakit_project_template_v_1/operation_execution/scheduled_operation_creator_worker.py +106 -0
- arpakitlib/_arpakit_project_template_v_1/operation_execution/scheduled_operations.py +49 -0
- arpakitlib/_arpakit_project_template_v_1/operation_execution/util.py +29 -0
- arpakitlib/_arpakit_project_template_v_1/resource/static/openapi-favicon.png +0 -0
- arpakitlib/_arpakit_project_template_v_1/resource/static/swagger-ui/index.html +19 -0
- arpakitlib/_arpakit_project_template_v_1/resource/static/swagger-ui/swagger-ui-bundle.js +2 -0
- arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/swagger-ui-es-bundle-core.js +1 -1
- arpakitlib/_arpakit_project_template_v_1/resource/static/swagger-ui/swagger-ui-es-bundle-core.js.map +1 -0
- arpakitlib/_arpakit_project_template_v_1/resource/static/swagger-ui/swagger-ui-es-bundle.js +2 -0
- arpakitlib/_arpakit_project_template_v_1/resource/static/swagger-ui/swagger-ui-standalone-preset.js +2 -0
- arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/swagger-ui.js +1 -1
- arpakitlib/_arpakit_project_template_v_1/resource/static/swagger-ui/swagger-ui.js.map +1 -0
- arpakitlib/_arpakit_project_template_v_1/sandbox/sandbox_1.py +14 -0
- arpakitlib/_arpakit_project_template_v_1/sandbox/sandbox_2.py +14 -0
- arpakitlib/_arpakit_project_template_v_1/sandbox/sandbox_3.py +14 -0
- arpakitlib/_arpakit_project_template_v_1/sandbox/sandbox_4.py +14 -0
- arpakitlib/_arpakit_project_template_v_1/sandbox/sandbox_5.py +14 -0
- arpakitlib/_arpakit_project_template_v_1/sandbox/sandbox_6.py +14 -0
- arpakitlib/_arpakit_project_template_v_1/sandbox/sandbox_7.py +14 -0
- arpakitlib/_arpakit_project_template_v_1/site/router/main_router.py +3 -0
- arpakitlib/_arpakit_project_template_v_1/sqladmin_/add_admin_in_app.py +24 -0
- arpakitlib/_arpakit_project_template_v_1/sqladmin_/admin_auth.py +54 -0
- arpakitlib/_arpakit_project_template_v_1/sqladmin_/model_view.py +95 -0
- arpakitlib/_arpakit_project_template_v_1/sqlalchemy_db/sqlalchemy_db.py +22 -0
- arpakitlib/_arpakit_project_template_v_1/sqlalchemy_db/sqlalchemy_model.py +129 -0
- arpakitlib/_arpakit_project_template_v_1/sqlalchemy_db/util.py +28 -0
- arpakitlib/{_arpakit_project_template/src/sandbox/sandbox_3.py → _arpakit_project_template_v_1/test_data/make_test_data_1.py} +8 -3
- arpakitlib/{_arpakit_project_template/src/sandbox/sandbox_4.py → _arpakit_project_template_v_1/test_data/make_test_data_2.py} +8 -3
- arpakitlib/{_arpakit_project_template/src/sandbox/sandbox_1.py → _arpakit_project_template_v_1/test_data/make_test_data_3.py} +8 -3
- arpakitlib/{_arpakit_project_template/src/sandbox/sandbox_2.py → _arpakit_project_template_v_1/test_data/make_test_data_4.py} +8 -3
- arpakitlib/_arpakit_project_template_v_1/test_data/make_test_data_5.py +22 -0
- arpakitlib/_arpakit_project_template_v_1/tg_bot/blank/blank.py +5 -0
- arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v_1}/tg_bot/blank/util.py +1 -1
- arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v_1}/tg_bot/const.py +6 -3
- arpakitlib/_arpakit_project_template_v_1/tg_bot/event.py +51 -0
- arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v_1}/tg_bot/filter/not_prod_mode.py +1 -1
- arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v_1}/tg_bot/filter/prod_mode.py +1 -1
- arpakitlib/_arpakit_project_template_v_1/tg_bot/kb/static_/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_1/tg_bot/kb/static_/common.py +0 -0
- arpakitlib/_arpakit_project_template_v_1/tg_bot/middleware/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_1/tg_bot/middleware/init_user.py +24 -0
- arpakitlib/_arpakit_project_template_v_1/tg_bot/middleware/middleware.py +12 -0
- arpakitlib/_arpakit_project_template_v_1/tg_bot/router/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_1/tg_bot/router/arpakitlib_.py +10 -0
- arpakitlib/_arpakit_project_template_v_1/tg_bot/router/error.py +15 -0
- arpakitlib/_arpakit_project_template_v_1/tg_bot/router/healthcheck.py +10 -0
- arpakitlib/_arpakit_project_template_v_1/tg_bot/router/main_router.py +14 -0
- arpakitlib/_arpakit_project_template_v_1/tg_bot/start_tg_bot.py +34 -0
- arpakitlib/_arpakit_project_template_v_1/tg_bot/tg_bot.py +24 -0
- arpakitlib/_arpakit_project_template_v_1/tg_bot/tg_bot_dispatcher.py +19 -0
- arpakitlib/_arpakit_project_template_v_1/tg_bot/transmitted_tg_data.py +58 -0
- arpakitlib/_arpakit_project_template_v_1/tg_bot/util.py +0 -0
- arpakitlib/_arpakit_project_template_v_1/util/__init__.py +0 -0
- arpakitlib/_arpakit_project_template_v_1/util/read_arpakitlib_project_template_file.py +17 -0
- arpakitlib/ar_aiogram_util.py +41 -52
- arpakitlib/ar_arpakit_project_template_util.py +5 -11
- arpakitlib/ar_arpakitlib_cli_util.py +8 -2
- arpakitlib/ar_base_worker_util.py +35 -17
- arpakitlib/ar_class_util.py +11 -0
- arpakitlib/ar_func_util.py +19 -29
- arpakitlib/ar_http_request_util.py +10 -2
- arpakitlib/ar_rat_func_util.py +1 -1
- arpakitlib/ar_retry_func_util.py +4 -4
- arpakitlib/ar_schedule_uust_api_client_util.py +1 -1
- arpakitlib/ar_settings_util.py +3 -204
- arpakitlib/ar_sqladmin_util.py +7 -102
- arpakitlib/ar_sqlalchemy_util.py +65 -13
- arpakitlib/ar_type_util.py +0 -2
- {arpakitlib-1.7.257.dist-info → arpakitlib-1.8.1.dist-info}/METADATA +5 -3
- arpakitlib-1.8.1.dist-info/RECORD +261 -0
- {arpakitlib-1.7.257.dist-info → arpakitlib-1.8.1.dist-info}/WHEEL +1 -1
- arpakitlib/_arpakit_project_template/ARPAKITLIB +0 -1
- arpakitlib/_arpakit_project_template/manage/docker_ps.sh +0 -2
- arpakitlib/_arpakit_project_template/manage/git_branch.sh +0 -2
- arpakitlib/_arpakit_project_template/manage/poetry_add_plugin_export.sh +0 -2
- arpakitlib/_arpakit_project_template/manage/poetry_config_virtualenvs_in_project_true.sh +0 -2
- arpakitlib/_arpakit_project_template/manage/poetry_self_add_plugin_export.sh +0 -2
- arpakitlib/_arpakit_project_template/src/admin1/add_admin_in_app.py +0 -32
- arpakitlib/_arpakit_project_template/src/admin1/admin_auth.py +0 -29
- arpakitlib/_arpakit_project_template/src/admin1/model_view.py +0 -1
- arpakitlib/_arpakit_project_template/src/api/asgi.py +0 -3
- arpakitlib/_arpakit_project_template/src/api/auth.py +0 -53
- arpakitlib/_arpakit_project_template/src/api/const.py +0 -13
- arpakitlib/_arpakit_project_template/src/api/create_api_app.py +0 -43
- arpakitlib/_arpakit_project_template/src/api/create_handle_exception_.py +0 -59
- arpakitlib/_arpakit_project_template/src/api/event.py +0 -83
- arpakitlib/_arpakit_project_template/src/api/router/v1/get_api_error_info.py +0 -27
- arpakitlib/_arpakit_project_template/src/api/router/v1/main_router.py +0 -15
- arpakitlib/_arpakit_project_template/src/api/schema/v1/in_.py +0 -1
- arpakitlib/_arpakit_project_template/src/api/schema/v1/out.py +0 -1
- arpakitlib/_arpakit_project_template/src/api/transmitted_api_data.py +0 -7
- arpakitlib/_arpakit_project_template/src/api/util.py +0 -44
- arpakitlib/_arpakit_project_template/src/core/const.py +0 -41
- arpakitlib/_arpakit_project_template/src/core/settings.py +0 -21
- arpakitlib/_arpakit_project_template/src/core/util.py +0 -61
- arpakitlib/_arpakit_project_template/src/json_db/_drop_json_db.py +0 -13
- arpakitlib/_arpakit_project_template/src/json_db/_init_json_db.py +0 -11
- arpakitlib/_arpakit_project_template/src/json_db/_reinit_json_db.py +0 -13
- arpakitlib/_arpakit_project_template/src/json_db/_rm_all_records_in_json_db.py +0 -13
- arpakitlib/_arpakit_project_template/src/json_db/json_db.py +0 -11
- arpakitlib/_arpakit_project_template/src/json_db/util.py +0 -17
- arpakitlib/_arpakit_project_template/src/just_script/example.py +0 -16
- arpakitlib/_arpakit_project_template/src/operation_execution/_start_operation_executor_worker.py +0 -17
- arpakitlib/_arpakit_project_template/src/operation_execution/_start_scheduled_operation_creator_worker.py +0 -17
- arpakitlib/_arpakit_project_template/src/operation_execution/const.py +0 -9
- arpakitlib/_arpakit_project_template/src/operation_execution/operation_executor.py +0 -16
- arpakitlib/_arpakit_project_template/src/operation_execution/scheduled_operations.py +0 -29
- arpakitlib/_arpakit_project_template/src/operation_execution/util.py +0 -1
- arpakitlib/_arpakit_project_template/src/sandbox/sandbox_5.py +0 -17
- arpakitlib/_arpakit_project_template/src/sandbox/sandbox_6.py +0 -17
- arpakitlib/_arpakit_project_template/src/sandbox/sandbox_7.py +0 -17
- arpakitlib/_arpakit_project_template/src/sqlalchemy_db/_check_conn_sqlalchemy_db.py +0 -11
- arpakitlib/_arpakit_project_template/src/sqlalchemy_db/_drop_sqlalchemy_db.py +0 -13
- arpakitlib/_arpakit_project_template/src/sqlalchemy_db/_init_sqlalchemy_db.py +0 -11
- arpakitlib/_arpakit_project_template/src/sqlalchemy_db/_reinit_sqlalchemy_db.py +0 -13
- arpakitlib/_arpakit_project_template/src/sqlalchemy_db/_remove_operations.py +0 -15
- arpakitlib/_arpakit_project_template/src/sqlalchemy_db/_remove_story_logs.py +0 -16
- arpakitlib/_arpakit_project_template/src/sqlalchemy_db/sqlalchemy_model.py +0 -13
- arpakitlib/_arpakit_project_template/src/sqlalchemy_db/util.py +0 -27
- arpakitlib/_arpakit_project_template/src/test_data/make_test_data_1.py +0 -8
- arpakitlib/_arpakit_project_template/src/test_data/make_test_data_2.py +0 -8
- arpakitlib/_arpakit_project_template/src/test_data/make_test_data_3.py +0 -8
- arpakitlib/_arpakit_project_template/src/test_data/make_test_data_4.py +0 -8
- arpakitlib/_arpakit_project_template/src/test_data/make_test_data_5.py +0 -8
- arpakitlib/_arpakit_project_template/src/tg_bot/blank/blank.py +0 -10
- arpakitlib/_arpakit_project_template/src/tg_bot/event.py +0 -39
- arpakitlib/_arpakit_project_template/src/tg_bot/router/error.py +0 -3
- arpakitlib/_arpakit_project_template/src/tg_bot/router/router.py +0 -7
- arpakitlib/_arpakit_project_template/src/tg_bot/start_tg_bot.py +0 -11
- arpakitlib/_arpakit_project_template/src/tg_bot/transmitted_tg_data.py +0 -6
- arpakitlib/_arpakit_project_template/src/tg_bot/util.py +0 -44
- arpakitlib/ar_api_key_util.py +0 -21
- arpakitlib/ar_fastapi_static/swagger-ui/index.html +0 -19
- arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-bundle.js +0 -2
- arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-es-bundle-core.js.map +0 -1
- arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-es-bundle.js +0 -2
- arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui-standalone-preset.js +0 -2
- arpakitlib/ar_fastapi_static/swagger-ui/swagger-ui.js.map +0 -1
- arpakitlib/ar_fastapi_util.py +0 -862
- arpakitlib/ar_operation_execution_util.py +0 -504
- arpakitlib/ar_sqlalchemy_model_util.py +0 -183
- arpakitlib-1.7.257.dist-info/RECORD +0 -236
- /arpakitlib/{_arpakit_project_template → _arpakit_project_template_v_1}/.gitignore +0 -0
- /arpakitlib/{_arpakit_project_template → _arpakit_project_template_v_1}/.python-version +0 -0
- /arpakitlib/{_arpakit_project_template → _arpakit_project_template_v_1}/LICENSE +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/additional_model}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v_1}/additional_model/additional_model.py +0 -0
- /arpakitlib/{_arpakit_project_template → _arpakit_project_template_v_1}/alembic/README +0 -0
- /arpakitlib/{_arpakit_project_template → _arpakit_project_template_v_1}/alembic/script.py.mako +0 -0
- /arpakitlib/{_arpakit_project_template → _arpakit_project_template_v_1}/alembic.ini +0 -0
- /arpakitlib/{_arpakit_project_template/manage/note → _arpakit_project_template_v_1/api}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/resource → _arpakit_project_template_v_1/api/router}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/resource/static → _arpakit_project_template_v_1/api/router/v1}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v_1/api/schema}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src/additional_model → _arpakit_project_template_v_1/api/schema/common}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src/admin1 → _arpakit_project_template_v_1/api/schema/v1}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/manage/note/note_1.txt → _arpakit_project_template_v_1/api/util.py} +0 -0
- /arpakitlib/{_arpakit_project_template/src/api → _arpakit_project_template_v_1/business_service}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src/api/router → _arpakit_project_template_v_1/celery_}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src/api/router/v1 → _arpakit_project_template_v_1/command}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/alembic_upgrade_head .sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/docker_ps_a.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/docker_rm_postgres.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/docker_run_postgres.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/docker_start_postgres.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/docker_stop_postgres.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/git_commit.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/git_push_arpakit_company_github_1.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/git_push_arpakit_company_gitlab_1.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/git_push_arpakit_github_1.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/git_push_arpakit_gitlab_1.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage/git_remote_v.sh → _arpakit_project_template_v_1/command/git_remote.sh} +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/git_set_arpakit_company_origin.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/git_set_arpakit_origin.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/git_status.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/poetry_check.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/poetry_clear_cache.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/poetry_config.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/poetry_install.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/poetry_lock.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/poetry_remove_and_add_arpakitlib.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/poetry_show.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/poetry_show_arpakitlib.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/poetry_update.sh +0 -0
- /arpakitlib/{_arpakit_project_template/manage → _arpakit_project_template_v_1/command}/poetry_update_arpakitlib.sh +0 -0
- /arpakitlib/{_arpakit_project_template/src/api/schema → _arpakit_project_template_v_1/core}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src/api/schema/v1 → _arpakit_project_template_v_1/json_db}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src/business_service → _arpakit_project_template_v_1/note}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/manage/note/note_2.txt → _arpakit_project_template_v_1/note/note_1.txt} +0 -0
- /arpakitlib/{_arpakit_project_template/manage/note/note_3.txt → _arpakit_project_template_v_1/note/note_2.txt} +0 -0
- /arpakitlib/{_arpakit_project_template/manage/note/note_4.txt → _arpakit_project_template_v_1/note/note_3.txt} +0 -0
- /arpakitlib/{_arpakit_project_template/manage/note/note_5.txt → _arpakit_project_template_v_1/note/note_4.txt} +0 -0
- /arpakitlib/{_arpakit_project_template/src/core/__init__.py → _arpakit_project_template_v_1/note/note_5.txt} +0 -0
- /arpakitlib/{_arpakit_project_template/src/json_db → _arpakit_project_template_v_1/operation_execution}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src/just_script/__init__.py → _arpakit_project_template_v_1/operation_execution/const.py} +0 -0
- /arpakitlib/{_arpakit_project_template/src/operation_execution → _arpakit_project_template_v_1/resource}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/resource/static/healthcheck → _arpakit_project_template_v_1/resource/static/1} +0 -0
- /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/healthcheck +0 -0
- /arpakitlib/{_arpakit_project_template → _arpakit_project_template_v_1}/resource/static/helloworld +0 -0
- /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/redoc/redoc.standalone.js +0 -0
- /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/favicon-16x16.png +0 -0
- /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/favicon-32x32.png +0 -0
- /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/index.css +0 -0
- /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/oauth2-redirect.html +0 -0
- /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/swagger-initializer.js +0 -0
- /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/swagger-ui-bundle.js.map +0 -0
- /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/swagger-ui-es-bundle.js.map +0 -0
- /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/swagger-ui-standalone-preset.js.map +0 -0
- /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/swagger-ui.css +0 -0
- /arpakitlib/{ar_fastapi_static → _arpakit_project_template_v_1/resource/static}/swagger-ui/swagger-ui.css.map +0 -0
- /arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v_1}/sandbox/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src/sqlalchemy_db → _arpakit_project_template_v_1/site}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src/test_data/__init__.py → _arpakit_project_template_v_1/site/asgi.py} +0 -0
- /arpakitlib/{_arpakit_project_template/src/tg_bot/__init__.py → _arpakit_project_template_v_1/site/consts.py} +0 -0
- /arpakitlib/{_arpakit_project_template/src/tg_bot/blank/__init__.py → _arpakit_project_template_v_1/site/create_site_app.py} +0 -0
- /arpakitlib/{_arpakit_project_template/src/tg_bot/filter/__init__.py → _arpakit_project_template_v_1/site/event.py} +0 -0
- /arpakitlib/{_arpakit_project_template/src/tg_bot/handler/__init__.py → _arpakit_project_template_v_1/site/exception_handler.py} +0 -0
- /arpakitlib/{_arpakit_project_template/src/tg_bot/kb → _arpakit_project_template_v_1/site/router}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src/tg_bot/kb/inline_ → _arpakit_project_template_v_1/sqladmin_}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src/tg_bot/kb/static_ → _arpakit_project_template_v_1/sqlalchemy_db}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src → _arpakit_project_template_v_1}/sqlalchemy_db/const.py +0 -0
- /arpakitlib/{_arpakit_project_template/src/tg_bot/middleware → _arpakit_project_template_v_1/test_data}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src/tg_bot/router → _arpakit_project_template_v_1/tg_bot}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src/util → _arpakit_project_template_v_1/tg_bot/blank}/__init__.py +0 -0
- /arpakitlib/{_arpakit_project_template/src/tg_bot/handler/cmd_arpakitlib.py → _arpakit_project_template_v_1/tg_bot/filter/__init__.py} +0 -0
- /arpakitlib/{_arpakit_project_template/src/tg_bot/handler/cmd_healthcheck.py → _arpakit_project_template_v_1/tg_bot/kb/__init__.py} +0 -0
- /arpakitlib/{_arpakit_project_template/src/tg_bot/kb/inline_/callback.py → _arpakit_project_template_v_1/tg_bot/kb/inline_/__init__.py} +0 -0
- /arpakitlib/{_arpakit_project_template/src/tg_bot/kb/inline_/common.py → _arpakit_project_template_v_1/tg_bot/kb/inline_/callback.py} +0 -0
- /arpakitlib/{_arpakit_project_template/src/tg_bot/kb/static_ → _arpakit_project_template_v_1/tg_bot/kb/inline_}/common.py +0 -0
- {arpakitlib-1.7.257.dist-info → arpakitlib-1.8.1.dist-info}/LICENSE +0 -0
- {arpakitlib-1.7.257.dist-info → arpakitlib-1.8.1.dist-info}/entry_points.txt +0 -0
@@ -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
|
9
|
-
from
|
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 =
|
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,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
|
+
)
|