geek-cafe-saas-sdk 0.7.2__tar.gz → 0.7.3__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.
Potentially problematic release.
This version of geek-cafe-saas-sdk might be problematic. Click here for more details.
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/.gitignore +2 -1
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/PKG-INFO +1 -1
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/pyproject.toml +1 -1
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/requirements.dev.txt +2 -1
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/__init__.py +1 -1
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/files/services/file_version_service.py +18 -43
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/messaging/models/contact_thread.py +3 -3
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/messaging/services/contact_thread_service.py +8 -1
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/services/database_service.py +26 -1
- geek_cafe_saas_sdk-0.7.2/CODING_STANDARDS_IMPLEMENTATION.md +0 -252
- geek_cafe_saas_sdk-0.7.2/COMPREHENSIVE_REFACTORING_FINAL_STATUS.md +0 -304
- geek_cafe_saas_sdk-0.7.2/COMPREHENSIVE_REFACTORING_PROGRESS.md +0 -141
- geek_cafe_saas_sdk-0.7.2/INDEX_PATTERN_FIXES_SUMMARY.md +0 -121
- geek_cafe_saas_sdk-0.7.2/INDEX_PATTERN_REFACTORING_COMPLETE.md +0 -191
- geek_cafe_saas_sdk-0.7.2/LAMBDA_EVENT_LOGGING_IMPLEMENTATION.md +0 -345
- geek_cafe_saas_sdk-0.7.2/LINEAGE_IMPLEMENTATION_SUMMARY.md +0 -335
- geek_cafe_saas_sdk-0.7.2/MODEL_INDEX_INITIALIZATION_FIX.md +0 -247
- geek_cafe_saas_sdk-0.7.2/NOTIFICATIONS_COMPLETE_SUMMARY.md +0 -355
- geek_cafe_saas_sdk-0.7.2/PAYMENTS_COMPLETE_SUMMARY.md +0 -320
- geek_cafe_saas_sdk-0.7.2/PAYMENTS_DOMAIN_SUMMARY.md +0 -280
- geek_cafe_saas_sdk-0.7.2/PRIMARY_KEY_FIX_SUMMARY.md +0 -100
- geek_cafe_saas_sdk-0.7.2/REFACTORING_COMPLETE.md +0 -316
- geek_cafe_saas_sdk-0.7.2/REFACTORING_FINAL_STATUS.md +0 -241
- geek_cafe_saas_sdk-0.7.2/REFACTORING_HANDOFF.md +0 -260
- geek_cafe_saas_sdk-0.7.2/REFACTORING_SUCCESS_REPORT.md +0 -335
- geek_cafe_saas_sdk-0.7.2/SUBSCRIPTIONS_COMPLETE_SUMMARY.md +0 -373
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/.env.mock +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/.windsurf/rules/cascade.yaml +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/ARCHITECTURE.md +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/CHANGELOG.md +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/CHANGELOG_0.4.1.md +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/CURRENT_TASKS.md +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/LICENSE +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/README.md +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/README_FILE_SYSTEM_SDK_USAGE.md +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/coverage.json +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/examples/decorator_pattern_handlers.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/examples/factory_authorization_example.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/examples/file_lineage_example.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/examples/hierarchical_routing_handler_example.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/examples/lambda_event_logging_example.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/examples/lambda_handler_examples.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/examples/lambda_handlers/api_key_example.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/examples/website_analytics_example.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/lambda_handlers/auth/confirm_forgot_password/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/lambda_handlers/auth/forgot_password/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/lambda_handlers/users/change_password/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/lambda_handlers/users/reset_password/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/publish_to_pypi.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/publish_to_pypi.sh +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/pysetup.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/pysetup.sh +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/requirements.txt +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/run_unit_tests.sh +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/core/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/core/audit_mixin.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/core/error_codes.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/core/service_errors.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/core/service_result.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/decorators/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/decorators/auth.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/decorators/core.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/analytics/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/analytics/handlers/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/analytics/models/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/analytics/models/website_analytics.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/analytics/models/website_analytics_summary.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/analytics/services/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/analytics/services/website_analytics_service.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/analytics/services/website_analytics_summary_service.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/analytics/services/website_analytics_tally_service.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/auth/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/auth/handlers/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/auth/handlers/users/create/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/auth/handlers/users/delete/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/auth/handlers/users/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/auth/handlers/users/list/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/auth/handlers/users/update/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/auth/models/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/auth/models/permission.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/auth/models/resource_permission.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/auth/models/role.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/auth/models/user.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/auth/services/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/auth/services/authorization_service.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/auth/services/permission_registry.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/auth/services/resource_permission_service.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/auth/services/user_service.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/communities/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/communities/handlers/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/communities/handlers/communities/create/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/communities/handlers/communities/delete/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/communities/handlers/communities/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/communities/handlers/communities/list/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/communities/handlers/communities/update/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/communities/models/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/communities/models/community.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/communities/models/community_member.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/communities/services/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/communities/services/community_member_service.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/communities/services/community_service.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/events/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/events/handlers/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/events/handlers/attendees/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/events/handlers/cancel/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/events/handlers/check_in/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/events/handlers/create/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/events/handlers/delete/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/events/handlers/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/events/handlers/invite/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/events/handlers/list/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/events/handlers/publish/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/events/handlers/rsvp/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/events/handlers/update/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/events/models/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/events/models/event.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/events/models/event_attendee.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/events/services/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/events/services/event_attendee_service.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/events/services/event_service.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/files/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/files/handlers/README.md +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/files/handlers/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/files/handlers/files/create/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/files/handlers/files/download/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/files/handlers/files/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/files/handlers/files/list/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/files/handlers/lineage/create_derived/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/files/handlers/lineage/create_main/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/files/handlers/lineage/download_bundle/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/files/handlers/lineage/get_lineage/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/files/handlers/lineage/prepare_bundle/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/files/models/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/files/models/directory.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/files/models/file.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/files/models/file_share.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/files/models/file_version.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/files/services/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/files/services/directory_service.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/files/services/file_lineage_service.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/files/services/file_share_service.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/files/services/file_system_service.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/files/services/s3_file_service.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/messaging/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/messaging/handlers/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/messaging/handlers/chat_channels/create/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/messaging/handlers/chat_channels/delete/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/messaging/handlers/chat_channels/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/messaging/handlers/chat_channels/list/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/messaging/handlers/chat_channels/update/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/messaging/handlers/chat_messages/create/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/messaging/handlers/chat_messages/delete/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/messaging/handlers/chat_messages/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/messaging/handlers/chat_messages/list/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/messaging/handlers/chat_messages/update/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/messaging/handlers/contact_threads/create/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/messaging/handlers/contact_threads/delete/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/messaging/handlers/contact_threads/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/messaging/handlers/contact_threads/list/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/messaging/handlers/contact_threads/update/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/messaging/models/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/messaging/models/chat_channel.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/messaging/models/chat_channel_member.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/messaging/models/chat_message.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/messaging/services/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/messaging/services/chat_channel_service.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/messaging/services/chat_message_service.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/notifications/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/notifications/handlers/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/notifications/handlers/create_webhook/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/notifications/handlers/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/notifications/handlers/get_preferences/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/notifications/handlers/list/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/notifications/handlers/list_webhooks/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/notifications/handlers/mark_read/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/notifications/handlers/send/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/notifications/handlers/update_preferences/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/notifications/models/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/notifications/models/notification.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/notifications/models/notification_preference.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/notifications/models/webhook_subscription.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/notifications/services/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/notifications/services/notification_service.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/payments/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/payments/handlers/README.md +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/payments/handlers/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/payments/handlers/billing_accounts/create/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/payments/handlers/billing_accounts/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/payments/handlers/billing_accounts/update/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/payments/handlers/payment_intents/create/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/payments/handlers/payment_intents/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/payments/handlers/payments/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/payments/handlers/payments/list/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/payments/handlers/payments/record/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/payments/handlers/refunds/create/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/payments/handlers/refunds/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/payments/models/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/payments/models/billing_account.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/payments/models/payment.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/payments/models/payment_intent_ref.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/payments/models/refund.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/payments/services/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/payments/services/payment_service.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/subscriptions/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/subscriptions/handlers/README.md +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/subscriptions/handlers/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/subscriptions/handlers/addons/create/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/subscriptions/handlers/addons/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/subscriptions/handlers/addons/list/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/subscriptions/handlers/addons/update/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/subscriptions/handlers/discounts/create/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/subscriptions/handlers/discounts/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/subscriptions/handlers/discounts/validate/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/subscriptions/handlers/plans/create/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/subscriptions/handlers/plans/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/subscriptions/handlers/plans/list/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/subscriptions/handlers/plans/update/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/subscriptions/handlers/usage/aggregate/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/subscriptions/handlers/usage/record/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/subscriptions/models/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/subscriptions/models/addon.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/subscriptions/models/discount.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/subscriptions/models/plan.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/subscriptions/models/usage_record.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/subscriptions/services/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/subscriptions/services/subscription_manager_service.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/tenancy/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/tenancy/handlers/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/tenancy/handlers/subscriptions/activate/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/tenancy/handlers/subscriptions/active/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/tenancy/handlers/subscriptions/cancel/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/tenancy/handlers/subscriptions/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/tenancy/handlers/subscriptions/list/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/tenancy/handlers/subscriptions/record_payment/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/tenancy/handlers/tenants/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/tenancy/handlers/tenants/me/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/tenancy/handlers/tenants/signup/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/tenancy/handlers/tenants/update/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/tenancy/models/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/tenancy/models/subscription.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/tenancy/models/tenant.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/tenancy/services/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/tenancy/services/subscription_service.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/tenancy/services/tenant_service.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/voting/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/voting/handlers/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/voting/handlers/votes/create/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/voting/handlers/votes/delete/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/voting/handlers/votes/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/voting/handlers/votes/list/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/voting/handlers/votes/summerize/README.md +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/voting/handlers/votes/update/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/voting/models/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/voting/models/vote.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/voting/models/vote_summary.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/voting/services/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/voting/services/vote_service.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/voting/services/vote_summary_service.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/domains/voting/services/vote_tally_service.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/lambda_handlers/README.md +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/lambda_handlers/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/lambda_handlers/_base/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/lambda_handlers/_base/api_key_handler.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/lambda_handlers/_base/authorized_secure_handler.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/lambda_handlers/_base/base_handler.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/lambda_handlers/_base/handler_factory.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/lambda_handlers/_base/public_handler.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/lambda_handlers/_base/secure_handler.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/lambda_handlers/_base/service_pool.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/lambda_handlers/directories/create/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/lambda_handlers/directories/delete/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/lambda_handlers/directories/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/lambda_handlers/directories/list/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/lambda_handlers/directories/move/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/lambda_handlers/files/delete/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/lambda_handlers/files/download/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/lambda_handlers/files/get/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/lambda_handlers/files/list/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/lambda_handlers/files/share/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/lambda_handlers/files/shares/list/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/lambda_handlers/files/shares/revoke/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/lambda_handlers/files/update/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/lambda_handlers/files/upload/app.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/middleware/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/middleware/auth.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/middleware/authorization.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/middleware/cors.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/middleware/error_handling.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/middleware/validation.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/models/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/models/base_model.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/services/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/utilities/__init__.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/utilities/cognito_utility.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/utilities/custom_exceptions.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/utilities/datetime_utility.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/utilities/dictionary_utility.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/utilities/dynamodb_utils.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/utilities/environment_loader.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/utilities/environment_variables.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/utilities/http_body_parameters.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/utilities/http_path_parameters.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/utilities/http_status_code.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/utilities/jwt_utility.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/utilities/lambda_event_utility.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/utilities/logging_utility.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/utilities/message_query_helper.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/utilities/response.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/src/geek_cafe_saas_sdk/utilities/string_functions.py +0 -0
- {geek_cafe_saas_sdk-0.7.2 → geek_cafe_saas_sdk-0.7.3}/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.7.
|
|
3
|
+
Version: 0.7.3
|
|
4
4
|
Summary: Base Reusable Services for SaaS
|
|
5
5
|
Project-URL: Homepage, https://github.com/geekcafe/geek-cafe-services
|
|
6
6
|
Project-URL: Documentation, https://github.com/geekcafe/geek-cafe-services/blob/main/README.md
|
|
@@ -515,21 +515,12 @@ class FileVersionService(DatabaseService[FileVersion]):
|
|
|
515
515
|
def _get_file(self, tenant_id: str, file_id: str, user_id: str) -> ServiceResult[File]:
|
|
516
516
|
"""Get file with access control."""
|
|
517
517
|
try:
|
|
518
|
-
|
|
519
|
-
file
|
|
520
|
-
file.tenant_id = tenant_id
|
|
518
|
+
# Use DatabaseService helper to get file
|
|
519
|
+
file = self._get_model_by_id_with_tenant_check(file_id, File, tenant_id)
|
|
521
520
|
|
|
522
|
-
|
|
523
|
-
table_name=self.table_name,
|
|
524
|
-
model=file
|
|
525
|
-
)
|
|
526
|
-
|
|
527
|
-
if not result or 'Item' not in result:
|
|
521
|
+
if not file:
|
|
528
522
|
raise NotFoundError(f"File not found: {file_id}")
|
|
529
523
|
|
|
530
|
-
file = File()
|
|
531
|
-
file.map(result['Item'])
|
|
532
|
-
|
|
533
524
|
if file.owner_id != user_id:
|
|
534
525
|
raise AccessDeniedError("You do not have access to this file")
|
|
535
526
|
|
|
@@ -544,24 +535,14 @@ class FileVersionService(DatabaseService[FileVersion]):
|
|
|
544
535
|
def _get_latest_version_number(self, tenant_id: str, file_id: str) -> int:
|
|
545
536
|
"""Get the latest version number for a file."""
|
|
546
537
|
try:
|
|
547
|
-
file
|
|
548
|
-
|
|
549
|
-
|
|
538
|
+
# Query versions for this file using DatabaseService helper
|
|
539
|
+
temp_version = FileVersion()
|
|
540
|
+
temp_version.file_id = file_id
|
|
550
541
|
|
|
551
|
-
|
|
552
|
-
results = self.dynamodb.query(
|
|
553
|
-
key=key,
|
|
554
|
-
table_name=self.table_name,
|
|
555
|
-
index_name="gsi1",
|
|
556
|
-
limit=1,
|
|
557
|
-
ascending=False # Get highest version number
|
|
558
|
-
)
|
|
542
|
+
result = self._query_by_index(temp_version, "gsi1", limit=1, ascending=False)
|
|
559
543
|
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
version = FileVersion()
|
|
563
|
-
version.map(items[0])
|
|
564
|
-
return version.version_number
|
|
544
|
+
if result.success and result.data:
|
|
545
|
+
return result.data[0].version_number
|
|
565
546
|
|
|
566
547
|
return 0 # No versions yet
|
|
567
548
|
|
|
@@ -576,19 +557,10 @@ class FileVersionService(DatabaseService[FileVersion]):
|
|
|
576
557
|
) -> None:
|
|
577
558
|
"""Mark a version as not current."""
|
|
578
559
|
try:
|
|
579
|
-
|
|
580
|
-
version
|
|
581
|
-
version.tenant_id = tenant_id
|
|
582
|
-
version.file_id = file_id
|
|
583
|
-
|
|
584
|
-
result = self.dynamodb.get(
|
|
585
|
-
table_name=self.table_name,
|
|
586
|
-
model=version
|
|
587
|
-
)
|
|
560
|
+
# Use DatabaseService helper to get version
|
|
561
|
+
version = self._get_model_by_id_with_tenant_check(version_id, FileVersion, tenant_id)
|
|
588
562
|
|
|
589
|
-
if
|
|
590
|
-
version = FileVersion()
|
|
591
|
-
version.map(result['Item'])
|
|
563
|
+
if version:
|
|
592
564
|
version.is_current = False
|
|
593
565
|
|
|
594
566
|
version.prep_for_save()
|
|
@@ -605,12 +577,15 @@ class FileVersionService(DatabaseService[FileVersion]):
|
|
|
605
577
|
) -> None:
|
|
606
578
|
"""Update file record with current version info."""
|
|
607
579
|
try:
|
|
608
|
-
|
|
609
|
-
|
|
580
|
+
file = File()
|
|
581
|
+
file.id = file_id
|
|
582
|
+
file.tenant_id = tenant_id
|
|
583
|
+
|
|
584
|
+
key = file.get_key("gsi1")
|
|
610
585
|
|
|
611
586
|
result = self.dynamodb.get(
|
|
612
587
|
table_name=self.table_name,
|
|
613
|
-
key=
|
|
588
|
+
key=key
|
|
614
589
|
)
|
|
615
590
|
|
|
616
591
|
if result and 'Item' in result:
|
|
@@ -33,13 +33,13 @@ class ContactThread(BaseModel):
|
|
|
33
33
|
super().__init__()
|
|
34
34
|
self._subject: str | None = None
|
|
35
35
|
self._status: str = "open" # open, in_progress, resolved, closed
|
|
36
|
-
self._priority: str = "medium" # low, medium, high, urgent
|
|
36
|
+
self._priority: Optional[str] = "medium" # low, medium, high, urgent
|
|
37
37
|
|
|
38
38
|
# Sender information (guest or authenticated user)
|
|
39
39
|
self._sender: Dict[str, Any] = {} # {id, name, email, session_id}
|
|
40
40
|
|
|
41
41
|
# Assignment and routing
|
|
42
|
-
self._assigned_to: str
|
|
42
|
+
self._assigned_to: Optional[str] = None # Staff user ID
|
|
43
43
|
self._inbox_id: str = "support" # support, sales, billing, etc.
|
|
44
44
|
|
|
45
45
|
# Messages embedded in thread (suitable for low volume)
|
|
@@ -178,7 +178,7 @@ class ContactThread(BaseModel):
|
|
|
178
178
|
|
|
179
179
|
@priority.setter
|
|
180
180
|
def priority(self, value: str | None):
|
|
181
|
-
valid_priorities = ["low", "medium", "high", "urgent"]
|
|
181
|
+
valid_priorities = ["low", "medium", "high", "urgent", None]
|
|
182
182
|
if value in valid_priorities:
|
|
183
183
|
self._priority = value
|
|
184
184
|
else:
|
|
@@ -245,7 +245,7 @@ class ContactThreadService(DatabaseService[ContactThread]):
|
|
|
245
245
|
tenant_id=tenant_id, status=status)
|
|
246
246
|
|
|
247
247
|
def list_by_assigned_user(self, assigned_to: str, tenant_id: str,
|
|
248
|
-
status: str = None, limit: int = 50) -> ServiceResult[List[ContactThread]]:
|
|
248
|
+
*, status: str = None, priority: str = None, limit: int = 50) -> ServiceResult[List[ContactThread]]:
|
|
249
249
|
"""
|
|
250
250
|
List contact threads assigned to a specific user using GSI3.
|
|
251
251
|
|
|
@@ -263,6 +263,13 @@ class ContactThreadService(DatabaseService[ContactThread]):
|
|
|
263
263
|
temp_thread.assigned_to = assigned_to
|
|
264
264
|
if status:
|
|
265
265
|
temp_thread.status = status
|
|
266
|
+
else:
|
|
267
|
+
temp_thread.status = None
|
|
268
|
+
|
|
269
|
+
if priority:
|
|
270
|
+
temp_thread.priority = priority
|
|
271
|
+
else:
|
|
272
|
+
temp_thread.priority = None
|
|
266
273
|
|
|
267
274
|
result = self._query_by_index(
|
|
268
275
|
temp_thread,
|
|
@@ -2,14 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
from abc import ABC, abstractmethod
|
|
4
4
|
from typing import Generic, TypeVar, Dict, Any, List, Optional
|
|
5
|
-
from boto3_assist.dynamodb.dynamodb import DynamoDB
|
|
5
|
+
from boto3_assist.dynamodb.dynamodb import DynamoDB, DynamoDBIndex
|
|
6
6
|
from ..core.service_result import ServiceResult
|
|
7
7
|
from ..core.service_errors import ValidationError, AccessDeniedError, NotFoundError
|
|
8
8
|
from ..core.error_codes import ErrorCode
|
|
9
9
|
import os
|
|
10
|
+
from aws_lambda_powertools import Logger
|
|
10
11
|
|
|
11
12
|
T = TypeVar("T")
|
|
12
13
|
|
|
14
|
+
logger = Logger()
|
|
15
|
+
|
|
13
16
|
|
|
14
17
|
class DatabaseService(ABC, Generic[T]):
|
|
15
18
|
"""Base service class for database operations."""
|
|
@@ -23,6 +26,8 @@ class DatabaseService(ABC, Generic[T]):
|
|
|
23
26
|
if not self.table_name:
|
|
24
27
|
raise ValueError("Table name is required")
|
|
25
28
|
|
|
29
|
+
self.LOG_DYNAMO_DB_QUERY = os.getenv("LOG_DYNAMO_DB_QUERY", False)
|
|
30
|
+
|
|
26
31
|
@abstractmethod
|
|
27
32
|
def create(self, tenant_id: str, user_id: str, **kwargs) -> ServiceResult[T]:
|
|
28
33
|
"""Create a new resource."""
|
|
@@ -226,6 +231,26 @@ class DatabaseService(ABC, Generic[T]):
|
|
|
226
231
|
# Get the key for the specified index from the provided model
|
|
227
232
|
key = model.get_key(index_name).key()
|
|
228
233
|
|
|
234
|
+
# key.to_string()
|
|
235
|
+
# extract_key_values(key_expression) is coming soon from boto3_assist
|
|
236
|
+
if self.LOG_DYNAMO_DB_QUERY:
|
|
237
|
+
if hasattr(DynamoDBIndex, 'extract_key_values'):
|
|
238
|
+
values = DynamoDBIndex.extract_key_values(key_expression)
|
|
239
|
+
logger.info(f"Querying index {index_name} with key {values}")
|
|
240
|
+
else:
|
|
241
|
+
try:
|
|
242
|
+
value = {
|
|
243
|
+
'pk': key._values[0]._values[1],
|
|
244
|
+
'sk': key._values[1]._values[1],
|
|
245
|
+
'operator': key._values[1].expression_operator,
|
|
246
|
+
'format': key._values[1].expression_format,
|
|
247
|
+
'index_name': index_name
|
|
248
|
+
}
|
|
249
|
+
logger.info(f"Querying index {index_name} with key {value}")
|
|
250
|
+
except Exception as e:
|
|
251
|
+
logger.error(f"Failed to extract key values: {e}")
|
|
252
|
+
|
|
253
|
+
|
|
229
254
|
# Execute the query
|
|
230
255
|
response = self.dynamodb.query(
|
|
231
256
|
table_name=self.table_name,
|
|
@@ -1,252 +0,0 @@
|
|
|
1
|
-
# Coding Standards Implementation - Complete ✅
|
|
2
|
-
|
|
3
|
-
**Date:** October 17, 2025
|
|
4
|
-
**Status:** COMPLETE
|
|
5
|
-
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## 🎯 What Was Implemented
|
|
9
|
-
|
|
10
|
-
1. **Global Rules** - Created 3 persistent memory rules that apply to all future work
|
|
11
|
-
2. **Documentation** - Created comprehensive `CODING_STANDARDS.md` shareable across projects
|
|
12
|
-
3. **Code Fixes** - Fixed 2 instances of deprecated `.load_from_dictionary()` pattern
|
|
13
|
-
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
## 📝 Global Rules Created (Memory System)
|
|
17
|
-
|
|
18
|
-
These rules are now **permanently stored** in my memory and will be **automatically retrieved** for all future work:
|
|
19
|
-
|
|
20
|
-
### Rule 1: Model Index Pattern
|
|
21
|
-
- **Title:** "Model Index Pattern - _setup_indexes() Required"
|
|
22
|
-
- **Enforces:** All models must use `_setup_indexes()` method
|
|
23
|
-
- **Tags:** coding_standards, models, dynamodb, indexes
|
|
24
|
-
|
|
25
|
-
### Rule 2: Service Helper Pattern
|
|
26
|
-
- **Title:** "Service Pattern - Use DatabaseService Helper Methods"
|
|
27
|
-
- **Enforces:** Services use `_save_model()`, `_get_model_by_id()`, `_query_by_index()`
|
|
28
|
-
- **Tags:** coding_standards, services, dynamodb, helpers
|
|
29
|
-
|
|
30
|
-
### Rule 3: Model Mapping Pattern
|
|
31
|
-
- **Title:** "Model Mapping Pattern - Use .map() Method"
|
|
32
|
-
- **Enforces:** Always use `.map()` instead of key iteration or `load_from_dictionary()`
|
|
33
|
-
- **Tags:** coding_standards, models, mapping, data_loading
|
|
34
|
-
|
|
35
|
-
---
|
|
36
|
-
|
|
37
|
-
## 📚 Documentation Created
|
|
38
|
-
|
|
39
|
-
### File: `docs/guidelines/CODING_STANDARDS.md`
|
|
40
|
-
|
|
41
|
-
Comprehensive coding standards document with:
|
|
42
|
-
|
|
43
|
-
1. **Model Patterns**
|
|
44
|
-
- ✅ Index definition with `_setup_indexes()`
|
|
45
|
-
- ✅ Complete example with primary + GSI indexes
|
|
46
|
-
- ✅ Why these patterns matter
|
|
47
|
-
|
|
48
|
-
2. **Service Patterns**
|
|
49
|
-
- ✅ Using `_save_model()` for saves
|
|
50
|
-
- ✅ Using `_get_model_by_id()` for retrieval
|
|
51
|
-
- ✅ Using `_query_by_index()` for queries
|
|
52
|
-
- ✅ Complete before/after examples
|
|
53
|
-
|
|
54
|
-
3. **Data Mapping Patterns**
|
|
55
|
-
- ✅ Using `.map()` method
|
|
56
|
-
- ✅ Avoiding manual iteration
|
|
57
|
-
- ✅ List comprehension examples
|
|
58
|
-
|
|
59
|
-
4. **Lambda Handler Patterns**
|
|
60
|
-
- ✅ Using `create_handler()` framework
|
|
61
|
-
- ✅ Complete handler example
|
|
62
|
-
|
|
63
|
-
5. **Error Handling**
|
|
64
|
-
- ✅ ServiceResult pattern
|
|
65
|
-
- ✅ Exception wrapping
|
|
66
|
-
|
|
67
|
-
6. **Testing Standards**
|
|
68
|
-
- ✅ pytest with moto
|
|
69
|
-
- ✅ Fixture patterns
|
|
70
|
-
|
|
71
|
-
**Summary Checklist** included at end of document.
|
|
72
|
-
|
|
73
|
-
---
|
|
74
|
-
|
|
75
|
-
## 🔧 Code Fixes Applied
|
|
76
|
-
|
|
77
|
-
### Fixed: NotificationService
|
|
78
|
-
|
|
79
|
-
**File:** `src/geek_cafe_saas_sdk/domains/notifications/services/notification_service.py`
|
|
80
|
-
|
|
81
|
-
#### Fix 1: get_user_preferences() - Line 270
|
|
82
|
-
|
|
83
|
-
**Before:**
|
|
84
|
-
```python
|
|
85
|
-
prefs = NotificationPreference()
|
|
86
|
-
prefs.load_from_dictionary(result["Item"])
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
**After:**
|
|
90
|
-
```python
|
|
91
|
-
# Use .map() instead of load_from_dictionary
|
|
92
|
-
prefs = NotificationPreference().map(result["Item"])
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
#### Fix 2: list_webhook_subscriptions() - Line 471
|
|
96
|
-
|
|
97
|
-
**Before:**
|
|
98
|
-
```python
|
|
99
|
-
subscription = WebhookSubscription()
|
|
100
|
-
subscription.load_from_dictionary(item)
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
**After:**
|
|
104
|
-
```python
|
|
105
|
-
# Use .map() instead of load_from_dictionary
|
|
106
|
-
subscription = WebhookSubscription().map(item)
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
---
|
|
110
|
-
|
|
111
|
-
## 📊 Audit Results
|
|
112
|
-
|
|
113
|
-
### Pattern Usage Analysis
|
|
114
|
-
|
|
115
|
-
**Searched for:** `load_from_dictionary`
|
|
116
|
-
- ✅ **Fixed:** 2 instances in NotificationService
|
|
117
|
-
- ⚠️ **Remaining:** 1 instance in BaseModel (method definition - OK)
|
|
118
|
-
|
|
119
|
-
**Searched for:** Manual key iteration (`for key, value in dict.items()`)
|
|
120
|
-
- ✅ **Reviewed:** All instances are for **kwargs** or **updates** dictionaries
|
|
121
|
-
- ✅ **Appropriate:** These are NOT database items, pattern is correct for optional field setting
|
|
122
|
-
|
|
123
|
-
### Key Insight
|
|
124
|
-
|
|
125
|
-
The iteration pattern `for key, value in kwargs.items()` is **appropriate** when:
|
|
126
|
-
- ✅ Setting optional fields from `**kwargs` in constructors
|
|
127
|
-
- ✅ Applying partial updates from `updates` dictionary
|
|
128
|
-
- ✅ Not loading full database items
|
|
129
|
-
|
|
130
|
-
The `.map()` pattern is **required** when:
|
|
131
|
-
- ✅ Loading items from DynamoDB
|
|
132
|
-
- ✅ Populating model from complete dictionary representation
|
|
133
|
-
|
|
134
|
-
---
|
|
135
|
-
|
|
136
|
-
## ✅ Compliance Status
|
|
137
|
-
|
|
138
|
-
### Models
|
|
139
|
-
- ✅ All 7 recent models have `_setup_indexes()`
|
|
140
|
-
- ✅ All models inherit from `BaseModel`
|
|
141
|
-
- ✅ All models import `DynamoDBIndex`, `DynamoDBKey`
|
|
142
|
-
|
|
143
|
-
### Services
|
|
144
|
-
- ✅ SubscriptionManagerService uses helper methods
|
|
145
|
-
- ✅ NotificationService uses helper methods
|
|
146
|
-
- ✅ All services use `.map()` for database items
|
|
147
|
-
|
|
148
|
-
### Lambda Handlers
|
|
149
|
-
- ✅ All handlers use `create_handler()` framework
|
|
150
|
-
- ✅ No manual request parsing
|
|
151
|
-
|
|
152
|
-
### Error Handling
|
|
153
|
-
- ✅ All service methods return `ServiceResult[T]`
|
|
154
|
-
- ✅ Exceptions wrapped in `ServiceResult.exception_result()`
|
|
155
|
-
|
|
156
|
-
---
|
|
157
|
-
|
|
158
|
-
## 🎓 How This Works Going Forward
|
|
159
|
-
|
|
160
|
-
### For AI Assistant (Cascade)
|
|
161
|
-
|
|
162
|
-
1. **Before any code changes**, I automatically retrieve these global rules from memory
|
|
163
|
-
2. **During implementation**, I follow the patterns defined in the rules
|
|
164
|
-
3. **If uncertain**, I reference `CODING_STANDARDS.md` for examples
|
|
165
|
-
|
|
166
|
-
### For Developers
|
|
167
|
-
|
|
168
|
-
1. **New to project?** Read `docs/guidelines/CODING_STANDARDS.md`
|
|
169
|
-
2. **Writing models?** Add `_setup_indexes()` method
|
|
170
|
-
3. **Writing services?** Use `_save_model()`, `_get_model_by_id()`, `_query_by_index()`
|
|
171
|
-
4. **Loading database items?** Use `.map()` not iteration
|
|
172
|
-
5. **Code review?** Check against the summary checklist
|
|
173
|
-
|
|
174
|
-
### For Code Reviews
|
|
175
|
-
|
|
176
|
-
The `CODING_STANDARDS.md` document provides:
|
|
177
|
-
- ✅ Clear examples of correct vs incorrect patterns
|
|
178
|
-
- ✅ Rationale for each pattern
|
|
179
|
-
- ✅ Summary checklist for reviewers
|
|
180
|
-
|
|
181
|
-
---
|
|
182
|
-
|
|
183
|
-
## 📤 Sharing Across Projects
|
|
184
|
-
|
|
185
|
-
The `docs/guidelines/CODING_STANDARDS.md` file can be:
|
|
186
|
-
- **Copied** to other projects as-is
|
|
187
|
-
- **Adapted** for project-specific patterns
|
|
188
|
-
- **Referenced** in onboarding documentation
|
|
189
|
-
- **Linked** in PR templates
|
|
190
|
-
|
|
191
|
-
**To use in another project:**
|
|
192
|
-
```bash
|
|
193
|
-
# Copy to new project
|
|
194
|
-
cp docs/guidelines/CODING_STANDARDS.md \
|
|
195
|
-
/path/to/other-project/docs/guidelines/
|
|
196
|
-
|
|
197
|
-
# Reference in PR template
|
|
198
|
-
echo "- [ ] Code follows patterns in [CODING_STANDARDS.md](docs/guidelines/CODING_STANDARDS.md)" \
|
|
199
|
-
>> .github/pull_request_template.md
|
|
200
|
-
```
|
|
201
|
-
|
|
202
|
-
---
|
|
203
|
-
|
|
204
|
-
## 🔮 Future Enhancements
|
|
205
|
-
|
|
206
|
-
Potential additions to standards:
|
|
207
|
-
- Security patterns (input validation, sanitization)
|
|
208
|
-
- Performance patterns (caching, batching)
|
|
209
|
-
- Observability patterns (logging, metrics)
|
|
210
|
-
- API design patterns (REST conventions)
|
|
211
|
-
|
|
212
|
-
---
|
|
213
|
-
|
|
214
|
-
## 📈 Impact
|
|
215
|
-
|
|
216
|
-
### Immediate Benefits
|
|
217
|
-
- ✅ Consistent codebase patterns
|
|
218
|
-
- ✅ Easier onboarding for new developers
|
|
219
|
-
- ✅ Clearer code reviews
|
|
220
|
-
- ✅ Reduced bugs from pattern violations
|
|
221
|
-
|
|
222
|
-
### Long-term Benefits
|
|
223
|
-
- ✅ Maintainable codebase
|
|
224
|
-
- ✅ Easier refactoring
|
|
225
|
-
- ✅ Knowledge transfer across team
|
|
226
|
-
- ✅ Pattern reuse across projects
|
|
227
|
-
|
|
228
|
-
---
|
|
229
|
-
|
|
230
|
-
## 🎉 Summary
|
|
231
|
-
|
|
232
|
-
**Implementation Complete:**
|
|
233
|
-
- ✅ 3 global rules created in memory system
|
|
234
|
-
- ✅ Comprehensive CODING_STANDARDS.md document created
|
|
235
|
-
- ✅ 2 code violations fixed
|
|
236
|
-
- ✅ All recent code audited for compliance
|
|
237
|
-
- ✅ Shareable documentation for other projects
|
|
238
|
-
|
|
239
|
-
**The codebase now has:**
|
|
240
|
-
- Consistent model index patterns
|
|
241
|
-
- Consistent service query patterns
|
|
242
|
-
- Consistent data mapping patterns
|
|
243
|
-
- Clear documentation for all developers
|
|
244
|
-
|
|
245
|
-
**Future work will automatically follow these patterns!** 🚀
|
|
246
|
-
|
|
247
|
-
---
|
|
248
|
-
|
|
249
|
-
**Status:** COMPLETE ✅
|
|
250
|
-
**Documentation:** docs/guidelines/CODING_STANDARDS.md
|
|
251
|
-
**Global Rules:** Stored in memory system
|
|
252
|
-
**Code Fixes:** 2/2 applied
|