geek-cafe-saas-sdk 0.42.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 (378) hide show
  1. geek_cafe_saas_sdk-0.42.0/.env.mock +22 -0
  2. geek_cafe_saas_sdk-0.42.0/.gitignore +156 -0
  3. geek_cafe_saas_sdk-0.42.0/.windsurf/rules/cascade.yaml +9 -0
  4. geek_cafe_saas_sdk-0.42.0/ARCHITECTURE.md +285 -0
  5. geek_cafe_saas_sdk-0.42.0/CHANGELOG.md +467 -0
  6. geek_cafe_saas_sdk-0.42.0/CHANGELOG_0.4.1.md +145 -0
  7. geek_cafe_saas_sdk-0.42.0/CONFIG.md +233 -0
  8. geek_cafe_saas_sdk-0.42.0/LICENSE +47 -0
  9. geek_cafe_saas_sdk-0.42.0/PKG-INFO +397 -0
  10. geek_cafe_saas_sdk-0.42.0/QUICK_CONFIG_REFERENCE.md +84 -0
  11. geek_cafe_saas_sdk-0.42.0/README.md +322 -0
  12. geek_cafe_saas_sdk-0.42.0/SERVICE_FIX_PATTERNS.md +265 -0
  13. geek_cafe_saas_sdk-0.42.0/TEST_FAILURE_ANALYSIS.md +127 -0
  14. geek_cafe_saas_sdk-0.42.0/coverage.json +1 -0
  15. geek_cafe_saas_sdk-0.42.0/examples/decorator_pattern_handlers.py +497 -0
  16. geek_cafe_saas_sdk-0.42.0/examples/factory_authorization_example.py +431 -0
  17. geek_cafe_saas_sdk-0.42.0/examples/file_lineage_example.py +223 -0
  18. geek_cafe_saas_sdk-0.42.0/examples/hierarchical_routing_handler_example.py +434 -0
  19. geek_cafe_saas_sdk-0.42.0/examples/lambda_event_logging_example.py +324 -0
  20. geek_cafe_saas_sdk-0.42.0/examples/lambda_handler_examples.py +356 -0
  21. geek_cafe_saas_sdk-0.42.0/examples/lambda_handlers/api_key_example.py +144 -0
  22. geek_cafe_saas_sdk-0.42.0/examples/website_analytics_example.py +323 -0
  23. geek_cafe_saas_sdk-0.42.0/lambda_handlers/auth/confirm_forgot_password/app.py +145 -0
  24. geek_cafe_saas_sdk-0.42.0/lambda_handlers/auth/forgot_password/app.py +125 -0
  25. geek_cafe_saas_sdk-0.42.0/lambda_handlers/users/change_password/app.py +154 -0
  26. geek_cafe_saas_sdk-0.42.0/lambda_handlers/users/reset_password/app.py +141 -0
  27. geek_cafe_saas_sdk-0.42.0/publish_to_pypi.py +706 -0
  28. geek_cafe_saas_sdk-0.42.0/publish_to_pypi.sh +104 -0
  29. geek_cafe_saas_sdk-0.42.0/pyproject.toml +66 -0
  30. geek_cafe_saas_sdk-0.42.0/pysetup.py +2531 -0
  31. geek_cafe_saas_sdk-0.42.0/pysetup.sh +77 -0
  32. geek_cafe_saas_sdk-0.42.0/requirements.dev.txt +17 -0
  33. geek_cafe_saas_sdk-0.42.0/requirements.txt +3 -0
  34. geek_cafe_saas_sdk-0.42.0/run_unit_tests.sh +110 -0
  35. geek_cafe_saas_sdk-0.42.0/scripts/migrate_tests_auto_extraction.py +212 -0
  36. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/__init__.py +12 -0
  37. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/__init__.py +64 -0
  38. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/access/__init__.py +49 -0
  39. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/access/access_checker.py +463 -0
  40. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/access/resource_share_checker.py +216 -0
  41. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/anonymous_context.py +337 -0
  42. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/audit/__init__.py +66 -0
  43. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/audit/audit_event.py +37 -0
  44. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/audit/audit_log_model.py +220 -0
  45. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/audit/audit_logger_factory.py +253 -0
  46. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/audit/audit_logger_protocol.py +152 -0
  47. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/audit/composite_audit_logger.py +230 -0
  48. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/audit/dynamodb_audit_logger.py +442 -0
  49. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/audit/noop_audit_logger.py +102 -0
  50. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/audit/s3_audit_logger.py +326 -0
  51. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/audit_mixin.py +33 -0
  52. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/chaos_config.py +171 -0
  53. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/connection_pool.py +155 -0
  54. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/error_codes.py +132 -0
  55. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/field_transformer.py +215 -0
  56. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/handlers/resource_meta/app.py +70 -0
  57. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/model_field_validator.py +203 -0
  58. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/models/__init__.py +20 -0
  59. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/models/base_async_event_model.py +30 -0
  60. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/models/base_model.py +521 -0
  61. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/models/base_tenant_model.py +19 -0
  62. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/models/base_tenant_user_model.py +22 -0
  63. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/models/base_user_model.py +50 -0
  64. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/models/keyword_search.py +369 -0
  65. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/models/resource_meta_entry.py +207 -0
  66. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/request_context.py +461 -0
  67. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/role_mapper.py +192 -0
  68. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/service_errors.py +19 -0
  69. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/service_interfaces.py +535 -0
  70. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/service_result.py +181 -0
  71. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/services/__init__.py +36 -0
  72. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/services/database_service.py +1089 -0
  73. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/services/feature_flag_service.py +257 -0
  74. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/services/keyword_search_service.py +571 -0
  75. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/services/lambda_service_factory.py +79 -0
  76. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/services/resource_meta_entry_service.py +426 -0
  77. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/services_container.py +393 -0
  78. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/system_request_context.py +146 -0
  79. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/tenant_settings.py +122 -0
  80. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/core/validation_result.py +189 -0
  81. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/decorators/__init__.py +64 -0
  82. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/decorators/auth.py +373 -0
  83. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/decorators/core.py +359 -0
  84. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/lambda_handlers/README.md +381 -0
  85. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/lambda_handlers/__init__.py +81 -0
  86. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/lambda_handlers/_base/__init__.py +25 -0
  87. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/lambda_handlers/_base/api_key_handler.py +129 -0
  88. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/lambda_handlers/_base/authorized_secure_handler.py +218 -0
  89. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/lambda_handlers/_base/base_handler.py +563 -0
  90. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/lambda_handlers/_base/decorators.py +276 -0
  91. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/lambda_handlers/_base/environment_loader.py +24 -0
  92. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/lambda_handlers/_base/handler_factory.py +274 -0
  93. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/lambda_handlers/_base/lambda_event.py +422 -0
  94. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/lambda_handlers/_base/public_handler.py +53 -0
  95. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/lambda_handlers/_base/secure_handler.py +89 -0
  96. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/lambda_handlers/_base/service_pool.py +239 -0
  97. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/middleware/__init__.py +36 -0
  98. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/middleware/auth.py +99 -0
  99. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/middleware/authorization.py +523 -0
  100. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/middleware/cors.py +63 -0
  101. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/middleware/error_handling.py +114 -0
  102. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/middleware/validation.py +80 -0
  103. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/__init__.py +0 -0
  104. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/analytics/__init__.py +0 -0
  105. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/analytics/handlers/__init__.py +0 -0
  106. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/analytics/models/__init__.py +9 -0
  107. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/analytics/models/website_analytics.py +217 -0
  108. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/analytics/models/website_analytics_summary.py +218 -0
  109. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/analytics/services/__init__.py +11 -0
  110. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/analytics/services/website_analytics_service.py +253 -0
  111. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/analytics/services/website_analytics_summary_service.py +217 -0
  112. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/analytics/services/website_analytics_tally_service.py +645 -0
  113. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/communities/__init__.py +0 -0
  114. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/communities/handlers/__init__.py +0 -0
  115. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/communities/handlers/communities/create/app.py +37 -0
  116. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/communities/handlers/communities/delete/app.py +37 -0
  117. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/communities/handlers/communities/get/app.py +37 -0
  118. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/communities/handlers/communities/list/app.py +37 -0
  119. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/communities/handlers/communities/update/app.py +38 -0
  120. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/communities/models/__init__.py +6 -0
  121. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/communities/models/community.py +314 -0
  122. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/communities/models/community_member.py +226 -0
  123. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/communities/services/__init__.py +6 -0
  124. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/communities/services/community_member_service.py +421 -0
  125. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/communities/services/community_service.py +514 -0
  126. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/events/__init__.py +0 -0
  127. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/events/handlers/__init__.py +0 -0
  128. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/events/handlers/attendees/app.py +27 -0
  129. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/events/handlers/cancel/app.py +20 -0
  130. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/events/handlers/check_in/app.py +18 -0
  131. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/events/handlers/create/app.py +18 -0
  132. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/events/handlers/delete/app.py +18 -0
  133. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/events/handlers/get/app.py +18 -0
  134. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/events/handlers/invite/app.py +28 -0
  135. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/events/handlers/list/app.py +19 -0
  136. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/events/handlers/publish/app.py +18 -0
  137. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/events/handlers/rsvp/app.py +23 -0
  138. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/events/handlers/update/app.py +19 -0
  139. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/events/models/__init__.py +4 -0
  140. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/events/models/event.py +667 -0
  141. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/events/models/event_attendee.py +333 -0
  142. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/events/models/host_user_relationship.py +234 -0
  143. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/events/services/__init__.py +11 -0
  144. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/events/services/event_attendee_service.py +853 -0
  145. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/events/services/event_service.py +674 -0
  146. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/events/services/event_service_lambda_factory.py +174 -0
  147. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/events/services/host_user_relationship_service.py +581 -0
  148. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/executions/__init__.py +19 -0
  149. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/executions/handlers/__init__.py +6 -0
  150. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/executions/handlers/create/app.py +72 -0
  151. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/executions/handlers/get/app.py +36 -0
  152. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/executions/handlers/list/app.py +136 -0
  153. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/executions/handlers/update/app.py +96 -0
  154. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/executions/models/__init__.py +14 -0
  155. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/executions/models/execution.py +641 -0
  156. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/executions/services/__init__.py +12 -0
  157. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/executions/services/execution_service.py +911 -0
  158. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/feature_flags/__init__.py +1 -0
  159. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/feature_flags/models/__init__.py +5 -0
  160. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/feature_flags/models/feature_flag.py +179 -0
  161. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/feature_flags/services/__init__.py +6 -0
  162. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/feature_flags/services/feature_flag_service.py +426 -0
  163. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/__init__.py +0 -0
  164. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/handlers/README.md +446 -0
  165. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/handlers/__init__.py +6 -0
  166. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/handlers/archive/app.py +66 -0
  167. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/handlers/create/app.py +75 -0
  168. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/handlers/delete/app.py +63 -0
  169. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/handlers/directories/create/app.py +79 -0
  170. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/handlers/directories/delete/app.py +76 -0
  171. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/handlers/directories/get/app.py +74 -0
  172. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/handlers/directories/list/app.py +75 -0
  173. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/handlers/directories/move/app.py +79 -0
  174. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/handlers/download/app.py +60 -0
  175. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/handlers/generate_download_url/app.py +83 -0
  176. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/handlers/generate_upload_url/app.py +84 -0
  177. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/handlers/get/app.py +64 -0
  178. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/handlers/lineage/create_derived/app.py +86 -0
  179. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/handlers/lineage/download_bundle/app.py +96 -0
  180. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/handlers/lineage/get_lineage/app.py +64 -0
  181. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/handlers/lineage/prepare_bundle/app.py +73 -0
  182. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/handlers/list/app.py +76 -0
  183. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/handlers/meta/app.py +58 -0
  184. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/handlers/process_upload_event/DEPLOYMENT_EXAMPLES.md +399 -0
  185. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/handlers/process_upload_event/README.md +79 -0
  186. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/handlers/process_upload_event/app.py +255 -0
  187. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/handlers/share/app.py +61 -0
  188. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/handlers/shares/list/app.py +62 -0
  189. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/handlers/shares/revoke/app.py +55 -0
  190. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/handlers/stream/app.py +59 -0
  191. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/handlers/update/app.py +67 -0
  192. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/models/__init__.py +17 -0
  193. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/models/directory.py +278 -0
  194. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/models/file.py +633 -0
  195. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/models/file_version.py +226 -0
  196. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/services/__init__.py +20 -0
  197. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/services/directory_service.py +662 -0
  198. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/services/file_share_service.py +26 -0
  199. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/services/file_system_service.py +1550 -0
  200. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/services/s3_event_parser.py +565 -0
  201. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/services/s3_file_service.py +621 -0
  202. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/file_system/services/s3_path_service.py +240 -0
  203. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/messaging/__init__.py +0 -0
  204. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/messaging/handlers/__init__.py +0 -0
  205. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/messaging/handlers/chat_channels/create/app.py +86 -0
  206. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/messaging/handlers/chat_channels/delete/app.py +61 -0
  207. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/messaging/handlers/chat_channels/get/app.py +54 -0
  208. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/messaging/handlers/chat_channels/list/app.py +81 -0
  209. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/messaging/handlers/chat_channels/update/app.py +145 -0
  210. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/messaging/handlers/chat_messages/create/app.py +60 -0
  211. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/messaging/handlers/chat_messages/delete/app.py +61 -0
  212. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/messaging/handlers/chat_messages/get/app.py +60 -0
  213. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/messaging/handlers/chat_messages/list/app.py +91 -0
  214. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/messaging/handlers/chat_messages/update/app.py +123 -0
  215. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/messaging/handlers/contact_threads/create/app.py +75 -0
  216. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/messaging/handlers/contact_threads/delete/app.py +55 -0
  217. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/messaging/handlers/contact_threads/get/app.py +55 -0
  218. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/messaging/handlers/contact_threads/list/app.py +87 -0
  219. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/messaging/handlers/contact_threads/update/app.py +138 -0
  220. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/messaging/models/__init__.py +13 -0
  221. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/messaging/models/chat_channel.py +337 -0
  222. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/messaging/models/chat_channel_member.py +180 -0
  223. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/messaging/models/chat_message.py +425 -0
  224. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/messaging/models/contact_thread.py +394 -0
  225. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/messaging/services/__init__.py +11 -0
  226. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/messaging/services/chat_channel_service.py +722 -0
  227. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/messaging/services/chat_message_service.py +503 -0
  228. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/messaging/services/contact_thread_service.py +562 -0
  229. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/notifications/__init__.py +18 -0
  230. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/notifications/handlers/__init__.py +1 -0
  231. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/notifications/handlers/create_webhook/app.py +70 -0
  232. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/notifications/handlers/get/app.py +37 -0
  233. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/notifications/handlers/get_preferences/app.py +31 -0
  234. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/notifications/handlers/list/app.py +40 -0
  235. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/notifications/handlers/list_webhooks/app.py +37 -0
  236. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/notifications/handlers/mark_read/app.py +37 -0
  237. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/notifications/handlers/send/app.py +80 -0
  238. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/notifications/handlers/update_preferences/app.py +42 -0
  239. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/notifications/models/__init__.py +16 -0
  240. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/notifications/models/notification.py +720 -0
  241. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/notifications/models/notification_preference.py +365 -0
  242. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/notifications/models/webhook_subscription.py +340 -0
  243. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/notifications/services/__init__.py +10 -0
  244. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/notifications/services/notification_service.py +595 -0
  245. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/payments/__init__.py +16 -0
  246. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/payments/handlers/README.md +334 -0
  247. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/payments/handlers/__init__.py +6 -0
  248. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/payments/handlers/billing_accounts/create/app.py +102 -0
  249. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/payments/handlers/billing_accounts/get/app.py +57 -0
  250. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/payments/handlers/billing_accounts/update/app.py +94 -0
  251. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/payments/handlers/payment_intents/create/app.py +94 -0
  252. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/payments/handlers/payment_intents/get/app.py +57 -0
  253. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/payments/handlers/payments/get/app.py +57 -0
  254. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/payments/handlers/payments/list/app.py +65 -0
  255. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/payments/handlers/payments/record/app.py +115 -0
  256. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/payments/handlers/refunds/create/app.py +86 -0
  257. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/payments/handlers/refunds/get/app.py +57 -0
  258. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/payments/models/__init__.py +17 -0
  259. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/payments/models/billing_account.py +524 -0
  260. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/payments/models/payment.py +642 -0
  261. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/payments/models/payment_intent_ref.py +542 -0
  262. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/payments/models/refund.py +407 -0
  263. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/payments/services/__init__.py +11 -0
  264. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/payments/services/payment_service.py +425 -0
  265. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/projects/__init__.py +43 -0
  266. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/projects/models/__init__.py +26 -0
  267. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/projects/models/actor_role_definition.py +167 -0
  268. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/projects/models/project.py +397 -0
  269. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/projects/models/project_activity.py +247 -0
  270. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/projects/models/project_actor.py +171 -0
  271. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/projects/models/project_milestone.py +198 -0
  272. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/projects/models/project_task.py +344 -0
  273. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/projects/models/project_workflow.py +191 -0
  274. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/projects/models/workflow_step.py +225 -0
  275. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/projects/services/__init__.py +21 -0
  276. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/projects/services/activity_service.py +252 -0
  277. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/projects/services/actor_service.py +518 -0
  278. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/projects/services/milestone_service.py +466 -0
  279. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/projects/services/project_service.py +726 -0
  280. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/projects/services/task_service.py +591 -0
  281. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/projects/services/workflow_service.py +714 -0
  282. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/resource_shares/__init__.py +14 -0
  283. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/resource_shares/models/__init__.py +12 -0
  284. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/resource_shares/models/resource_share.py +308 -0
  285. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/resource_shares/services/__init__.py +12 -0
  286. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/resource_shares/services/resource_share_service.py +418 -0
  287. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/subscriptions/__init__.py +19 -0
  288. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/subscriptions/handlers/README.md +408 -0
  289. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/subscriptions/handlers/__init__.py +1 -0
  290. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/subscriptions/handlers/addons/create/app.py +78 -0
  291. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/subscriptions/handlers/addons/get/app.py +45 -0
  292. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/subscriptions/handlers/addons/list/app.py +51 -0
  293. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/subscriptions/handlers/addons/update/app.py +51 -0
  294. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/subscriptions/handlers/discounts/create/app.py +80 -0
  295. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/subscriptions/handlers/discounts/get/app.py +44 -0
  296. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/subscriptions/handlers/discounts/validate/app.py +59 -0
  297. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/subscriptions/handlers/plans/create/app.py +79 -0
  298. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/subscriptions/handlers/plans/get/app.py +45 -0
  299. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/subscriptions/handlers/plans/list/app.py +63 -0
  300. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/subscriptions/handlers/plans/update/app.py +51 -0
  301. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/subscriptions/handlers/usage/aggregate/app.py +69 -0
  302. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/subscriptions/handlers/usage/record/app.py +86 -0
  303. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/subscriptions/models/__init__.py +13 -0
  304. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/subscriptions/models/addon.py +604 -0
  305. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/subscriptions/models/discount.py +492 -0
  306. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/subscriptions/models/plan.py +569 -0
  307. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/subscriptions/models/usage_record.py +300 -0
  308. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/subscriptions/services/__init__.py +10 -0
  309. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/subscriptions/services/subscription_manager_service.py +692 -0
  310. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/tenancy/__init__.py +0 -0
  311. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/tenancy/handlers/__init__.py +0 -0
  312. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/tenancy/handlers/subscriptions/activate/app.py +52 -0
  313. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/tenancy/handlers/subscriptions/active/app.py +42 -0
  314. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/tenancy/handlers/subscriptions/cancel/app.py +58 -0
  315. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/tenancy/handlers/subscriptions/get/app.py +44 -0
  316. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/tenancy/handlers/subscriptions/list/app.py +46 -0
  317. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/tenancy/handlers/subscriptions/record_payment/app.py +58 -0
  318. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/tenancy/handlers/tenants/get/app.py +44 -0
  319. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/tenancy/handlers/tenants/me/app.py +44 -0
  320. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/tenancy/handlers/tenants/signup/app.py +66 -0
  321. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/tenancy/handlers/tenants/update/app.py +44 -0
  322. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/tenancy/models/__init__.py +6 -0
  323. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/tenancy/models/subscription.py +561 -0
  324. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/tenancy/models/tenant.py +283 -0
  325. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/tenancy/services/__init__.py +6 -0
  326. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/tenancy/services/subscription_service.py +815 -0
  327. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/tenancy/services/tenant_service.py +611 -0
  328. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/users/__init__.py +0 -0
  329. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/users/handlers/__init__.py +0 -0
  330. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/users/handlers/users/create/app.py +38 -0
  331. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/users/handlers/users/delete/app.py +37 -0
  332. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/users/handlers/users/get/app.py +37 -0
  333. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/users/handlers/users/list/app.py +37 -0
  334. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/users/handlers/users/update/app.py +38 -0
  335. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/users/models/__init__.py +13 -0
  336. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/users/models/permission.py +134 -0
  337. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/users/models/resource_permission.py +245 -0
  338. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/users/models/role.py +213 -0
  339. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/users/models/user.py +416 -0
  340. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/users/services/__init__.py +16 -0
  341. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/users/services/authorization_service.py +406 -0
  342. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/users/services/permission_registry.py +464 -0
  343. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/users/services/resource_permission_service.py +435 -0
  344. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/users/services/user_service.py +434 -0
  345. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/voting/__init__.py +0 -0
  346. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/voting/handlers/__init__.py +0 -0
  347. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/voting/handlers/votes/create/app.py +119 -0
  348. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/voting/handlers/votes/delete/app.py +44 -0
  349. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/voting/handlers/votes/get/app.py +44 -0
  350. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/voting/handlers/votes/list/app.py +46 -0
  351. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/voting/handlers/votes/summerize/README.md +3 -0
  352. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/voting/handlers/votes/update/app.py +44 -0
  353. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/voting/models/__init__.py +9 -0
  354. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/voting/models/vote.py +232 -0
  355. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/voting/models/vote_summary.py +196 -0
  356. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/voting/services/__init__.py +11 -0
  357. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/voting/services/vote_service.py +250 -0
  358. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/voting/services/vote_summary_service.py +196 -0
  359. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/modules/voting/services/vote_tally_service.py +543 -0
  360. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/utilities/__init__.py +88 -0
  361. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/utilities/case_conversion.py +381 -0
  362. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/utilities/cognito_utility.py +558 -0
  363. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/utilities/custom_exceptions.py +183 -0
  364. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/utilities/datetime_utility.py +419 -0
  365. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/utilities/dictionary_utility.py +78 -0
  366. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/utilities/dynamodb_utils.py +151 -0
  367. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/utilities/environment_loader.py +149 -0
  368. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/utilities/environment_variables.py +244 -0
  369. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/utilities/http_body_parameters.py +44 -0
  370. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/utilities/http_path_parameters.py +60 -0
  371. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/utilities/http_status_code.py +63 -0
  372. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/utilities/jwt_utility.py +234 -0
  373. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/utilities/lambda_event_utility.py +776 -0
  374. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/utilities/logging_utility.py +141 -0
  375. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/utilities/message_query_helper.py +340 -0
  376. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/utilities/response.py +350 -0
  377. geek_cafe_saas_sdk-0.42.0/src/geek_cafe_saas_sdk/utilities/string_functions.py +180 -0
  378. geek_cafe_saas_sdk-0.42.0/update_readme_badges.py +195 -0
