fix(api): delete orphaned sessions when character is deleted

- Add delete_sessions_by_character() method to SessionService that
  cleans up all game sessions associated with a character
- Update delete_character() to hard delete instead of soft delete
- Call session cleanup before deleting character to prevent orphaned data
- Delete associated chat messages when cleaning up sessions
- Update API documentation to reflect new behavior

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-26 10:46:35 -06:00
parent 1b21465dc4
commit 98bb6ab589
4 changed files with 92 additions and 7 deletions

View File

@@ -334,7 +334,10 @@ class CharacterService:
def delete_character(self, character_id: str, user_id: str) -> bool:
"""
Delete a character (soft delete by marking inactive).
Permanently delete a character from the database.
Also cleans up any game sessions associated with the character
to prevent orphaned sessions.
Args:
character_id: Character ID
@@ -354,11 +357,20 @@ class CharacterService:
if not character:
raise CharacterNotFound(f"Character not found: {character_id}")
# Soft delete by marking inactive
self.db.update_document(
# Clean up associated sessions before deleting the character
# Local import to avoid circular dependency (session_service imports character_service)
from app.services.session_service import get_session_service
session_service = get_session_service()
deleted_sessions = session_service.delete_sessions_by_character(character_id)
if deleted_sessions > 0:
logger.info("Cleaned up sessions for deleted character",
character_id=character_id,
sessions_deleted=deleted_sessions)
# Hard delete - permanently remove from database
self.db.delete_document(
collection_id=self.collection_id,
document_id=character_id,
data={'is_active': False}
document_id=character_id
)
logger.info("Character deleted successfully", character_id=character_id)