zrb 0.6.0__py3-none-any.whl → 0.6.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.
- zrb/__init__.py +24 -20
- zrb/__main__.py +5 -5
- zrb/action/runner.py +22 -30
- zrb/advertisement.py +10 -9
- zrb/builtin/__init__.py +18 -16
- zrb/builtin/base64.py +13 -18
- zrb/builtin/devtool/__init__.py +14 -3
- zrb/builtin/devtool/devtool_install.py +207 -221
- zrb/builtin/env.py +9 -12
- zrb/builtin/eval.py +9 -9
- zrb/builtin/explain.py +73 -74
- zrb/builtin/generator/__init__.py +7 -11
- zrb/builtin/generator/app_generator/add.py +86 -87
- zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/add.py +78 -77
- zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/_checker.py +6 -6
- zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/_common.py +14 -15
- zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/container.py +32 -32
- zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/deployment.py +29 -30
- zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/image.py +1 -3
- zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/local.py +5 -4
- zrb/builtin/generator/app_generator/template/base/_automate/generate_snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/deployment/__main__.py +24 -32
- zrb/builtin/generator/app_generator/template/build-custom-image/_automate/generate_snake_zrb_meta_template_name/add.py +89 -87
- zrb/builtin/generator/app_generator/template/build-custom-image/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/_common.py +14 -15
- zrb/builtin/generator/app_generator/template/build-custom-image/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/container.py +42 -54
- zrb/builtin/generator/app_generator/template/build-custom-image/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/deployment.py +34 -32
- zrb/builtin/generator/app_generator/template/build-custom-image/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/image.py +19 -22
- zrb/builtin/generator/app_generator/template/build-custom-image/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/local.py +18 -18
- zrb/builtin/generator/app_generator/template/http-port/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/_checker.py +10 -10
- zrb/builtin/generator/app_generator/template/http-port-build-custom-image/_automate/generate_snake_zrb_meta_template_name/template/_automate/snake_zrb_app_name/local.py +19 -19
- zrb/builtin/generator/app_generator/template/use-helm/_automate/generate_snake_zrb_meta_template_name/template/src/kebab-zrb-app-name/deployment/__main__.py +12 -14
- zrb/builtin/generator/cmd_task/add.py +23 -25
- zrb/builtin/generator/cmd_task/template/_automate/snake_zrb_task_name.py +3 -5
- zrb/builtin/generator/common/helper.py +15 -20
- zrb/builtin/generator/common/task_factory.py +29 -26
- zrb/builtin/generator/common/task_input.py +97 -91
- zrb/builtin/generator/docker_compose_task/add.py +38 -39
- zrb/builtin/generator/docker_compose_task/template/_automate/snake_zrb_task_name.py +13 -19
- zrb/builtin/generator/docker_compose_task/template/src/kebab-zrb-task-name/image/main.py +18 -14
- zrb/builtin/generator/fastapp/add.py +94 -90
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/_checker.py +28 -27
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/_config.py +68 -39
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/_env.py +24 -22
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/_env_file.py +12 -12
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/_get_start_microservices.py +43 -41
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/_helper.py +23 -24
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/_input.py +21 -20
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/app-load-test.sh +1 -1
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/app-start.sh +1 -1
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/cmd/app-test.sh +2 -2
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/container.py +46 -39
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/deployment.py +28 -20
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/frontend.py +21 -27
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/image.py +23 -18
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/load_test.py +35 -36
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/local.py +68 -58
- zrb/builtin/generator/fastapp/template/_automate/snake_zrb_app_name/test.py +24 -38
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/deployment/__main__.py +23 -21
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/deployment/_common.py +72 -75
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/deployment/app_helper.py +70 -75
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/deployment/helm_postgresql_helper.py +18 -21
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/deployment/helm_rabbitmq_helper.py +11 -19
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/deployment/helm_redpanda_helper.py +18 -15
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/deployment/helm_signoz_helper.py +17 -21
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/docker-compose.yml +12 -12
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/loadtest/locustfile.py +10 -12
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/Dockerfile +1 -0
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/component/app.py +35 -30
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/component/app_lifespan.py +21 -17
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/component/app_state.py +3 -2
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/component/db_connection.py +18 -20
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/component/frontend_index.py +5 -6
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/component/log.py +7 -15
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/component/messagebus.py +38 -34
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/component/rpc.py +19 -18
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/config.py +68 -103
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/error.py +11 -10
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/__init__.py +2 -4
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/kafka/admin.py +38 -35
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/kafka/consumer.py +38 -45
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/kafka/publisher.py +26 -29
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/messagebus.py +8 -14
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/mock.py +12 -8
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/rabbitmq/admin.py +37 -44
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/rabbitmq/consumer.py +42 -67
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/messagebus/rabbitmq/publisher.py +32 -55
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/model/repo_model.py +11 -10
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/repo/__init__.py +2 -2
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/repo/db_entity_mixin.py +3 -6
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/repo/db_repo.py +76 -83
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/repo/repo.py +5 -5
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/repo/search_filter.py +1 -0
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/rpc/__init__.py +1 -1
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/rpc/messagebus/caller.py +17 -19
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/rpc/messagebus/server.py +14 -18
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/rpc/rpc.py +15 -28
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/schema/__init__.py +1 -1
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/schema/base_schema.py +6 -5
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/serializer/__init__.py +1 -3
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/core/serializer/serializer.py +3 -4
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/helper/async_task.py +3 -5
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/helper/conversion.py +10 -10
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/helper/migration.py +6 -10
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/migrate.py +3 -2
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/api.py +7 -12
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/__init__.py +4 -6
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/access_token_scheme.py +9 -10
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/access_token_util.py +6 -5
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/authorizer.py +4 -4
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/bearer_token_scheme.py +1 -1
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/model/user_model.py +8 -10
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/password_hasher.py +1 -1
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/refresh_token_util.py +7 -6
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/repo/group_repo.py +3 -8
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/repo/permission_repo.py +3 -7
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/repo/user_repo.py +3 -5
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/component/user.py +12 -7
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/core/__init__.py +7 -12
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/core/access_token/scheme.py +7 -12
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/core/access_token/util.py +20 -30
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/core/authorizer/authorizer.py +1 -3
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/core/authorizer/rpc_authorizer.py +5 -12
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/core/password_hasher/bcrypt_password_hasher.py +3 -8
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/core/password_hasher/password_hasher.py +0 -1
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/core/refresh_token/util.py +15 -21
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/group/api.py +42 -49
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/group/model.py +3 -7
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/group/repo.py +18 -16
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/group/rpc.py +26 -41
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/permission/api.py +46 -51
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/permission/model.py +5 -7
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/permission/repo.py +11 -8
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/permission/rpc.py +28 -45
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/table.py +10 -10
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/user/api.py +60 -72
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/user/model.py +32 -61
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/user/repo.py +33 -36
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/user/rpc.py +42 -61
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/event.py +2 -4
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/migrate.py +3 -5
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/register_module.py +11 -12
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/register_permission.py +19 -26
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/rpc.py +5 -13
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/schema/group.py +6 -4
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/schema/permission.py +3 -1
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/schema/request.py +1 -0
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/schema/token.py +2 -2
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/schema/user.py +4 -3
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/api.py +4 -5
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/component/model/activity_model.py +3 -9
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/component/repo/activity_repo.py +3 -7
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/core/historical_repo_model.py +13 -13
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/entity/activity/api.py +22 -23
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/entity/activity/event.py +5 -7
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/entity/activity/model.py +2 -6
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/entity/activity/repo.py +8 -8
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/entity/activity/rpc.py +28 -45
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/entity/table.py +3 -3
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/event.py +4 -8
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/migrate.py +2 -4
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/register_module.py +10 -11
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/rpc.py +3 -5
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/log/schema/activity.py +3 -1
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/requirements.txt +12 -12
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/test/auth/test_group_crud.py +76 -106
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/test/auth/test_permission_crud.py +73 -103
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/test/auth/test_user_crud.py +92 -122
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/test/auth/test_user_login.py +107 -134
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/test/conftest.py +2 -2
- zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/test/test_liveness_and_readiness.py +8 -15
- zrb/builtin/generator/fastapp_crud/add.py +74 -79
- zrb/builtin/generator/fastapp_crud/helper.py +51 -48
- zrb/builtin/generator/fastapp_crud/task_factory.py +17 -14
- zrb/builtin/generator/fastapp_crud/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/component/model/snake_zrb_entity_name_model.py +2 -2
- zrb/builtin/generator/fastapp_crud/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/component/repo/snake_zrb_entity_name_repo.py +3 -2
- zrb/builtin/generator/fastapp_crud/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/entity/snake_zrb_entity_name/api.py +58 -40
- zrb/builtin/generator/fastapp_crud/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/entity/snake_zrb_entity_name/model.py +7 -3
- zrb/builtin/generator/fastapp_crud/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/entity/snake_zrb_entity_name/repo.py +9 -4
- zrb/builtin/generator/fastapp_crud/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/entity/snake_zrb_entity_name/rpc.py +32 -39
- zrb/builtin/generator/fastapp_crud/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/schema/snake_zrb_entity_name.py +3 -1
- zrb/builtin/generator/fastapp_crud/template/src/kebab-zrb-app-name/test/snake_zrb_module_name/test_snake_zrb_entity_name.py +68 -98
- zrb/builtin/generator/fastapp_field/add.py +143 -85
- zrb/builtin/generator/fastapp_field/helper.py +184 -125
- zrb/builtin/generator/fastapp_module/add.py +90 -67
- zrb/builtin/generator/fastapp_module/helper.py +141 -155
- zrb/builtin/generator/fastapp_module/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/api.py +3 -2
- zrb/builtin/generator/fastapp_module/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/entity/table.py +3 -3
- zrb/builtin/generator/fastapp_module/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/event.py +3 -5
- zrb/builtin/generator/fastapp_module/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/migrate.py +2 -4
- zrb/builtin/generator/fastapp_module/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/register_module.py +10 -11
- zrb/builtin/generator/fastapp_module/template/src/kebab-zrb-app-name/src/module/snake_zrb_module_name/rpc.py +3 -5
- zrb/builtin/generator/pip_package/add.py +39 -40
- zrb/builtin/generator/pip_package/template/_automate/snake_zrb_package_name/local.py +30 -30
- zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/src/snake_zrb_package_name/__init__.py +1 -0
- zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/src/snake_zrb_package_name/__main__.py +1 -0
- zrb/builtin/generator/pip_package/template/src/kebab-zrb-package-name/src/snake_zrb_package_name/util.py +2 -2
- zrb/builtin/generator/plugin/create.py +39 -36
- zrb/builtin/generator/plugin/template/src/snake_zrb_package_name/__init__.py +1 -1
- zrb/builtin/generator/plugin/template/src/snake_zrb_package_name/__main__.py +1 -0
- zrb/builtin/generator/plugin/template/src/snake_zrb_package_name/task/example_task.py +6 -4
- zrb/builtin/generator/plugin/template/zrb_init.py +27 -27
- zrb/builtin/generator/project/create.py +38 -46
- zrb/builtin/generator/project/template/.flake8 +3 -0
- zrb/builtin/generator/project/template/project.sh +19 -10
- zrb/builtin/generator/project_task/task_factory.py +60 -61
- zrb/builtin/generator/project_task/template/_automate/_project/__init__.py +2 -2
- zrb/builtin/generator/project_task/template/_automate/_project/build_project_images.py +4 -4
- zrb/builtin/generator/project_task/template/_automate/_project/deploy_project.py +4 -4
- zrb/builtin/generator/project_task/template/_automate/_project/destroy_project.py +4 -4
- zrb/builtin/generator/project_task/template/_automate/_project/push_project_images.py +4 -4
- zrb/builtin/generator/project_task/template/_automate/_project/remove_project_containers.py +4 -4
- zrb/builtin/generator/project_task/template/_automate/_project/start_project.py +4 -4
- zrb/builtin/generator/project_task/template/_automate/_project/start_project_containers.py +4 -4
- zrb/builtin/generator/project_task/template/_automate/_project/stop_project_containers.py +4 -4
- zrb/builtin/generator/python_task/add.py +25 -33
- zrb/builtin/generator/python_task/template/_automate/snake_zrb_task_name.py +8 -7
- zrb/builtin/generator/simple_python_app/add.py +81 -75
- zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/_common.py +14 -15
- zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/container.py +46 -61
- zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/deployment.py +34 -32
- zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/image.py +19 -22
- zrb/builtin/generator/simple_python_app/template/_automate/snake_zrb_app_name/local.py +23 -25
- zrb/builtin/generator/simple_python_app/template/src/kebab-zrb-app-name/deployment/__main__.py +24 -32
- zrb/builtin/generator/simple_python_app/template/src/kebab-zrb-app-name/src/main.py +18 -14
- zrb/builtin/git.py +46 -46
- zrb/builtin/group.py +13 -34
- zrb/builtin/helper/reccuring_action.py +26 -29
- zrb/builtin/md5.py +17 -30
- zrb/builtin/process.py +19 -19
- zrb/builtin/project.py +13 -15
- zrb/builtin/say.py +69 -88
- zrb/builtin/schedule.py +15 -19
- zrb/builtin/ubuntu.py +44 -35
- zrb/builtin/update.py +5 -5
- zrb/builtin/version.py +3 -7
- zrb/builtin/watch_changes.py +24 -25
- zrb/config/config.py +19 -18
- zrb/helper/accessories/color.py +18 -6
- zrb/helper/accessories/icon.py +24 -3
- zrb/helper/accessories/name.py +120 -28
- zrb/helper/advertisement.py +9 -13
- zrb/helper/callable.py +2 -4
- zrb/helper/cli.py +27 -31
- zrb/helper/codemod/add_argument_to_function.py +3 -4
- zrb/helper/codemod/add_argument_to_function_call.py +4 -7
- zrb/helper/codemod/add_assert_resource.py +7 -7
- zrb/helper/codemod/add_function_call.py +3 -5
- zrb/helper/codemod/add_import_module.py +15 -26
- zrb/helper/codemod/add_key_value_to_dict.py +7 -10
- zrb/helper/codemod/add_property_to_class.py +10 -8
- zrb/helper/codemod/add_upstream_to_task.py +21 -33
- zrb/helper/codemod/append_code_to_function.py +6 -13
- zrb/helper/codemod/format_code.py +2 -1
- zrb/helper/default_env.py +25 -25
- zrb/helper/docker_compose/fetch_external_env.py +18 -18
- zrb/helper/docker_compose/file.py +5 -4
- zrb/helper/docstring.py +44 -47
- zrb/helper/env_map/fetch.py +7 -12
- zrb/helper/file/copy_tree.py +12 -17
- zrb/helper/file/match.py +6 -7
- zrb/helper/file/text.py +8 -6
- zrb/helper/git/detect_changes.py +9 -8
- zrb/helper/loader/load_module.py +14 -13
- zrb/helper/log.py +4 -3
- zrb/helper/map/conversion.py +4 -5
- zrb/helper/python_task.py +2 -4
- zrb/helper/render_data.py +25 -18
- zrb/helper/string/constant.py +2 -2
- zrb/helper/string/conversion.py +17 -16
- zrb/helper/string/jinja.py +2 -2
- zrb/helper/typecheck.py +6 -4
- zrb/helper/typing.py +10 -2
- zrb/helper/util.py +44 -40
- zrb/task/any_task.py +251 -251
- zrb/task/base_remote_cmd_task.py +76 -59
- zrb/task/base_task/base_task.py +95 -108
- zrb/task/base_task/component/base_task_model.py +73 -71
- zrb/task/base_task/component/common_task_model.py +42 -29
- zrb/task/base_task/component/pid_model.py +3 -5
- zrb/task/base_task/component/renderer.py +26 -36
- zrb/task/base_task/component/trackers.py +6 -9
- zrb/task/checker.py +14 -9
- zrb/task/cmd_task.py +102 -100
- zrb/task/decorator.py +19 -13
- zrb/task/docker_compose_task.py +127 -98
- zrb/task/flow_task.py +16 -19
- zrb/task/http_checker.py +40 -36
- zrb/task/notifier.py +50 -38
- zrb/task/parallel.py +3 -3
- zrb/task/path_checker.py +34 -27
- zrb/task/path_watcher.py +49 -40
- zrb/task/port_checker.py +33 -26
- zrb/task/recurring_task.py +36 -42
- zrb/task/remote_cmd_task.py +31 -28
- zrb/task/resource_maker.py +66 -52
- zrb/task/rsync_task.py +24 -21
- zrb/task/task.py +4 -3
- zrb/task/time_watcher.py +36 -31
- zrb/task_env/constant.py +1 -1
- zrb/task_env/env.py +33 -31
- zrb/task_env/env_file.py +24 -23
- zrb/task_group/group.py +27 -30
- zrb/task_input/any_input.py +18 -16
- zrb/task_input/base_input.py +26 -26
- zrb/task_input/bool_input.py +6 -6
- zrb/task_input/choice_input.py +11 -9
- zrb/task_input/constant.py +1 -1
- zrb/task_input/float_input.py +6 -5
- zrb/task_input/int_input.py +8 -8
- zrb/task_input/password_input.py +9 -9
- zrb/task_input/str_input.py +8 -8
- zrb/task_input/task_input.py +4 -2
- {zrb-0.6.0.dist-info → zrb-0.6.1.dist-info}/METADATA +3 -1
- {zrb-0.6.0.dist-info → zrb-0.6.1.dist-info}/RECORD +316 -315
- {zrb-0.6.0.dist-info → zrb-0.6.1.dist-info}/LICENSE +0 -0
- {zrb-0.6.0.dist-info → zrb-0.6.1.dist-info}/WHEEL +0 -0
- {zrb-0.6.0.dist-info → zrb-0.6.1.dist-info}/entry_points.txt +0 -0
zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/user/api.py
CHANGED
@@ -1,17 +1,16 @@
|
|
1
|
-
from typing import Annotated, List, Mapping
|
2
|
-
from fastapi import FastAPI, Depends
|
3
|
-
from fastapi.security import OAuth2PasswordRequestForm
|
4
1
|
from logging import Logger
|
2
|
+
from typing import Annotated, List, Mapping
|
3
|
+
|
4
|
+
from core.error import HTTPAPIException
|
5
5
|
from core.messagebus import Publisher
|
6
6
|
from core.rpc import Caller
|
7
|
-
from
|
7
|
+
from fastapi import Depends, FastAPI
|
8
|
+
from fastapi.security import OAuth2PasswordRequestForm
|
9
|
+
from module.auth.component import access_token_scheme, bearer_token_scheme
|
8
10
|
from module.auth.core import Authorizer
|
9
|
-
from module.auth.schema.
|
10
|
-
User, UserData, UserResult, UserLogin
|
11
|
-
)
|
11
|
+
from module.auth.schema.request import IsAuthorizedRequest, RefreshTokenRequest
|
12
12
|
from module.auth.schema.token import AccessTokenData, TokenResponse
|
13
|
-
from module.auth.schema.
|
14
|
-
from module.auth.component import access_token_scheme, bearer_token_scheme
|
13
|
+
from module.auth.schema.user import User, UserData, UserLogin, UserResult
|
15
14
|
|
16
15
|
|
17
16
|
def register_auth_api(
|
@@ -19,59 +18,55 @@ def register_auth_api(
|
|
19
18
|
app: FastAPI,
|
20
19
|
authorizer: Authorizer,
|
21
20
|
rpc_caller: Caller,
|
22
|
-
publisher: Publisher
|
21
|
+
publisher: Publisher,
|
23
22
|
):
|
24
23
|
logger.info('🥪 Register Login API for "auth.user"')
|
25
24
|
|
26
|
-
@app.post(
|
25
|
+
@app.post("/api/v1/auth/login-oauth", response_model=TokenResponse)
|
27
26
|
async def login_oauth(
|
28
27
|
form_data: Annotated[OAuth2PasswordRequestForm, Depends()]
|
29
28
|
) -> TokenResponse:
|
30
|
-
data = UserLogin(
|
31
|
-
identity=form_data.username,
|
32
|
-
password=form_data.password
|
33
|
-
)
|
29
|
+
data = UserLogin(identity=form_data.username, password=form_data.password)
|
34
30
|
return await _create_token(data=data)
|
35
31
|
|
36
|
-
@app.post(
|
32
|
+
@app.post("/api/v1/auth/login", response_model=TokenResponse)
|
37
33
|
async def login(data: UserLogin) -> TokenResponse:
|
38
34
|
return await _create_token(data=data)
|
39
35
|
|
40
36
|
async def _create_token(data: UserLogin) -> TokenResponse:
|
41
37
|
try:
|
42
38
|
token_response_dict = await rpc_caller.call(
|
43
|
-
|
39
|
+
"auth_create_token", login_data=data.model_dump()
|
44
40
|
)
|
45
41
|
return TokenResponse(**token_response_dict)
|
46
42
|
except Exception as e:
|
47
43
|
raise HTTPAPIException(error=e)
|
48
44
|
|
49
|
-
@app.post(
|
45
|
+
@app.post("/api/v1/auth/refresh-token", response_model=TokenResponse)
|
50
46
|
async def refresh_token(
|
51
|
-
data: RefreshTokenRequest,
|
52
|
-
refresh_token: str = Depends(bearer_token_scheme)
|
47
|
+
data: RefreshTokenRequest, refresh_token: str = Depends(bearer_token_scheme)
|
53
48
|
) -> TokenResponse:
|
54
49
|
try:
|
55
50
|
token_response_dict = await rpc_caller.call(
|
56
|
-
|
51
|
+
"auth_refresh_token",
|
57
52
|
refresh_token=refresh_token,
|
58
|
-
access_token=data.access_token
|
53
|
+
access_token=data.access_token,
|
59
54
|
)
|
60
55
|
return TokenResponse(**token_response_dict)
|
61
56
|
except Exception as e:
|
62
57
|
raise HTTPAPIException(error=e)
|
63
58
|
|
64
|
-
@app.post(
|
59
|
+
@app.post("/api/v1/auth/is-authorized", response_model=Mapping[str, bool])
|
65
60
|
async def is_authorized(
|
66
61
|
data: IsAuthorizedRequest,
|
67
|
-
user_token_data: AccessTokenData = Depends(access_token_scheme)
|
62
|
+
user_token_data: AccessTokenData = Depends(access_token_scheme),
|
68
63
|
) -> Mapping[str, str]:
|
69
64
|
try:
|
70
65
|
user_id = user_token_data.user_id
|
71
66
|
return await rpc_caller.call(
|
72
|
-
|
67
|
+
"auth_is_user_authorized",
|
73
68
|
id=user_id,
|
74
|
-
permission_name=data.permission_names
|
69
|
+
permission_name=data.permission_names,
|
75
70
|
)
|
76
71
|
except Exception as e:
|
77
72
|
raise HTTPAPIException(error=e)
|
@@ -82,109 +77,102 @@ def register_api(
|
|
82
77
|
app: FastAPI,
|
83
78
|
authorizer: Authorizer,
|
84
79
|
rpc_caller: Caller,
|
85
|
-
publisher: Publisher
|
80
|
+
publisher: Publisher,
|
86
81
|
):
|
87
82
|
logger.info('🥪 Register API for "auth.user"')
|
88
83
|
|
89
|
-
@app.get(
|
90
|
-
'/api/v1/auth/users', response_model=UserResult
|
91
|
-
)
|
84
|
+
@app.get("/api/v1/auth/users", response_model=UserResult)
|
92
85
|
async def get_users(
|
93
|
-
keyword: str =
|
94
|
-
|
86
|
+
keyword: str = "",
|
87
|
+
limit: int = 100,
|
88
|
+
offset: int = 0,
|
89
|
+
user_token_data: AccessTokenData = Depends(access_token_scheme),
|
95
90
|
):
|
96
91
|
if not await authorizer.is_having_permission(
|
97
|
-
user_token_data.user_id,
|
92
|
+
user_token_data.user_id, "auth:user:get"
|
98
93
|
):
|
99
|
-
raise HTTPAPIException(403,
|
94
|
+
raise HTTPAPIException(403, "Unauthorized")
|
100
95
|
try:
|
101
96
|
result_dict = await rpc_caller.call(
|
102
|
-
|
97
|
+
"auth_get_user",
|
103
98
|
keyword=keyword,
|
104
99
|
criterion={},
|
105
100
|
limit=limit,
|
106
101
|
offset=offset,
|
107
|
-
user_token_data=user_token_data.
|
102
|
+
user_token_data=user_token_data.model_dump(),
|
108
103
|
)
|
109
104
|
return UserResult(**result_dict)
|
110
105
|
except Exception as e:
|
111
106
|
raise HTTPAPIException(error=e)
|
112
107
|
|
113
|
-
@app.get(
|
114
|
-
'/api/v1/auth/users/{id}', response_model=User
|
115
|
-
)
|
108
|
+
@app.get("/api/v1/auth/users/{id}", response_model=User)
|
116
109
|
async def get_user_by_id(
|
117
|
-
id: str,
|
118
|
-
user_token_data: AccessTokenData = Depends(access_token_scheme)
|
110
|
+
id: str, user_token_data: AccessTokenData = Depends(access_token_scheme)
|
119
111
|
):
|
120
112
|
if not await authorizer.is_having_permission(
|
121
|
-
user_token_data.user_id,
|
113
|
+
user_token_data.user_id, "auth:user:get_by_id"
|
122
114
|
):
|
123
|
-
raise HTTPAPIException(403,
|
115
|
+
raise HTTPAPIException(403, "Unauthorized")
|
124
116
|
try:
|
125
117
|
result_dict = await rpc_caller.call(
|
126
|
-
|
127
|
-
id=id,
|
118
|
+
"auth_get_user_by_id",
|
119
|
+
id=id,
|
120
|
+
user_token_data=user_token_data.model_dump(),
|
128
121
|
)
|
129
122
|
return User(**result_dict)
|
130
123
|
except Exception as e:
|
131
124
|
raise HTTPAPIException(error=e)
|
132
125
|
|
133
|
-
@app.post(
|
134
|
-
'/api/v1/auth/users', response_model=User
|
135
|
-
)
|
126
|
+
@app.post("/api/v1/auth/users", response_model=User)
|
136
127
|
async def insert_user(
|
137
|
-
data: UserData,
|
138
|
-
user_token_data: AccessTokenData = Depends(access_token_scheme)
|
128
|
+
data: UserData, user_token_data: AccessTokenData = Depends(access_token_scheme)
|
139
129
|
):
|
140
130
|
if not await authorizer.is_having_permission(
|
141
|
-
user_token_data.user_id,
|
131
|
+
user_token_data.user_id, "auth:user:insert"
|
142
132
|
):
|
143
|
-
raise HTTPAPIException(403,
|
133
|
+
raise HTTPAPIException(403, "Unauthorized")
|
144
134
|
try:
|
145
135
|
result_dict = await rpc_caller.call(
|
146
|
-
|
147
|
-
data=data.
|
136
|
+
"auth_insert_user",
|
137
|
+
data=data.model_dump(),
|
138
|
+
user_token_data=user_token_data.model_dump(),
|
148
139
|
)
|
149
140
|
return User(**result_dict)
|
150
141
|
except Exception as e:
|
151
142
|
raise HTTPAPIException(error=e)
|
152
143
|
|
153
|
-
@app.put(
|
154
|
-
'/api/v1/auth/users/{id}', response_model=User
|
155
|
-
)
|
144
|
+
@app.put("/api/v1/auth/users/{id}", response_model=User)
|
156
145
|
async def update_user(
|
157
|
-
id: str,
|
158
|
-
|
146
|
+
id: str,
|
147
|
+
data: UserData,
|
148
|
+
user_token_data: AccessTokenData = Depends(access_token_scheme),
|
159
149
|
):
|
160
150
|
if not await authorizer.is_having_permission(
|
161
|
-
user_token_data.user_id,
|
151
|
+
user_token_data.user_id, "auth:user:update"
|
162
152
|
):
|
163
|
-
raise HTTPAPIException(403,
|
153
|
+
raise HTTPAPIException(403, "Unauthorized")
|
164
154
|
try:
|
165
155
|
result_dict = await rpc_caller.call(
|
166
|
-
|
167
|
-
id=id,
|
156
|
+
"auth_update_user",
|
157
|
+
id=id,
|
158
|
+
data=data.model_dump(),
|
159
|
+
user_token_data=user_token_data.model_dump(),
|
168
160
|
)
|
169
161
|
return User(**result_dict)
|
170
162
|
except Exception as e:
|
171
163
|
raise HTTPAPIException(error=e)
|
172
164
|
|
173
|
-
@app.delete(
|
174
|
-
'/api/v1/auth/users/{id}', response_model=User
|
175
|
-
)
|
165
|
+
@app.delete("/api/v1/auth/users/{id}", response_model=User)
|
176
166
|
async def delete_user(
|
177
|
-
id: str,
|
178
|
-
user_token_data: AccessTokenData = Depends(access_token_scheme)
|
167
|
+
id: str, user_token_data: AccessTokenData = Depends(access_token_scheme)
|
179
168
|
):
|
180
169
|
if not await authorizer.is_having_permission(
|
181
|
-
user_token_data.user_id,
|
170
|
+
user_token_data.user_id, "auth:user:delete"
|
182
171
|
):
|
183
|
-
raise HTTPAPIException(403,
|
172
|
+
raise HTTPAPIException(403, "Unauthorized")
|
184
173
|
try:
|
185
174
|
result_dict = await rpc_caller.call(
|
186
|
-
|
187
|
-
id=id, user_token_data=user_token_data.dict()
|
175
|
+
"auth_delete_user", id=id, user_token_data=user_token_data.model_dump()
|
188
176
|
)
|
189
177
|
return User(**result_dict)
|
190
178
|
except Exception as e:
|
zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/user/model.py
CHANGED
@@ -1,22 +1,17 @@
|
|
1
|
-
from typing import
|
1
|
+
from typing import List, Mapping, Optional
|
2
|
+
|
2
3
|
from core.messagebus.messagebus import Publisher
|
3
|
-
from module.log.core.historical_repo_model import HistoricalRepoModel
|
4
|
-
from module.auth.schema.user import (
|
5
|
-
User, UserData, UserResult, UserLogin
|
6
|
-
)
|
7
|
-
from module.auth.entity.user.repo import UserRepo
|
8
|
-
from module.auth.schema.token import (
|
9
|
-
AccessTokenData, RefreshTokenData, TokenResponse
|
10
|
-
)
|
11
4
|
from module.auth.core import AccessTokenUtil, RefreshTokenUtil
|
12
5
|
from module.auth.entity.permission.model import PermissionModel
|
6
|
+
from module.auth.entity.user.repo import UserRepo
|
7
|
+
from module.auth.schema.token import AccessTokenData, RefreshTokenData, TokenResponse
|
8
|
+
from module.auth.schema.user import User, UserData, UserLogin, UserResult
|
9
|
+
from module.log.core.historical_repo_model import HistoricalRepoModel
|
13
10
|
|
14
11
|
|
15
|
-
class UserModel(
|
16
|
-
HistoricalRepoModel[User, UserData, UserResult]
|
17
|
-
):
|
12
|
+
class UserModel(HistoricalRepoModel[User, UserData, UserResult]):
|
18
13
|
schema_result_cls = UserResult
|
19
|
-
log_entity_name =
|
14
|
+
log_entity_name = "user"
|
20
15
|
|
21
16
|
def __init__(
|
22
17
|
self,
|
@@ -24,12 +19,12 @@ class UserModel(
|
|
24
19
|
publisher: Publisher,
|
25
20
|
permission_model: PermissionModel,
|
26
21
|
access_token_util: AccessTokenUtil,
|
27
|
-
access_token_expire_seconds: int,
|
22
|
+
access_token_expire_seconds: int | float,
|
28
23
|
refresh_token_util: RefreshTokenUtil,
|
29
|
-
refresh_token_expire_seconds: int,
|
24
|
+
refresh_token_expire_seconds: int | float,
|
30
25
|
guest_user: User,
|
31
26
|
admin_user: Optional[User] = None,
|
32
|
-
admin_user_password: str =
|
27
|
+
admin_user_password: str = "",
|
33
28
|
):
|
34
29
|
super().__init__(repo, publisher)
|
35
30
|
self.permission_model = permission_model
|
@@ -42,48 +37,29 @@ class UserModel(
|
|
42
37
|
self.admin_user_pasword = admin_user_password
|
43
38
|
|
44
39
|
async def insert(self, data: UserData) -> User:
|
45
|
-
if
|
46
|
-
|
47
|
-
data.username == self.admin_user.username
|
48
|
-
):
|
49
|
-
raise ValueError(
|
50
|
-
f'Invalid username: {data.username} is used by admin'
|
51
|
-
)
|
40
|
+
if self.admin_user is not None and data.username == self.admin_user.username:
|
41
|
+
raise ValueError(f"Invalid username: {data.username} is used by admin")
|
52
42
|
if data.username == self.guest_user.username:
|
53
|
-
raise ValueError(
|
54
|
-
f'Invalid username: {data.username} is used by guest'
|
55
|
-
)
|
43
|
+
raise ValueError(f"Invalid username: {data.username} is used by guest")
|
56
44
|
return await super().insert(data)
|
57
45
|
|
58
46
|
async def update(self, id: str, data: UserData) -> User:
|
59
47
|
if self.admin_user is not None:
|
60
48
|
if self.is_admin(id):
|
61
|
-
raise ValueError(
|
62
|
-
'Forbidden: editting admin user is not permitted'
|
63
|
-
)
|
49
|
+
raise ValueError("Forbidden: editting admin user is not permitted")
|
64
50
|
if data.username == self.admin_user.username:
|
65
|
-
raise ValueError(
|
66
|
-
f'Invalid username: {data.username} is used by admin'
|
67
|
-
)
|
51
|
+
raise ValueError(f"Invalid username: {data.username} is used by admin")
|
68
52
|
if self.is_guest(id):
|
69
|
-
raise ValueError(
|
70
|
-
'Forbidden: editting guest user is not permitted'
|
71
|
-
)
|
53
|
+
raise ValueError("Forbidden: editting guest user is not permitted")
|
72
54
|
if data.username == self.guest_user.username:
|
73
|
-
raise ValueError(
|
74
|
-
f'Invalid username: {data.username} is used by guest'
|
75
|
-
)
|
55
|
+
raise ValueError(f"Invalid username: {data.username} is used by guest")
|
76
56
|
return await super().update(id, data)
|
77
57
|
|
78
58
|
async def delete(self, id: str) -> User:
|
79
59
|
if self.admin_user is not None and self.is_admin(id):
|
80
|
-
raise ValueError(
|
81
|
-
'Forbidden: deleting admin user is not permitted'
|
82
|
-
)
|
60
|
+
raise ValueError("Forbidden: deleting admin user is not permitted")
|
83
61
|
if self.is_guest(id):
|
84
|
-
raise ValueError(
|
85
|
-
'Forbidden: deleting guest user is not permitted'
|
86
|
-
)
|
62
|
+
raise ValueError("Forbidden: deleting guest user is not permitted")
|
87
63
|
return await super().delete(id)
|
88
64
|
|
89
65
|
async def get_by_id(self, id: str) -> User:
|
@@ -98,9 +74,7 @@ class UserModel(
|
|
98
74
|
) -> Mapping[str, bool]:
|
99
75
|
user = await self.get_by_id(id)
|
100
76
|
if self.is_admin(user.id):
|
101
|
-
return {
|
102
|
-
permission_name: True for permission_name in permission_names
|
103
|
-
}
|
77
|
+
return {permission_name: True for permission_name in permission_names}
|
104
78
|
user_permission_names = self._get_permission_names(user)
|
105
79
|
return {
|
106
80
|
permission_name: permission_name in user_permission_names
|
@@ -108,9 +82,7 @@ class UserModel(
|
|
108
82
|
}
|
109
83
|
|
110
84
|
def _get_permission_names(self, user: User) -> List[str]:
|
111
|
-
permission_names = [
|
112
|
-
permission.name for permission in user.permissions
|
113
|
-
]
|
85
|
+
permission_names = [permission.name for permission in user.permissions]
|
114
86
|
for group in user.groups:
|
115
87
|
additional_permission_names = [
|
116
88
|
permission.name
|
@@ -133,7 +105,7 @@ class UserModel(
|
|
133
105
|
return TokenResponse(
|
134
106
|
access_token=self._get_access_token(user),
|
135
107
|
refresh_token=self._get_refresh_token(user),
|
136
|
-
token_type=
|
108
|
+
token_type="bearer",
|
137
109
|
)
|
138
110
|
|
139
111
|
async def refresh_auth_token(
|
@@ -144,39 +116,38 @@ class UserModel(
|
|
144
116
|
)
|
145
117
|
refresh_token_data = self.refresh_token_util.decode(refresh_token)
|
146
118
|
if access_token_data.user_id != refresh_token_data.user_id:
|
147
|
-
raise ValueError(
|
119
|
+
raise ValueError("Unmatch refresh and access token")
|
148
120
|
user = await self.get_by_id(refresh_token_data.user_id)
|
149
121
|
return TokenResponse(
|
150
122
|
access_token=self._get_access_token(user),
|
151
123
|
refresh_token=self._get_refresh_token(user),
|
152
|
-
token_type=
|
124
|
+
token_type="bearer",
|
153
125
|
)
|
154
126
|
|
155
127
|
def _get_access_token(self, user: User) -> str:
|
156
128
|
access_token_data = AccessTokenData(
|
157
129
|
user_id=user.id,
|
158
130
|
username=user.username,
|
159
|
-
expire_seconds=self.access_token_expire_seconds
|
131
|
+
expire_seconds=self.access_token_expire_seconds,
|
160
132
|
)
|
161
133
|
return self.access_token_util.encode(access_token_data)
|
162
134
|
|
163
135
|
def _get_refresh_token(self, user: User) -> str:
|
164
136
|
refresh_token_data = RefreshTokenData(
|
165
|
-
user_id=user.id,
|
166
|
-
expire_seconds=self.refresh_token_expire_seconds
|
137
|
+
user_id=user.id, expire_seconds=self.refresh_token_expire_seconds
|
167
138
|
)
|
168
139
|
return self.refresh_token_util.encode(refresh_token_data)
|
169
140
|
|
170
141
|
async def _get_user_by_user_login(self, user_login: UserLogin) -> User:
|
171
|
-
if user_login.identity ==
|
172
|
-
raise ValueError(
|
142
|
+
if user_login.identity == "":
|
143
|
+
raise ValueError("Invalid identity: Identity is empty")
|
173
144
|
if (
|
174
145
|
self.admin_user is not None
|
175
146
|
and user_login.password == self.admin_user_pasword
|
176
147
|
and (
|
177
|
-
user_login.identity == self.admin_user.username
|
178
|
-
user_login.identity == self.admin_user.email
|
179
|
-
user_login.identity == self.admin_user.phone
|
148
|
+
user_login.identity == self.admin_user.username
|
149
|
+
or user_login.identity == self.admin_user.email
|
150
|
+
or user_login.identity == self.admin_user.phone
|
180
151
|
)
|
181
152
|
):
|
182
153
|
return self.admin_user
|
zrb/builtin/generator/fastapp/template/src/kebab-zrb-app-name/src/module/auth/entity/user/repo.py
CHANGED
@@ -1,34 +1,32 @@
|
|
1
|
-
|
1
|
+
import logging
|
2
2
|
from abc import ABC, abstractmethod
|
3
|
-
from
|
4
|
-
|
5
|
-
from
|
6
|
-
from core.repo import Repo, DBEntityMixin, DBRepo
|
7
|
-
from module.auth.schema.user import User, UserData, UserLogin
|
8
|
-
from module.auth.core import PasswordHasher
|
3
|
+
from typing import Any, List, Mapping
|
4
|
+
|
5
|
+
from core.repo import DBEntityMixin, DBRepo, Repo
|
9
6
|
from module.auth.component import Base
|
10
|
-
from module.auth.
|
11
|
-
from module.auth.entity.permission.repo import DBEntityPermission
|
7
|
+
from module.auth.core import PasswordHasher
|
12
8
|
from module.auth.entity.group.repo import DBEntityGroup
|
13
|
-
|
14
|
-
import
|
9
|
+
from module.auth.entity.permission.repo import DBEntityPermission
|
10
|
+
from module.auth.entity.table import user_group, user_permission
|
11
|
+
from module.auth.schema.user import User, UserData, UserLogin
|
12
|
+
from sqlalchemy import Column, String, or_
|
13
|
+
from sqlalchemy.engine import Engine
|
14
|
+
from sqlalchemy.orm import Session, relationship
|
15
15
|
|
16
16
|
|
17
17
|
class DBEntityUser(Base, DBEntityMixin):
|
18
|
+
class Config:
|
19
|
+
orm_mode = True
|
20
|
+
from_attributes = True
|
21
|
+
|
18
22
|
__tablename__ = "users"
|
19
23
|
username = Column(String)
|
20
24
|
phone = Column(String)
|
21
25
|
email = Column(String)
|
22
26
|
description = Column(String)
|
23
27
|
hashed_password = Column(String)
|
24
|
-
permissions = relationship(
|
25
|
-
|
26
|
-
secondary=user_permission
|
27
|
-
)
|
28
|
-
groups = relationship(
|
29
|
-
"DBEntityGroup",
|
30
|
-
secondary=user_group
|
31
|
-
)
|
28
|
+
permissions = relationship("DBEntityPermission", secondary=user_permission)
|
29
|
+
groups = relationship("DBEntityGroup", secondary=user_group)
|
32
30
|
|
33
31
|
|
34
32
|
class UserRepo(Repo[User, UserData], ABC):
|
@@ -37,17 +35,12 @@ class UserRepo(Repo[User, UserData], ABC):
|
|
37
35
|
pass
|
38
36
|
|
39
37
|
|
40
|
-
class UserDBRepo(
|
41
|
-
DBRepo[User, UserData], UserRepo
|
42
|
-
):
|
38
|
+
class UserDBRepo(DBRepo[User, UserData], UserRepo):
|
43
39
|
schema_cls = User
|
44
40
|
db_entity_cls = DBEntityUser
|
45
41
|
|
46
42
|
def __init__(
|
47
|
-
self,
|
48
|
-
logger: logging.Logger,
|
49
|
-
engine: Engine,
|
50
|
-
password_hasher: PasswordHasher
|
43
|
+
self, logger: logging.Logger, engine: Engine, password_hasher: PasswordHasher
|
51
44
|
):
|
52
45
|
super().__init__(logger, engine)
|
53
46
|
self.password_hasher = password_hasher
|
@@ -59,7 +52,7 @@ class UserDBRepo(
|
|
59
52
|
search_filter = or_(
|
60
53
|
DBEntityUser.username == user_login.identity,
|
61
54
|
DBEntityUser.phone == user_login.identity,
|
62
|
-
DBEntityUser.email == user_login.identity
|
55
|
+
DBEntityUser.email == user_login.identity,
|
63
56
|
)
|
64
57
|
db_users = [
|
65
58
|
db_user
|
@@ -69,7 +62,7 @@ class UserDBRepo(
|
|
69
62
|
)
|
70
63
|
]
|
71
64
|
if len(db_users) == 0:
|
72
|
-
raise ValueError(
|
65
|
+
raise ValueError("Not found: Cannot find any user")
|
73
66
|
return self._db_entity_to_schema(db, db_users[0])
|
74
67
|
finally:
|
75
68
|
db.close()
|
@@ -79,16 +72,20 @@ class UserDBRepo(
|
|
79
72
|
) -> Mapping[str, Any]:
|
80
73
|
db_entity_map = super()._schema_data_to_db_entity_map(db, user_data)
|
81
74
|
# Transform permissions
|
82
|
-
db_entity_map[
|
83
|
-
|
84
|
-
|
75
|
+
db_entity_map["permissions"] = (
|
76
|
+
db.query(DBEntityPermission)
|
77
|
+
.filter(DBEntityPermission.id.in_(user_data.permissions))
|
78
|
+
.all()
|
79
|
+
)
|
85
80
|
# Transform groups
|
86
|
-
db_entity_map[
|
87
|
-
DBEntityGroup.id.in_(user_data.groups)
|
88
|
-
)
|
81
|
+
db_entity_map["groups"] = (
|
82
|
+
db.query(DBEntityGroup).filter(DBEntityGroup.id.in_(user_data.groups)).all()
|
83
|
+
)
|
89
84
|
# add hashed password if necessary
|
90
|
-
if user_data.password !=
|
91
|
-
db_entity_map[
|
85
|
+
if user_data.password != "":
|
86
|
+
db_entity_map[
|
87
|
+
"hashed_password"
|
88
|
+
] = self.password_hasher.hash_password( # noqa
|
92
89
|
user_data.password
|
93
90
|
)
|
94
91
|
return db_entity_map
|