@@ -0,0 +1,22 @@
1
+ # let's make sure we don't hit any actual aws resources
2
+ # when running moto mock tests
3
+ AWS_ACCESS_KEY_ID="testing"
4
+ AWS_SECRET_ACCESS_KEY="testing"
5
+ AWS_SECURITY_TOKEN="testing"
6
+ AWS_SESSION_TOKEN="testing"
7
+ AWS_DEFAULT_REGION="us-east-1"
8
+ AWS_REGION="us-east-1"
9
+ # So far it looks like I need a profile or I get an error like the one below
10
+ # "The config profile (<profile>) could not be found"
11
+ # "The config profile () could not be found" <- if using the default profile
12
+ # AWS_PROFILE="default"
13
+ # AWS_DEFAULT_PROFILE="default"
14
+ # I don't want to use default profile, so I'm using a mock profile
15
+ # However it must exist in ~/.aws/config or you'll get the same error above
16
+ AWS_PROFILE="moto-mock-tests"
17
+ AWS_DEFAULT_PROFILE="moto-mock-tests"
18
+
19
+ COGNITO_USER_POOL="us-east-1_ABC123"
20
+ COGNITO_CLIENT_ID="fake-client-id"
21
+ DYNAMODB_TABLE_NAME="geek_cafe_main"
22
+ AWS_REGION="us-east-1"
@@ -0,0 +1,156 @@
1
+
2
+ # Byte-compiled / optimized / DLL files
3
+ __pycache__/
4
+ *.py[codz]
5
+ *$py.class
6
+
7
+ # C extensions
8
+ *.so
9
+
10
+ # Distribution / packaging
11
+ .Python
12
+ build/
13
+ develop-eggs/
14
+ dist/
15
+ downloads/
16
+ eggs/
17
+ .eggs/
18
+ lib/
19
+ lib64/
20
+ parts/
21
+ sdist/
22
+ var/
23
+ wheels/
24
+ share/python-wheels/
25
+ *.egg-info/
26
+ .installed.cfg
27
+ *.egg
28
+ MANIFEST
29
+
30
+ # PyInstaller
31
+ # Usually these files are written by a python script from a template
32
+ # before PyInstaller builds the exe, so as to inject date/other infos into it.
33
+ *.manifest
34
+ *.spec
35
+
36
+ # Installer logs
37
+ pip-log.txt
38
+ pip-delete-this-directory.txt
39
+
40
+ # Unit test / coverage reports
41
+ htmlcov/
42
+ .tox/
43
+ .nox/
44
+ .coverage
45
+ .coverage.*
46
+ .cache
47
+ nosetests.xml
48
+ coverage.xml
49
+ *.cover
50
+ *.py.cover
51
+ .hypothesis/
52
+ .pytest_cache/
53
+ cover/
54
+ reports/
55
+
56
+ # Translations
57
+ *.mo
58
+ *.pot
59
+
60
+ # Django stuff:
61
+ *.log
62
+ local_settings.py
63
+ db.sqlite3
64
+ db.sqlite3-journal
65
+
66
+ # Flask stuff:
67
+ instance/
68
+ .webassets-cache
69
+
70
+ # Scrapy stuff:
71
+ .scrapy
72
+
73
+ # Sphinx documentation
74
+ docs/_build/
75
+
76
+ # PyBuilder
77
+ .pybuilder/
78
+ target/
79
+
80
+ # Jupyter Notebook
81
+ .ipynb_checkpoints
82
+
83
+ # IPython
84
+ profile_default/
85
+ ipython_config.py
86
+
87
+ # pyenv
88
+ # For a library or package, you might want to ignore these files since the code is
89
+ # intended to run in multiple environments; otherwise, check them in:
90
+ # .python-version
91
+
92
+ # pipenv
93
+ # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
94
+ # However, in case of collaboration, if having platform-specific dependencies or dependencies
95
+ # having no cross-platform support, pipenv may install dependencies that don't work, or not
96
+ # install all needed dependencies.
97
+ #Pipfile.lock
98
+
99
+ # poetry
100
+ # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
101
+ # This is especially recommended for binary packages to ensure reproducibility, and is more
102
+ # commonly ignored for libraries.
103
+ # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
104
+ #poetry.lock
105
+
106
+ # Environments
107
+ .env
108
+ .venv
109
+ env/
110
+ venv/
111
+ ENV/
112
+ env.bak/
113
+ venv.bak/
114
+
115
+ # Spyder project settings
116
+ .spyderproject
117
+ .spyproject
118
+
119
+ # Rope project settings
120
+ .ropeproject
121
+
122
+ # mkdocs documentation
123
+ /site
124
+
125
+ # mypy
126
+ .mypy_cache/
127
+ .dmypy.json
128
+ dmypy.json
129
+
130
+ # Pyre type checker
131
+ .pyre/
132
+
133
+ # pytype static type analyzer
134
+ .pytype/
135
+
136
+ # Cython debug symbols
137
+ cython_debug/
138
+
139
+ # PyCharm
140
+ #.idea/
141
+
142
+ # VS Code
143
+ #.vscode/
144
+ # Local configuration
145
+ .pysetup.json
146
+
147
+ activate.sh
148
+ .pypirc
149
+ .prompts
150
+ .DS_Store
151
+ .local
152
+ .windsurf_historical
153
+ .env.production
154
+ .archived
155
+ .output
156
+ .outputs
@@ -0,0 +1,9 @@
1
+ rules:
2
+ - name: Documentation Standards
3
+ path: docs/guidelines/DOCUMENTATION_STANDARDS.md
4
+ description: File naming and structure conventions
5
+ - name: Production Ready
6
+ path: docs/guidelines/PRODUCTION_READY.md
7
+ description: Production ready conventions
8
+ - name: Testing Standards
9
+
@@ -0,0 +1,285 @@
1
+ # Architecture Overview
2
+
3
+ ## Project Structure
4
+
5
+ ```
6
+ geek-cafe-services/
7
+ ├── src/geek_cafe_saas_sdk/
8
+ │ ├── core/ # Foundational types and patterns
9
+ │ │ ├── service_result.py # Standardized service response wrapper
10
+ │ │ ├── service_errors.py # Common error types
11
+ │ │ └── audit_mixin.py # Audit trail functionality
12
+ │ │
13
+ │ ├── models/ # DynamoDB models
14
+ │ │ ├── base_model.py # Base model with common patterns
15
+ │ │ ├── event.py # Event model
16
+ │ │ ├── user.py # User model
17
+ │ │ ├── group.py # Group model
18
+ │ │ ├── message_thread.py # Message thread model
19
+ │ │ ├── vote.py # Vote model
20
+ │ │ └── website_analytics.py # Analytics models
21
+ │ │
22
+ │ ├── services/ # Business logic layer
23
+ │ │ ├── database_service.py # Base database service
24
+ │ │ ├── event_service.py # Event operations
25
+ │ │ ├── user_service.py # User operations
26
+ │ │ ├── group_service.py # Group operations
27
+ │ │ ├── message_thread_service.py # Message operations
28
+ │ │ ├── vote_service.py # Vote operations
29
+ │ │ └── vote_tally_service.py # Vote aggregation
30
+ │ │
31
+ │ ├── lambda_handlers/ # AWS Lambda handlers
32
+ │ │ ├── _base/ # Internal base handlers
33
+ │ │ │ ├── base_handler.py
34
+ │ │ │ ├── api_key_handler.py
35
+ │ │ │ ├── public_handler.py
36
+ │ │ │ └── service_pool.py
37
+ │ │ ├── events/ # ✅ Complete CRUDL
38
+ │ │ ├── users/ # ✅ Complete CRUDL
39
+ │ │ ├── groups/ # ✅ Complete CRUDL
40
+ │ │ ├── messages/ # ✅ Complete CRUDL
41
+ │ │ └── votes/ # ✅ Complete CRUDL
42
+ │ │
43
+ │ ├── middleware/ # Cross-cutting concerns
44
+ │ │ ├── auth.py # Authentication middleware
45
+ │ │ ├── cors.py # CORS handling
46
+ │ │ ├── error_handling.py # Error middleware
47
+ │ │ └── validation.py # Request validation
48
+ │ │
49
+ │ └── utilities/ # Helper utilities
50
+ │ ├── response.py # HTTP response builders
51
+ │ ├── lambda_event_utility.py # Lambda event parsing
52
+ │ ├── dynamodb_utils.py # DynamoDB helpers
53
+ │ ├── jwt_utility.py # JWT handling
54
+ │ └── custom_exceptions.py # Custom exceptions
55
+
56
+ ├── tests/ # Test suite
57
+ │ ├── common/ # Shared test utilities
58
+ │ ├── test_*_service.py # Service tests
59
+ │ ├── test_lambda_handlers/ # Handler integration tests
60
+ │ └── test_*.py # Various test files
61
+
62
+ └── docs/ # Documentation
63
+ ├── api/ # API documentation
64
+ ├── guides/ # Usage guides
65
+ └── services/ # Service documentation
66
+ ```
67
+
68
+ ## Design Principles
69
+
70
+ ### 1. Multi-Tenant by Default
71
+ Every resource is scoped by `tenant_id`, ensuring complete data isolation between customers.
72
+
73
+ ```python
74
+ from geek_cafe_saas_sdk.core.request_context import RequestContext
75
+
76
+ # Services use RequestContext for automatic tenant/user isolation
77
+ request_context = RequestContext(event) # Extracts from JWT
78
+
79
+ event_service = EventService(
80
+ dynamodb=db,
81
+ table_name=TABLE_NAME,
82
+ request_context=request_context # Enforces tenant isolation
83
+ )
84
+
85
+ # Service methods use context internally - security is automatic
86
+ result = event_service.create(payload={
87
+ 'title': 'My Event',
88
+ 'description': '...'
89
+ })
90
+ ```
91
+
92
+ ### 2. Consistent Service Pattern
93
+ All services follow the same pattern:
94
+
95
+ - **ServiceResult wrapper**: Consistent return type for success/error handling
96
+ - **CRUD operations**: Create, Read, Update, Delete with soft deletes
97
+ - **Access control**: Built-in tenant and user validation
98
+ - **Error handling**: Standardized error responses
99
+
100
+ ```python
101
+ # Every service method returns ServiceResult
102
+ result: ServiceResult[Event] = service.create(...)
103
+
104
+ if result.success:
105
+ event = result.data
106
+ else:
107
+ error = result.error
108
+ ```
109
+
110
+ ### 3. Lambda Handler Infrastructure
111
+
112
+ **Base Handlers** (`_base/`)
113
+ - `BaseLambdaHandler`: Core handler functionality
114
+ - `ApiKeyLambdaHandler`: Adds API key validation
115
+ - `PublicLambdaHandler`: No authentication required
116
+ - `ServicePool`: Connection pooling for warm starts
117
+
118
+ **Resource Handlers** (events, users, groups, messages, votes)
119
+ - Each resource has complete CRUDL operations
120
+ - Consistent authentication via Cognito JWT
121
+ - Service pooling for performance
122
+ - Testability via service injection
123
+
124
+ ### 4. DynamoDB Optimization
125
+
126
+ **Single Table Design**
127
+ - One table for all resources
128
+ - Efficient GSI indexes for common queries
129
+ - Tenant-isolated partitions
130
+
131
+ **Key Patterns**
132
+ ```python
133
+ # Primary Key (PK/SK)
134
+ PK: "TENANT#{tenant_id}"
135
+ SK: "EVENT#{event_id}"
136
+
137
+ # GSI for user queries
138
+ GSI1PK: "USER#{user_id}"
139
+ GSI1SK: "ts#{timestamp}"
140
+ ```
141
+
142
+ ### 5. Testing Strategy
143
+
144
+ **Integration Tests**
145
+ - Use `moto` for DynamoDB mocking
146
+ - Service injection for handler testing
147
+ - Complete end-to-end workflows
148
+
149
+ **Test Fixtures**
150
+ - `db_helpers.py`: DynamoDB setup helpers
151
+ - `lambda_helpers.py`: Event builders and test utilities
152
+
153
+ ```python
154
+ # Clean test pattern
155
+ def test_create_event(integration_setup, helper):
156
+ db, event_service = integration_setup
157
+
158
+ event = helper.build_proxy_event(body={"title": "Test"})
159
+ response = lambda_handler(event, None, injected_service=event_service)
160
+
161
+ assert response['statusCode'] == 201
162
+ ```
163
+
164
+ ## Key Features
165
+
166
+ ### Service Pooling
167
+ Reduces Lambda cold starts by 80-90% through connection reuse:
168
+
169
+ ```python
170
+ # Module level - initialized once
171
+ service_pool = ServicePool(EventService)
172
+
173
+ def lambda_handler(event, context):
174
+ # Reuses service on warm invocations
175
+ service = service_pool.get()
176
+ ```
177
+
178
+ ### Authentication Flow
179
+ 1. API Gateway validates Cognito JWT
180
+ 2. Claims passed in `requestContext.authorizer.claims`
181
+ 3. Handler extracts `custom:user_id` and `custom:tenant_id`
182
+ 4. Service enforces tenant isolation
183
+
184
+ ### Error Handling
185
+ Consistent error responses across all handlers:
186
+
187
+ ```python
188
+ {
189
+ "statusCode": 400,
190
+ "body": {
191
+ "error": "Validation failed",
192
+ "errorCode": "VALIDATION_ERROR"
193
+ }
194
+ }
195
+ ```
196
+
197
+ ### Soft Deletes
198
+ Resources are marked as deleted, not physically removed:
199
+
200
+ ```python
201
+ # Delete operation
202
+ result = service.delete(resource_id, tenant_id, user_id)
203
+ # Sets: deleted=True, deleted_at=timestamp
204
+ ```
205
+
206
+ ## Performance Optimizations
207
+
208
+ 1. **Service Pooling**: Reuse DB connections on warm starts
209
+ 2. **GSI Indexes**: Efficient queries without table scans
210
+ 3. **Batch Operations**: Support for bulk reads/writes
211
+ 4. **Pagination**: Cursor-based pagination for large result sets
212
+
213
+ ## Security Features
214
+
215
+ 1. **Tenant Isolation**: Every query scoped by tenant_id
216
+ 2. **Soft Deletes**: Audit trail preservation
217
+ 3. **Access Control**: User-level permissions per operation
218
+ 4. **JWT Validation**: Via API Gateway authorizer
219
+
220
+ ## Extension Points
221
+
222
+ ### Adding New Resources
223
+
224
+ 1. **Create Model** in `models/`
225
+ 2. **Create Service** in `services/`
226
+ 3. **Create Lambda Handlers** in `lambda_handlers/`
227
+ 4. **Write Tests** following existing patterns
228
+
229
+ ### Custom Middleware
230
+
231
+ Add to `middleware/` and apply to handlers:
232
+
233
+ ```python
234
+ @custom_middleware
235
+ @handle_cors
236
+ @handle_errors
237
+ def lambda_handler(event, context):
238
+ pass
239
+ ```
240
+
241
+ ### Custom Validators
242
+
243
+ Extend validation in `utilities/` or add per-service validation.
244
+
245
+ ## Deployment
246
+
247
+ ### As a Library
248
+ ```bash
249
+ pip install geek-cafe-services
250
+ ```
251
+
252
+ ### Lambda Deployment
253
+ Use CDK-Factory to deploy handlers as part of your platform stacks.
254
+
255
+ ```bash
256
+ # AWS CDK (via CDK-Factory)
257
+ lambda.Function(this, 'EventCreate', {
258
+ code: lambda.Code.fromAsset('lambda_handlers/events/create'),
259
+ handler: 'app.handler'
260
+ })
261
+ ```
262
+
263
+ ## Best Practices
264
+
265
+ 1. ✅ Always use `ServiceResult` for service responses
266
+ 2. ✅ Require `tenant_id` for all operations
267
+ 3. ✅ Use soft deletes, never hard deletes
268
+ 4. ✅ Pool services in Lambda handlers
269
+ 5. ✅ Inject services in tests
270
+ 6. ✅ Follow CRUDL pattern for consistency
271
+ 7. ✅ Document breaking changes until 1.0 GA
272
+
273
+ ## Version Information
274
+
275
+ - **Current Version**: 0.3.0
276
+ - **Python**: 3.13+
277
+ - **Status**: Pre-1.0 (breaking changes possible)
278
+ - **Test Coverage**: 83.7% (482 tests)
279
+
280
+ ## References
281
+
282
+ - **Service Pattern**: `docs/services_pattern.md`
283
+ - **Lambda Handlers**: `docs/api/lambda_handlers.md`
284
+ - **Handler Structure**: `docs/guides/lambda_handler_structure.md`
285
+ - **DynamoDB Models**: `docs/dynamodb_models.md`