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.
Files changed (406) hide show
  1. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/.gitignore +1 -1
  2. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/PKG-INFO +1 -1
  3. geek_cafe_saas_sdk-0.52.0/activate.sh +12 -0
  4. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/pyproject.toml +1 -1
  5. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/pysetup.py +13 -1
  6. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/__init__.py +1 -1
  7. {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
  8. {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
  9. {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
  10. {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
  11. {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
  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
  13. {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
  14. {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
  15. geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/__init__.py +45 -0
  16. geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/handlers/__init__.py +13 -0
  17. geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/handlers/get_status/__init__.py +10 -0
  18. geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/handlers/get_status/app.py +61 -0
  19. geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/handlers/workflow_step_handler.py +358 -0
  20. geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/models/__init__.py +31 -0
  21. {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
  22. geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/models/execution_history.py +380 -0
  23. geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/models/execution_metrics.py +259 -0
  24. geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/models/execution_metrics_summary.py +355 -0
  25. geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/models/step_messages.py +263 -0
  26. geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/models/throttle_config.py +348 -0
  27. geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/models/workflow_step.py +462 -0
  28. geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/services/__init__.py +36 -0
  29. geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/services/execution_history_service.py +522 -0
  30. geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/services/execution_metrics_service.py +472 -0
  31. {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
  32. geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/services/step_dispatch_service.py +446 -0
  33. geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/services/throttle_config_service.py +301 -0
  34. geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/services/throttle_service.py +338 -0
  35. geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/executions/services/workflow_step_service.py +596 -0
  36. {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
  37. {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
  38. {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
  39. {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
  40. {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
  41. geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/file_system/handlers/unarchive/__init__.py +4 -0
  42. geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/file_system/handlers/unarchive/app.py +69 -0
  43. {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
  44. {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
  45. {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
  46. {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
  47. {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
  48. {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
  49. {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
  50. {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
  51. {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
  52. {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
  53. {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
  54. {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
  55. {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
  56. {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
  57. {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
  58. {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
  59. {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
  60. {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
  61. {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
  62. {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
  63. {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
  64. {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
  65. {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
  66. geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/tenancy/models/__init__.py +8 -0
  67. geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/tenancy/models/tenant_privacy_settings.py +205 -0
  68. geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/tenancy/models/tenant_sharing_settings.py +246 -0
  69. geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/tenancy/services/__init__.py +8 -0
  70. {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
  71. geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/tenancy/services/tenant_privacy_settings_service.py +217 -0
  72. {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
  73. geek_cafe_saas_sdk-0.52.0/src/geek_cafe_saas_sdk/modules/tenancy/services/tenant_sharing_settings_service.py +287 -0
  74. {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
  75. {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
  76. {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
  77. {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
  78. {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
  79. {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
  80. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/executions/__init__.py +0 -19
  81. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/executions/handlers/__init__.py +0 -6
  82. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/executions/models/__init__.py +0 -14
  83. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/executions/services/__init__.py +0 -12
  84. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/tenancy/models/__init__.py +0 -6
  85. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/tenancy/services/__init__.py +0 -6
  86. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/.env.mock +0 -0
  87. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/.windsurf/rules/cascade.yaml +0 -0
  88. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/ARCHITECTURE.md +0 -0
  89. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/CHANGELOG.md +0 -0
  90. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/CHANGELOG_0.4.1.md +0 -0
  91. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/CONFIG.md +0 -0
  92. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/LICENSE +0 -0
  93. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/QUICK_CONFIG_REFERENCE.md +0 -0
  94. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/README.md +0 -0
  95. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/SERVICE_FIX_PATTERNS.md +0 -0
  96. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/TEST_FAILURE_ANALYSIS.md +0 -0
  97. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/coverage.json +0 -0
  98. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/examples/decorator_pattern_handlers.py +0 -0
  99. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/examples/factory_authorization_example.py +0 -0
  100. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/examples/file_lineage_example.py +0 -0
  101. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/examples/hierarchical_routing_handler_example.py +0 -0
  102. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/examples/lambda_event_logging_example.py +0 -0
  103. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/examples/lambda_handler_examples.py +0 -0
  104. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/examples/lambda_handlers/api_key_example.py +0 -0
  105. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/examples/website_analytics_example.py +0 -0
  106. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/lambda_handlers/auth/confirm_forgot_password/app.py +0 -0
  107. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/lambda_handlers/auth/forgot_password/app.py +0 -0
  108. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/lambda_handlers/users/change_password/app.py +0 -0
  109. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/lambda_handlers/users/reset_password/app.py +0 -0
  110. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/publish_to_pypi.py +0 -0
  111. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/publish_to_pypi.sh +0 -0
  112. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/pysetup.sh +0 -0
  113. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/requirements.dev.txt +0 -0
  114. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/requirements.txt +0 -0
  115. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/run_unit_tests.sh +0 -0
  116. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/scripts/migrate_tests_auto_extraction.py +0 -0
  117. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/core/__init__.py +0 -0
  118. {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
  119. {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
  120. {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
  121. {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
  122. {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
  123. {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
  124. {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
  125. {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
  126. {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
  127. {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
  128. {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
  129. {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
  130. {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
  131. {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
  132. {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
  133. {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
  134. {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
  135. {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
  136. {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
  137. {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
  138. {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
  139. {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
  140. {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
  141. {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
  142. {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
  143. {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
  144. {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
  145. {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
  146. {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
  147. {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
  148. {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
  149. {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
  150. {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
  151. {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
  152. {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
  153. {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
  154. {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
  155. {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
  156. {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
  157. {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
  158. {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
  159. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/decorators/__init__.py +0 -0
  160. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/decorators/auth.py +0 -0
  161. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/decorators/core.py +0 -0
  162. {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
  163. {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
  164. {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
  165. {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
  166. {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
  167. {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
  168. {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
  169. {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
  170. {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
  171. {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
  172. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/middleware/__init__.py +0 -0
  173. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/middleware/auth.py +0 -0
  174. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/middleware/authorization.py +0 -0
  175. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/middleware/cors.py +0 -0
  176. {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
  177. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/middleware/validation.py +0 -0
  178. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/modules/__init__.py +0 -0
  179. {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
  180. {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
  181. {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
  182. {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
  183. {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
  184. {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
  185. {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
  186. {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
  187. {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
  188. {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
  189. {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
  190. {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
  191. {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
  192. {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
  193. {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
  194. {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
  195. {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
  196. {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
  197. {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
  198. {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
  199. {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
  200. {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
  201. {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
  202. {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
  203. {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
  204. {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
  205. {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
  206. {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
  207. {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
  208. {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
  209. {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
  210. {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
  211. {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
  212. {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
  213. {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
  214. {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
  215. {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
  216. {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
  217. {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
  218. {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
  219. {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
  220. {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
  221. {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
  222. {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
  223. {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
  224. {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
  225. {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
  226. {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
  227. {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
  228. {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
  229. {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
  230. {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
  231. {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
  232. {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
  233. {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
  234. {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
  235. {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
  236. {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
  237. {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
  238. {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
  239. {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
  240. {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
  241. {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
  242. {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
  243. {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
  244. {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
  245. {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
  246. {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
  247. {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
  248. {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
  249. {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
  250. {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
  251. {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
  252. {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
  253. {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
  254. {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
  255. {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
  256. {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
  257. {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
  258. {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
  259. {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
  260. {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
  261. {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
  262. {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
  263. {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
  264. {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
  265. {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
  266. {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
  267. {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
  268. {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
  269. {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
  270. {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
  271. {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
  272. {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
  273. {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
  274. {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
  275. {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
  276. {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
  277. {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
  278. {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
  279. {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
  280. {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
  281. {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
  282. {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
  283. {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
  284. {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
  285. {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
  286. {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
  287. {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
  288. {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
  289. {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
  290. {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
  291. {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
  292. {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
  293. {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
  294. {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
  295. {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
  296. {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
  297. {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
  298. {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
  299. {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
  300. {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
  301. {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
  302. {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
  303. {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
  304. {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
  305. {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
  306. {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
  307. {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
  308. {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
  309. {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
  310. {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
  311. {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
  312. {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
  313. {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
  314. {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
  315. {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
  316. {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
  317. {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
  318. {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
  319. {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
  320. {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
  321. {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
  322. {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
  323. {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
  324. {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
  325. {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
  326. {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
  327. {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
  328. {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
  329. {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
  330. {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
  331. {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
  332. {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
  333. {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
  334. {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
  335. {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
  336. {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
  337. {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
  338. {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
  339. {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
  340. {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
  341. {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
  342. {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
  343. {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
  344. {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
  345. {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
  346. {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
  347. {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
  348. {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
  349. {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
  350. {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
  351. {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
  352. {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
  353. {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
  354. {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
  355. {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
  356. {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
  357. {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
  358. {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
  359. {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
  360. {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
  361. {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
  362. {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
  363. {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
  364. {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
  365. {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
  366. {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
  367. {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
  368. {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
  369. {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
  370. {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
  371. {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
  372. {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
  373. {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
  374. {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
  375. {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
  376. {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
  377. {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
  378. {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
  379. {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
  380. {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
  381. {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
  382. {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
  383. {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
  384. {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
  385. {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
  386. {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
  387. {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
  388. {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
  389. {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
  390. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/utilities/__init__.py +0 -0
  391. {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
  392. {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
  393. {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
  394. {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
  395. {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
  396. {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
  397. {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
  398. {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
  399. {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
  400. {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
  401. {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
  402. {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
  403. {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
  404. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/src/geek_cafe_saas_sdk/utilities/response.py +0 -0
  405. {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
  406. {geek_cafe_saas_sdk-0.42.0 → geek_cafe_saas_sdk-0.52.0}/update_readme_badges.py +0 -0
@@ -144,7 +144,7 @@ cython_debug/
144
144
  # Local configuration
145
145
  .pysetup.json
146
146
 
147
- activate.sh
147
+
148
148
  .pypirc
149
149
  .prompts
150
150
  .DS_Store
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: geek_cafe_saas_sdk
3
- Version: 0.42.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"
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "geek_cafe_saas_sdk"
3
- version = "0.42.0"
3
+ version = "0.52.0"
4
4
  description = "Base Reusable Services for SaaS"
5
5
  authors = [{ name = "Eric Wilson", email = "eric.wilson@geekcafe.com" }]
6
6
  requires-python = ">=3.8"
@@ -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\n\n# Auto-generated by pysetup.py\n# Activates the Python virtual environment\n\nsource {VENV}/bin/activate\n\n# Display Python version and environment info\necho \"\n🐍 Python \$(python --version | cut -d' ' -f2) activated in \$(basename \$VIRTUAL_ENV) environment\"\necho \"\n👉 Run 'deactivate' to exit the virtual environment\"\n")
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)
@@ -3,7 +3,7 @@ Geek Cafe Services - Base Reusable Services for SaaS
3
3
 
4
4
  Version 0.6.0 adds File System Service
5
5
  """
6
- __version__ = "0.42.0"
6
+ __version__ = "0.52.0"
7
7
 
8
8
  # Import main namespaces for easier access
9
9
  from . import core
@@ -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: "metadata"
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._get_model_by_id(model.id, model.__class__)
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._get_model_by_id(id, ModelClass)
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
- # DEPRECATED METHODS - Use _get_by_id() instead
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 automatic model mapping.
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 mapped model instances.
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
- key = model.get_key(index_name).key()
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
- items = [model_class().map(item) for item in data]
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(items)
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 CaseFormat, CaseConverter
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._get_model_by_id(resource_id)
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)