feat(api,web): tier-based session limits and daily turn usage display
Backend Changes:
- Add tier-based max_sessions config (free: 1, basic: 2, premium: 3, elite: 5)
- Add DELETE /api/v1/sessions/{id} endpoint for hard session deletion
- Cascade delete chat messages when session is deleted
- Add GET /api/v1/usage endpoint for daily turn limit info
- Replace hardcoded TIER_LIMITS with config-based ai_calls_per_day
- Handle unlimited (-1) tier in rate limiter service
Frontend Changes:
- Add inline session delete buttons with HTMX on character list
- Add usage_display.html component showing remaining daily turns
- Display usage indicator on character list and game play pages
- Page refresh after session deletion to update UI state
Documentation:
- Update API_REFERENCE.md with new endpoints and tier limits
- Update API_TESTING.md with session endpoint examples
- Update SESSION_MANAGEMENT.md with tier-based limits
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -458,6 +458,59 @@ class ChatMessageService:
|
||||
error=str(e))
|
||||
raise
|
||||
|
||||
def delete_messages_by_session(self, session_id: str) -> int:
|
||||
"""
|
||||
Permanently delete all chat messages associated with a session.
|
||||
|
||||
Used when a session is deleted to clean up associated messages.
|
||||
This is a hard delete - messages are removed from the database entirely.
|
||||
|
||||
Args:
|
||||
session_id: Session ID whose messages should be deleted
|
||||
|
||||
Returns:
|
||||
Number of messages deleted
|
||||
|
||||
Note:
|
||||
This method does not validate ownership because it's called from
|
||||
session_service after ownership has already been validated.
|
||||
"""
|
||||
try:
|
||||
# Query all messages with this session_id
|
||||
messages = self.db.list_rows(
|
||||
table_id='chat_messages',
|
||||
queries=[Query.equal('session_id', session_id)],
|
||||
limit=1000 # Handle up to 1000 messages per session
|
||||
)
|
||||
|
||||
deleted_count = 0
|
||||
for message in messages:
|
||||
try:
|
||||
self.db.delete_document(
|
||||
collection_id='chat_messages',
|
||||
document_id=message.id
|
||||
)
|
||||
deleted_count += 1
|
||||
except Exception as e:
|
||||
logger.warning("Failed to delete individual message",
|
||||
message_id=message.id,
|
||||
session_id=session_id,
|
||||
error=str(e))
|
||||
# Continue deleting other messages
|
||||
|
||||
logger.info("Deleted messages for session",
|
||||
session_id=session_id,
|
||||
deleted_count=deleted_count)
|
||||
|
||||
return deleted_count
|
||||
|
||||
except Exception as e:
|
||||
logger.error("Failed to delete messages by session",
|
||||
session_id=session_id,
|
||||
error=str(e))
|
||||
# Don't raise - session deletion should still proceed
|
||||
return 0
|
||||
|
||||
# Helper Methods
|
||||
|
||||
def _update_recent_messages_preview(
|
||||
|
||||
Reference in New Issue
Block a user