8b37a4db5d
- Generate deterministic event IDs using UUID v5 (SHA1) based on date, band ID, and dance hall ID to ensure idempotent event creation - Add CompletedCallback support for waiting on projections before returning from repository operations - Make CreateEvent idempotent - if event already exists in event store but not in projection, update it instead of failing - Change ApiEvent.ID from int64 to string to match UUID format - Pass projectionManager to repositories for callback support Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>