geek-cafe-saas-sdk 0.7.2__tar.gz → 0.7.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of geek-cafe-saas-sdk might be problematic. Click here for more details.

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