geek-cafe-saas-sdk 0.42.0__tar.gz → 0.52.0__tar.gz
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.
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/.gitignore +1 -1
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/PKG-INFO +1 -1
- geek_cafe_saas_sdk-0.52.0/activate.sh +12 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/pyproject.toml +1 -1
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/pysetup.py +13 -1
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/__init__.py +1 -1
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/audit/audit_log_model.py +1 -1
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/services/database_service.py +117 -110
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/lambda_handlers/_base/base_handler.py +78 -1
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/lambda_handlers/_base/decorators.py +1 -1
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/lambda_handlers/_base/lambda_event.py +86 -12
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/communities/services/community_service.py +9 -5
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/events/models/event_attendee.py +3 -4
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/events/services/event_attendee_service.py +91 -16
- geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/__init__.py +45 -0
- geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/handlers/__init__.py +13 -0
- geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/handlers/get_status/__init__.py +10 -0
- geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/handlers/get_status/app.py +61 -0
- geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/handlers/workflow_step_handler.py +358 -0
- geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/models/__init__.py +31 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/executions/models/execution.py +44 -1
- geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/models/execution_history.py +380 -0
- geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/models/execution_metrics.py +259 -0
- geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/models/execution_metrics_summary.py +355 -0
- geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/models/step_messages.py +263 -0
- geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/models/throttle_config.py +348 -0
- geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/models/workflow_step.py +462 -0
- geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/services/__init__.py +36 -0
- geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/services/execution_history_service.py +522 -0
- geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/services/execution_metrics_service.py +472 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/executions/services/execution_service.py +224 -1
- geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/services/step_dispatch_service.py +446 -0
- geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/services/throttle_config_service.py +301 -0
- geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/services/throttle_service.py +338 -0
- geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/services/workflow_step_service.py +596 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/feature_flags/models/feature_flag.py +1 -1
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/handlers/generate_download_url/app.py +13 -2
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/handlers/lineage/download_bundle/app.py +6 -11
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/handlers/lineage/prepare_bundle/app.py +6 -11
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/handlers/stream/app.py +3 -1
- geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/file_system/handlers/unarchive/__init__.py +4 -0
- geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/file_system/handlers/unarchive/app.py +69 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/models/directory.py +1 -1
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/models/file.py +1 -1
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/services/directory_service.py +3 -3
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/services/file_system_service.py +161 -5
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/messaging/services/chat_channel_service.py +9 -5
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/messaging/services/chat_message_service.py +3 -1
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/messaging/services/contact_thread_service.py +4 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/notifications/models/notification.py +1 -1
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/notifications/models/notification_preference.py +1 -1
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/notifications/models/webhook_subscription.py +1 -1
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/payments/models/billing_account.py +2 -2
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/payments/models/payment.py +2 -2
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/payments/models/payment_intent_ref.py +2 -2
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/payments/models/refund.py +1 -1
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/projects/models/project.py +1 -1
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/projects/services/activity_service.py +1 -1
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/resource_shares/models/resource_share.py +102 -10
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/resource_shares/services/resource_share_service.py +338 -3
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/subscriptions/models/addon.py +1 -1
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/subscriptions/models/discount.py +1 -1
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/subscriptions/models/plan.py +1 -1
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/subscriptions/models/usage_record.py +1 -1
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/subscriptions/services/subscription_manager_service.py +3 -3
- geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/tenancy/models/__init__.py +8 -0
- geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/tenancy/models/tenant_privacy_settings.py +205 -0
- geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/tenancy/models/tenant_sharing_settings.py +246 -0
- geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/tenancy/services/__init__.py +8 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/tenancy/services/subscription_service.py +1 -1
- geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/tenancy/services/tenant_privacy_settings_service.py +217 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/tenancy/services/tenant_service.py +1 -1
- geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/tenancy/services/tenant_sharing_settings_service.py +287 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/users/models/user.py +25 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/users/services/resource_permission_service.py +3 -3
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/users/services/user_service.py +288 -97
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/voting/services/vote_service.py +4 -4
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/utilities/case_conversion.py +129 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/utilities/lambda_event_utility.py +33 -5
- geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/executions/__init__.py +0 -19
- geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/executions/handlers/__init__.py +0 -6
- geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/executions/models/__init__.py +0 -14
- geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/executions/services/__init__.py +0 -12
- geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/tenancy/models/__init__.py +0 -6
- geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/tenancy/services/__init__.py +0 -6
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/.env.mock +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/.windsurf/rules/cascade.yaml +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/ARCHITECTURE.md +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/CHANGELOG.md +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/CHANGELOG_0.4.1.md +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/CONFIG.md +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/LICENSE +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/QUICK_CONFIG_REFERENCE.md +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/README.md +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/SERVICE_FIX_PATTERNS.md +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/TEST_FAILURE_ANALYSIS.md +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/coverage.json +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/examples/decorator_pattern_handlers.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/examples/factory_authorization_example.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/examples/file_lineage_example.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/examples/hierarchical_routing_handler_example.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/examples/lambda_event_logging_example.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/examples/lambda_handler_examples.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/examples/lambda_handlers/api_key_example.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/examples/website_analytics_example.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/lambda_handlers/auth/confirm_forgot_password/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/lambda_handlers/auth/forgot_password/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/lambda_handlers/users/change_password/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/lambda_handlers/users/reset_password/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/publish_to_pypi.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/publish_to_pypi.sh +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/pysetup.sh +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/requirements.dev.txt +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/requirements.txt +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/run_unit_tests.sh +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/scripts/migrate_tests_auto_extraction.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/access/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/access/access_checker.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/access/resource_share_checker.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/anonymous_context.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/audit/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/audit/audit_event.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/audit/audit_logger_factory.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/audit/audit_logger_protocol.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/audit/composite_audit_logger.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/audit/dynamodb_audit_logger.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/audit/noop_audit_logger.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/audit/s3_audit_logger.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/audit_mixin.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/chaos_config.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/connection_pool.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/error_codes.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/field_transformer.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/handlers/resource_meta/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/model_field_validator.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/models/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/models/base_async_event_model.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/models/base_model.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/models/base_tenant_model.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/models/base_tenant_user_model.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/models/base_user_model.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/models/keyword_search.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/models/resource_meta_entry.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/request_context.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/role_mapper.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/service_errors.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/service_interfaces.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/service_result.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/services/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/services/feature_flag_service.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/services/keyword_search_service.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/services/lambda_service_factory.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/services/resource_meta_entry_service.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/services_container.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/system_request_context.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/tenant_settings.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/validation_result.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/decorators/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/decorators/auth.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/decorators/core.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/lambda_handlers/README.md +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/lambda_handlers/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/lambda_handlers/_base/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/lambda_handlers/_base/api_key_handler.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/lambda_handlers/_base/authorized_secure_handler.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/lambda_handlers/_base/environment_loader.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/lambda_handlers/_base/handler_factory.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/lambda_handlers/_base/public_handler.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/lambda_handlers/_base/secure_handler.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/lambda_handlers/_base/service_pool.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/middleware/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/middleware/auth.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/middleware/authorization.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/middleware/cors.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/middleware/error_handling.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/middleware/validation.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/analytics/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/analytics/handlers/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/analytics/models/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/analytics/models/website_analytics.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/analytics/models/website_analytics_summary.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/analytics/services/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/analytics/services/website_analytics_service.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/analytics/services/website_analytics_summary_service.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/analytics/services/website_analytics_tally_service.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/communities/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/communities/handlers/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/communities/handlers/communities/create/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/communities/handlers/communities/delete/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/communities/handlers/communities/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/communities/handlers/communities/list/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/communities/handlers/communities/update/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/communities/models/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/communities/models/community.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/communities/models/community_member.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/communities/services/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/communities/services/community_member_service.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/events/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/events/handlers/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/events/handlers/attendees/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/events/handlers/cancel/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/events/handlers/check_in/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/events/handlers/create/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/events/handlers/delete/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/events/handlers/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/events/handlers/invite/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/events/handlers/list/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/events/handlers/publish/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/events/handlers/rsvp/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/events/handlers/update/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/events/models/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/events/models/event.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/events/models/host_user_relationship.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/events/services/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/events/services/event_service.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/events/services/event_service_lambda_factory.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/events/services/host_user_relationship_service.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/executions/handlers/create/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/executions/handlers/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/executions/handlers/list/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/executions/handlers/update/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/feature_flags/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/feature_flags/models/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/feature_flags/services/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/feature_flags/services/feature_flag_service.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/handlers/README.md +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/handlers/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/handlers/archive/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/handlers/create/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/handlers/delete/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/handlers/directories/create/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/handlers/directories/delete/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/handlers/directories/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/handlers/directories/list/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/handlers/directories/move/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/handlers/download/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/handlers/generate_upload_url/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/handlers/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/handlers/lineage/create_derived/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/handlers/lineage/get_lineage/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/handlers/list/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/handlers/meta/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/handlers/process_upload_event/DEPLOYMENT_EXAMPLES.md +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/handlers/process_upload_event/README.md +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/handlers/process_upload_event/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/handlers/share/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/handlers/shares/list/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/handlers/shares/revoke/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/handlers/update/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/models/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/models/file_version.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/services/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/services/file_share_service.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/services/s3_event_parser.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/services/s3_file_service.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/file_system/services/s3_path_service.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/messaging/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/messaging/handlers/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/messaging/handlers/chat_channels/create/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/messaging/handlers/chat_channels/delete/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/messaging/handlers/chat_channels/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/messaging/handlers/chat_channels/list/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/messaging/handlers/chat_channels/update/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/messaging/handlers/chat_messages/create/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/messaging/handlers/chat_messages/delete/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/messaging/handlers/chat_messages/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/messaging/handlers/chat_messages/list/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/messaging/handlers/chat_messages/update/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/messaging/handlers/contact_threads/create/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/messaging/handlers/contact_threads/delete/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/messaging/handlers/contact_threads/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/messaging/handlers/contact_threads/list/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/messaging/handlers/contact_threads/update/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/messaging/models/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/messaging/models/chat_channel.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/messaging/models/chat_channel_member.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/messaging/models/chat_message.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/messaging/models/contact_thread.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/messaging/services/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/notifications/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/notifications/handlers/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/notifications/handlers/create_webhook/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/notifications/handlers/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/notifications/handlers/get_preferences/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/notifications/handlers/list/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/notifications/handlers/list_webhooks/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/notifications/handlers/mark_read/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/notifications/handlers/send/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/notifications/handlers/update_preferences/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/notifications/models/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/notifications/services/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/notifications/services/notification_service.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/payments/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/payments/handlers/README.md +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/payments/handlers/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/payments/handlers/billing_accounts/create/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/payments/handlers/billing_accounts/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/payments/handlers/billing_accounts/update/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/payments/handlers/payment_intents/create/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/payments/handlers/payment_intents/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/payments/handlers/payments/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/payments/handlers/payments/list/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/payments/handlers/payments/record/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/payments/handlers/refunds/create/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/payments/handlers/refunds/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/payments/models/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/payments/services/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/payments/services/payment_service.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/projects/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/projects/models/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/projects/models/actor_role_definition.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/projects/models/project_activity.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/projects/models/project_actor.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/projects/models/project_milestone.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/projects/models/project_task.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/projects/models/project_workflow.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/projects/models/workflow_step.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/projects/services/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/projects/services/actor_service.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/projects/services/milestone_service.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/projects/services/project_service.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/projects/services/task_service.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/projects/services/workflow_service.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/resource_shares/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/resource_shares/models/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/resource_shares/services/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/subscriptions/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/subscriptions/handlers/README.md +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/subscriptions/handlers/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/subscriptions/handlers/addons/create/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/subscriptions/handlers/addons/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/subscriptions/handlers/addons/list/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/subscriptions/handlers/addons/update/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/subscriptions/handlers/discounts/create/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/subscriptions/handlers/discounts/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/subscriptions/handlers/discounts/validate/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/subscriptions/handlers/plans/create/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/subscriptions/handlers/plans/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/subscriptions/handlers/plans/list/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/subscriptions/handlers/plans/update/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/subscriptions/handlers/usage/aggregate/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/subscriptions/handlers/usage/record/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/subscriptions/models/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/subscriptions/services/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/tenancy/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/tenancy/handlers/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/tenancy/handlers/subscriptions/activate/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/tenancy/handlers/subscriptions/active/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/tenancy/handlers/subscriptions/cancel/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/tenancy/handlers/subscriptions/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/tenancy/handlers/subscriptions/list/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/tenancy/handlers/subscriptions/record_payment/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/tenancy/handlers/tenants/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/tenancy/handlers/tenants/me/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/tenancy/handlers/tenants/signup/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/tenancy/handlers/tenants/update/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/tenancy/models/subscription.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/tenancy/models/tenant.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/users/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/users/handlers/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/users/handlers/users/create/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/users/handlers/users/delete/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/users/handlers/users/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/users/handlers/users/list/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/users/handlers/users/update/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/users/models/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/users/models/permission.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/users/models/resource_permission.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/users/models/role.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/users/services/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/users/services/authorization_service.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/users/services/permission_registry.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/voting/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/voting/handlers/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/voting/handlers/votes/create/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/voting/handlers/votes/delete/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/voting/handlers/votes/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/voting/handlers/votes/list/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/voting/handlers/votes/summerize/README.md +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/voting/handlers/votes/update/app.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/voting/models/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/voting/models/vote.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/voting/models/vote_summary.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/voting/services/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/voting/services/vote_summary_service.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/voting/services/vote_tally_service.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/utilities/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/utilities/cognito_utility.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/utilities/custom_exceptions.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/utilities/datetime_utility.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/utilities/dictionary_utility.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/utilities/dynamodb_utils.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/utilities/environment_loader.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/utilities/environment_variables.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/utilities/http_body_parameters.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/utilities/http_path_parameters.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/utilities/http_status_code.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/utilities/jwt_utility.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/utilities/logging_utility.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/utilities/message_query_helper.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/utilities/response.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/utilities/string_functions.py +0 -0
- {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/update_readme_badges.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: geek_cafe_saas_sdk
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.52.0
|
|
4
4
|
Summary: Base Reusable Services for SaaS
|
|
5
5
|
Project-URL: Homepage, https://github.com/geek-cafe-saas-sdk
|
|
6
6
|
Project-URL: Documentation, https://github.com/geek-cafe-saas-sdk/blob/main/README.md
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
|
|
3
|
+
# Auto-generated by pysetup.py
|
|
4
|
+
# Activates the Python virtual environment
|
|
5
|
+
|
|
6
|
+
source .venv/bin/activate
|
|
7
|
+
|
|
8
|
+
# Display Python version and environment info
|
|
9
|
+
echo "
|
|
10
|
+
🐍 Python \$(python --version | cut -d' ' -f2) activated in \$(basename \$VIRTUAL_ENV) environment"
|
|
11
|
+
echo "
|
|
12
|
+
👉 Run 'deactivate' to exit the virtual environment"
|
|
@@ -1797,7 +1797,19 @@ Add your license here.
|
|
|
1797
1797
|
|
|
1798
1798
|
# Create or update the activation script
|
|
1799
1799
|
with open(activate_script, "w") as f:
|
|
1800
|
-
f.write(f"#!/bin/bash
|
|
1800
|
+
f.write(f"""#!/bin/bash
|
|
1801
|
+
|
|
1802
|
+
# Auto-generated by pysetup.py
|
|
1803
|
+
# Activates the Python virtual environment
|
|
1804
|
+
|
|
1805
|
+
source {VENV}/bin/activate
|
|
1806
|
+
|
|
1807
|
+
# Display Python version and environment info
|
|
1808
|
+
echo ""
|
|
1809
|
+
echo "🐍 Python $(python --version | cut -d' ' -f2) activated in $(basename $VIRTUAL_ENV) environment"
|
|
1810
|
+
echo ""
|
|
1811
|
+
echo "👉 Run 'deactivate' to exit the virtual environment"
|
|
1812
|
+
""")
|
|
1801
1813
|
|
|
1802
1814
|
# Make it executable
|
|
1803
1815
|
os.chmod(activate_script, 0o755)
|
|
@@ -161,7 +161,7 @@ class AuditLog(BaseModel):
|
|
|
161
161
|
primary.partition_key.attribute_name = "pk"
|
|
162
162
|
primary.partition_key.value = lambda: DynamoDBKey.build_key(("audit", self.id))
|
|
163
163
|
primary.sort_key.attribute_name = "sk"
|
|
164
|
-
primary.sort_key.value = lambda: "
|
|
164
|
+
primary.sort_key.value = lambda: DynamoDBKey.build_key(("audit", ""))
|
|
165
165
|
self.indexes.add_primary(primary)
|
|
166
166
|
|
|
167
167
|
# GSI1: Query by resource (resource_type#resource_id / timestamp)
|
|
@@ -246,69 +246,6 @@ class DatabaseService(ABC, Generic[T]):
|
|
|
246
246
|
# Field not provided = default to authenticated user (self-service)
|
|
247
247
|
return authenticated_user_id
|
|
248
248
|
|
|
249
|
-
# REMOVED: _validate_tenant_access - too strict, doesn't support shares/admins
|
|
250
|
-
# Use _get_by_id() which has proper security checks built-in
|
|
251
|
-
|
|
252
|
-
def _check_resource_access(
|
|
253
|
-
self,
|
|
254
|
-
resource_id: str,
|
|
255
|
-
resource_owner_id: Optional[str],
|
|
256
|
-
resource_tenant_id: Optional[str],
|
|
257
|
-
required_permission: AccessLevel = AccessLevel.VIEW,
|
|
258
|
-
allow_tenant_access: bool = False
|
|
259
|
-
) -> AccessResult:
|
|
260
|
-
"""
|
|
261
|
-
Manually check access (for edge cases only - CRUD methods check automatically).
|
|
262
|
-
|
|
263
|
-
NOTE: You typically don't need to call this. All CRUD operations
|
|
264
|
-
(_get_model_by_id_with_access_check, _save_model, _delete_model)
|
|
265
|
-
automatically check access. Use this only for:
|
|
266
|
-
- Pre-flight checks before expensive operations
|
|
267
|
-
- Custom access logic not covered by standard CRUD
|
|
268
|
-
|
|
269
|
-
Args:
|
|
270
|
-
resource_id: The resource ID
|
|
271
|
-
resource_owner_id: The owner's user ID
|
|
272
|
-
resource_tenant_id: The resource's tenant ID
|
|
273
|
-
required_permission: Required permission level (VIEW, EDIT, etc.)
|
|
274
|
-
allow_tenant_access: If True, any user in same tenant can access
|
|
275
|
-
|
|
276
|
-
Returns:
|
|
277
|
-
AccessResult with granted status and reason
|
|
278
|
-
"""
|
|
279
|
-
return self._access_checker.check_access(
|
|
280
|
-
resource_id=resource_id,
|
|
281
|
-
resource_owner_id=resource_owner_id,
|
|
282
|
-
resource_tenant_id=resource_tenant_id,
|
|
283
|
-
required_permission=required_permission,
|
|
284
|
-
allow_tenant_access=allow_tenant_access
|
|
285
|
-
)
|
|
286
|
-
|
|
287
|
-
def _require_resource_access(
|
|
288
|
-
self,
|
|
289
|
-
resource_id: str,
|
|
290
|
-
resource_owner_id: Optional[str],
|
|
291
|
-
resource_tenant_id: Optional[str],
|
|
292
|
-
required_permission: AccessLevel = AccessLevel.VIEW,
|
|
293
|
-
allow_tenant_access: bool = False
|
|
294
|
-
) -> AccessResult:
|
|
295
|
-
"""
|
|
296
|
-
Manually require access (for edge cases only - CRUD methods check automatically).
|
|
297
|
-
|
|
298
|
-
NOTE: You typically don't need to call this. All CRUD operations
|
|
299
|
-
automatically check access. Use this only for edge cases.
|
|
300
|
-
|
|
301
|
-
Raises:
|
|
302
|
-
AccessDeniedError: If access is denied
|
|
303
|
-
"""
|
|
304
|
-
return self._access_checker.require_access(
|
|
305
|
-
resource_id=resource_id,
|
|
306
|
-
resource_owner_id=resource_owner_id,
|
|
307
|
-
resource_tenant_id=resource_tenant_id,
|
|
308
|
-
required_permission=required_permission,
|
|
309
|
-
allow_tenant_access=allow_tenant_access
|
|
310
|
-
)
|
|
311
|
-
|
|
312
249
|
def _save_model(
|
|
313
250
|
self,
|
|
314
251
|
model: T,
|
|
@@ -363,7 +300,7 @@ class DatabaseService(ABC, Generic[T]):
|
|
|
363
300
|
|
|
364
301
|
if not old_model:
|
|
365
302
|
try:
|
|
366
|
-
old_model = self.
|
|
303
|
+
old_model = self._fetch_model_raw(model.id, model.__class__)
|
|
367
304
|
except Exception as e:
|
|
368
305
|
logger.error(f"Failed to get old model: {e}")
|
|
369
306
|
pass
|
|
@@ -372,7 +309,7 @@ class DatabaseService(ABC, Generic[T]):
|
|
|
372
309
|
#
|
|
373
310
|
# For proper UPDATE behavior (access check + audit logging with change tracking),
|
|
374
311
|
# services SHOULD pass old_model when updating existing records:
|
|
375
|
-
# old_model = self.
|
|
312
|
+
# old_model = self._fetch_model_raw(id, ModelClass)
|
|
376
313
|
# # ... modify model ...
|
|
377
314
|
# return self._save_model(model, old_model=old_model)
|
|
378
315
|
#
|
|
@@ -462,11 +399,6 @@ class DatabaseService(ABC, Generic[T]):
|
|
|
462
399
|
except Exception:
|
|
463
400
|
return None
|
|
464
401
|
|
|
465
|
-
# Backward compatibility alias - will be removed in future version
|
|
466
|
-
def _get_model_by_id(self, resource_id: str, model_class) -> Optional[T]:
|
|
467
|
-
"""DEPRECATED: Use _get_by_id() with skip_security_check=True instead."""
|
|
468
|
-
return self._fetch_model_raw(resource_id, model_class)
|
|
469
|
-
|
|
470
402
|
def _get_by_id(
|
|
471
403
|
self,
|
|
472
404
|
resource_id: str,
|
|
@@ -547,39 +479,9 @@ class DatabaseService(ABC, Generic[T]):
|
|
|
547
479
|
"action": "ACCESS_DENIED_MASKED_AS_NOT_FOUND"
|
|
548
480
|
}
|
|
549
481
|
)
|
|
550
|
-
return None
|
|
551
482
|
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
# These are kept for backward compatibility only
|
|
555
|
-
# ========================================
|
|
556
|
-
|
|
557
|
-
def _get_model_by_id_with_access_check(
|
|
558
|
-
self,
|
|
559
|
-
resource_id: str,
|
|
560
|
-
model_class,
|
|
561
|
-
required_permission: AccessLevel = AccessLevel.VIEW,
|
|
562
|
-
include_deleted: bool = False,
|
|
563
|
-
allow_tenant_access: bool = False
|
|
564
|
-
) -> Optional[T]:
|
|
565
|
-
"""DEPRECATED: Use _get_by_id() instead. Will be removed in future version."""
|
|
566
|
-
return self._get_by_id(
|
|
567
|
-
resource_id,
|
|
568
|
-
model_class,
|
|
569
|
-
required_permission=required_permission,
|
|
570
|
-
include_deleted=include_deleted
|
|
571
|
-
)
|
|
572
|
-
|
|
573
|
-
def _get_model_by_id_with_tenant_check(
|
|
574
|
-
self, resource_id: str, model_class, tenant_id: Optional[str] = None, include_deleted: bool = True
|
|
575
|
-
) -> Optional[T]:
|
|
576
|
-
"""DEPRECATED: Use _get_by_id() instead. Will be removed in future version."""
|
|
577
|
-
logger.warning("DEPRECATED: Use _get_by_id() instead. Will be removed in future version.")
|
|
578
|
-
return self._get_by_id(
|
|
579
|
-
resource_id,
|
|
580
|
-
model_class,
|
|
581
|
-
include_deleted=include_deleted
|
|
582
|
-
)
|
|
483
|
+
# Raise access denied error
|
|
484
|
+
raise AccessDeniedError("Access denied for resource " + resource_id)
|
|
583
485
|
|
|
584
486
|
def _delete_model(self, model: T, *, skip_access_check: bool = False) -> ServiceResult[bool]:
|
|
585
487
|
"""Delete model from database with **AUTOMATIC** access validation and audit logging.
|
|
@@ -659,24 +561,46 @@ class DatabaseService(ABC, Generic[T]):
|
|
|
659
561
|
expression_attribute_names: Optional[dict] = None,
|
|
660
562
|
start_key: Optional[dict] = None,
|
|
661
563
|
limit: Optional[int] = None,
|
|
564
|
+
skip_security_check: bool = False,
|
|
565
|
+
required_permission: AccessLevel = AccessLevel.VIEW,
|
|
566
|
+
query_condition: str="begins_with"
|
|
662
567
|
) -> ServiceResult[List[T]]:
|
|
663
568
|
"""
|
|
664
|
-
Generic query method for GSI queries with
|
|
569
|
+
Generic query method for GSI queries with **AUTOMATIC** security filtering.
|
|
570
|
+
|
|
571
|
+
Security:
|
|
572
|
+
- Requires authentication (unless skip_security_check=True)
|
|
573
|
+
- Filters results to only include items the user has access to
|
|
574
|
+
- Silently removes inaccessible items (prevents enumeration attacks)
|
|
575
|
+
- Logs audit events for access denial attempts
|
|
665
576
|
|
|
666
577
|
Args:
|
|
667
578
|
model: The pre-configured model instance to use for the query
|
|
668
579
|
index_name: The name of the GSI index to query
|
|
580
|
+
ascending: Sort order (default: descending)
|
|
581
|
+
strongly_consistent: Use strongly consistent reads
|
|
582
|
+
projection_expression: DynamoDB projection expression
|
|
583
|
+
expression_attribute_names: Expression attribute names
|
|
584
|
+
start_key: Pagination start key
|
|
585
|
+
limit: Maximum number of items to return
|
|
586
|
+
skip_security_check: If True, skip access filtering (use with caution)
|
|
587
|
+
required_permission: Required permission level for access check
|
|
669
588
|
|
|
670
589
|
Returns:
|
|
671
|
-
ServiceResult containing a list of
|
|
590
|
+
ServiceResult containing a list of accessible model instances.
|
|
672
591
|
Pagination info is included in error_details as 'last_evaluated_key' if more results exist.
|
|
673
592
|
"""
|
|
674
593
|
try:
|
|
594
|
+
# Require authentication unless skipping security
|
|
595
|
+
if not skip_security_check:
|
|
596
|
+
self.request_context.require_authentication()
|
|
597
|
+
|
|
675
598
|
# Get the key for the specified index from the provided model
|
|
676
|
-
|
|
599
|
+
if index_name == "primary":
|
|
600
|
+
key = model.get_key("primary").key(query_key=True, condition=query_condition)
|
|
601
|
+
else:
|
|
602
|
+
key = model.get_key(index_name).key(condition=query_condition)
|
|
677
603
|
|
|
678
|
-
# key.to_string()
|
|
679
|
-
# extract_key_values(key_expression) is coming soon from boto3_assist
|
|
680
604
|
if self.LOG_DYNAMO_DB_QUERY:
|
|
681
605
|
if hasattr(DynamoDBIndex, 'extract_key_values'):
|
|
682
606
|
values = DynamoDBIndex.extract_key_values(key)
|
|
@@ -693,7 +617,6 @@ class DatabaseService(ABC, Generic[T]):
|
|
|
693
617
|
logger.info(f"Querying index {index_name} with key {value}")
|
|
694
618
|
except Exception as e:
|
|
695
619
|
logger.error(f"Failed to extract key values: {e}")
|
|
696
|
-
|
|
697
620
|
|
|
698
621
|
# Execute the query
|
|
699
622
|
response = self.dynamodb.query(
|
|
@@ -713,10 +636,48 @@ class DatabaseService(ABC, Generic[T]):
|
|
|
713
636
|
|
|
714
637
|
# Map each item to a model instance
|
|
715
638
|
model_class = type(model)
|
|
716
|
-
|
|
639
|
+
all_items = [model_class().map(item) for item in data]
|
|
640
|
+
|
|
641
|
+
# SECURITY FILTERING: Filter items by access
|
|
642
|
+
if skip_security_check:
|
|
643
|
+
accessible_items = all_items
|
|
644
|
+
else:
|
|
645
|
+
accessible_items = []
|
|
646
|
+
denied_count = 0
|
|
647
|
+
|
|
648
|
+
for item in all_items:
|
|
649
|
+
access_result = self._access_checker.check_model_access(
|
|
650
|
+
model=item,
|
|
651
|
+
required_permission=required_permission
|
|
652
|
+
)
|
|
653
|
+
|
|
654
|
+
if access_result.granted:
|
|
655
|
+
accessible_items.append(item)
|
|
656
|
+
else:
|
|
657
|
+
denied_count += 1
|
|
658
|
+
# Log access denial for audit (silent filtering)
|
|
659
|
+
logger.debug(
|
|
660
|
+
f"List query filtered item due to access denial",
|
|
661
|
+
extra={
|
|
662
|
+
"resource_id": getattr(item, 'id', 'unknown'),
|
|
663
|
+
"resource_type": type(item).__name__,
|
|
664
|
+
"user_id": self._request_context.authenticated_user_id,
|
|
665
|
+
"denial_reason": access_result.reason,
|
|
666
|
+
"action": "LIST_ITEM_FILTERED"
|
|
667
|
+
}
|
|
668
|
+
)
|
|
669
|
+
|
|
670
|
+
# Log audit event if any items were filtered
|
|
671
|
+
if denied_count > 0:
|
|
672
|
+
self._log_list_access_denial(
|
|
673
|
+
index_name=index_name,
|
|
674
|
+
total_found=len(all_items),
|
|
675
|
+
denied_count=denied_count,
|
|
676
|
+
model_class=model_class
|
|
677
|
+
)
|
|
717
678
|
|
|
718
679
|
# Include pagination info if present
|
|
719
|
-
result = ServiceResult.success_result(
|
|
680
|
+
result = ServiceResult.success_result(accessible_items)
|
|
720
681
|
if "LastEvaluatedKey" in response:
|
|
721
682
|
result.error_details = {"last_evaluated_key": response["LastEvaluatedKey"]}
|
|
722
683
|
|
|
@@ -728,6 +689,52 @@ class DatabaseService(ABC, Generic[T]):
|
|
|
728
689
|
error_code=ErrorCode.DATABASE_QUERY_FAILED,
|
|
729
690
|
context=f"Failed to query index {index_name} on table {self.table_name}",
|
|
730
691
|
)
|
|
692
|
+
|
|
693
|
+
def _log_list_access_denial(
|
|
694
|
+
self,
|
|
695
|
+
index_name: str,
|
|
696
|
+
total_found: int,
|
|
697
|
+
denied_count: int,
|
|
698
|
+
model_class: type
|
|
699
|
+
) -> None:
|
|
700
|
+
"""
|
|
701
|
+
Log an audit event when list query results are filtered due to access denial.
|
|
702
|
+
|
|
703
|
+
This helps detect potential unauthorized access attempts or misconfigured permissions.
|
|
704
|
+
"""
|
|
705
|
+
try:
|
|
706
|
+
if not self._audit_logger or not self._audit_logger.is_enabled:
|
|
707
|
+
return
|
|
708
|
+
|
|
709
|
+
event = AuditEvent()
|
|
710
|
+
|
|
711
|
+
# Actor
|
|
712
|
+
event.actor_tenant_id = self._request_context.authenticated_tenant_id
|
|
713
|
+
event.actor_user_id = self._request_context.authenticated_user_id
|
|
714
|
+
event.actor_email = getattr(self._request_context, 'authenticated_email', '') or ''
|
|
715
|
+
|
|
716
|
+
# Resource owner - same as actor for list queries
|
|
717
|
+
event.tenant_id = self._request_context.authenticated_tenant_id
|
|
718
|
+
event.user_id = self._request_context.authenticated_user_id
|
|
719
|
+
|
|
720
|
+
# What
|
|
721
|
+
event.action = "LIST_ACCESS_FILTERED"
|
|
722
|
+
event.resource_type = model_class.__name__
|
|
723
|
+
event.resource_id = f"query:{index_name}"
|
|
724
|
+
event.service_name = self.__class__.__name__
|
|
725
|
+
event.source_table_name = self.table_name
|
|
726
|
+
event.success = True # The query succeeded, items were just filtered
|
|
727
|
+
event.new_values = {
|
|
728
|
+
"index_name": index_name,
|
|
729
|
+
"total_found": total_found,
|
|
730
|
+
"denied_count": denied_count,
|
|
731
|
+
"accessible_count": total_found - denied_count
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
self._audit_logger.log(event)
|
|
735
|
+
|
|
736
|
+
except Exception as e:
|
|
737
|
+
logger.warning(f"Failed to log list access denial audit event: {e}")
|
|
731
738
|
|
|
732
739
|
def _delete_by_composite_key(
|
|
733
740
|
self,
|
|
@@ -16,7 +16,11 @@ from geek_cafe_saas_sdk.utilities.response import (
|
|
|
16
16
|
error_response,
|
|
17
17
|
service_result_to_response,
|
|
18
18
|
)
|
|
19
|
-
from geek_cafe_saas_sdk.utilities.case_conversion import
|
|
19
|
+
from geek_cafe_saas_sdk.utilities.case_conversion import (
|
|
20
|
+
CaseFormat,
|
|
21
|
+
CaseConverter,
|
|
22
|
+
detect_payload_case_format,
|
|
23
|
+
)
|
|
20
24
|
from geek_cafe_saas_sdk.utilities.lambda_event_utility import LambdaEventUtility
|
|
21
25
|
from geek_cafe_saas_sdk.utilities.logging_utility import LoggingUtility
|
|
22
26
|
from geek_cafe_saas_sdk.utilities.environment_variables import EnvironmentVariables
|
|
@@ -242,6 +246,79 @@ class BaseLambdaHandler:
|
|
|
242
246
|
# Default to camelCase for backwards compatibility
|
|
243
247
|
return CaseFormat.CAMEL
|
|
244
248
|
|
|
249
|
+
def _get_request_case_format(
|
|
250
|
+
self, event: Dict[str, Any], body: Optional[Dict[str, Any]] = None
|
|
251
|
+
) -> CaseFormat:
|
|
252
|
+
"""
|
|
253
|
+
Determine the case format of the incoming request payload.
|
|
254
|
+
|
|
255
|
+
Uses a hybrid approach (Option C):
|
|
256
|
+
1. Check for explicit client declaration via query param or header
|
|
257
|
+
2. Fall back to auto-detection from payload keys
|
|
258
|
+
3. Default to camelCase (most common for JS clients)
|
|
259
|
+
|
|
260
|
+
Args:
|
|
261
|
+
event: Lambda event
|
|
262
|
+
body: Parsed request body (optional, for auto-detection)
|
|
263
|
+
|
|
264
|
+
Returns:
|
|
265
|
+
CaseFormat of the incoming request
|
|
266
|
+
|
|
267
|
+
Supported parameters:
|
|
268
|
+
- Query: ?requestCase=camelCase or ?request_case=snake_case
|
|
269
|
+
- Header: X-Request-Case: camelCase
|
|
270
|
+
|
|
271
|
+
Examples:
|
|
272
|
+
# Explicit declaration
|
|
273
|
+
POST /api/users?requestCase=snake_case
|
|
274
|
+
{"user_name": "John", "created_at": "2024-01-01"}
|
|
275
|
+
|
|
276
|
+
# Auto-detected as camelCase
|
|
277
|
+
POST /api/users
|
|
278
|
+
{"userName": "John", "createdAt": "2024-01-01"}
|
|
279
|
+
"""
|
|
280
|
+
# 1. Check query string parameters (explicit declaration)
|
|
281
|
+
query_params = event.get('queryStringParameters') or {}
|
|
282
|
+
request_case = (
|
|
283
|
+
query_params.get('requestCase') or
|
|
284
|
+
query_params.get('request_case') or
|
|
285
|
+
query_params.get('request-case')
|
|
286
|
+
)
|
|
287
|
+
|
|
288
|
+
if request_case:
|
|
289
|
+
try:
|
|
290
|
+
case_format = CaseFormat.from_string(request_case)
|
|
291
|
+
logger.debug(f"Client declared {case_format.value} request via query param")
|
|
292
|
+
return case_format
|
|
293
|
+
except ValueError:
|
|
294
|
+
logger.warning(f"Unknown request case format: {request_case}, using auto-detection")
|
|
295
|
+
|
|
296
|
+
# 2. Check headers (explicit declaration)
|
|
297
|
+
headers = event.get('headers') or {}
|
|
298
|
+
# Headers can be case-insensitive, check common variations
|
|
299
|
+
request_case = (
|
|
300
|
+
headers.get('X-Request-Case') or
|
|
301
|
+
headers.get('x-request-case') or
|
|
302
|
+
headers.get('X-REQUEST-CASE')
|
|
303
|
+
)
|
|
304
|
+
|
|
305
|
+
if request_case:
|
|
306
|
+
try:
|
|
307
|
+
case_format = CaseFormat.from_string(request_case)
|
|
308
|
+
logger.debug(f"Client declared {case_format.value} request via header")
|
|
309
|
+
return case_format
|
|
310
|
+
except ValueError:
|
|
311
|
+
logger.warning(f"Unknown request case format in header: {request_case}, using auto-detection")
|
|
312
|
+
|
|
313
|
+
# 3. Auto-detect from payload if provided
|
|
314
|
+
if body and isinstance(body, dict):
|
|
315
|
+
detected = detect_payload_case_format(body)
|
|
316
|
+
logger.debug(f"Auto-detected request case format: {detected.value}")
|
|
317
|
+
return detected
|
|
318
|
+
|
|
319
|
+
# 4. Default to camelCase (most common for JS clients)
|
|
320
|
+
return CaseFormat.CAMEL
|
|
321
|
+
|
|
245
322
|
def _get_preserve_fields(self, event: Dict[str, Any]) -> Optional[Set[str]]:
|
|
246
323
|
"""
|
|
247
324
|
Get fields to preserve from case conversion from client request.
|
|
@@ -32,7 +32,7 @@ def service_method(operation_name: Optional[str] = None):
|
|
|
32
32
|
>>> @service_method("get_by_id")
|
|
33
33
|
>>> def get_by_id(self, *, resource_id: str):
|
|
34
34
|
>>> # Just business logic - no try/except needed
|
|
35
|
-
>>> file = self.
|
|
35
|
+
>>> file = self._get_by_id(resource_id)
|
|
36
36
|
>>> if not file:
|
|
37
37
|
>>> raise NotFoundError(f"File not found: {resource_id}")
|
|
38
38
|
>>> return ServiceResult.success_result(file)
|