from typing import List, Optional from datetime import datetime from repos.dao import DAO from models.Idea import Idea class IdeaService: def __init__(self, dao: DAO): self.dao = dao async def create_idea(self, name: str, description: Optional[str], project_id: Optional[str], user_id: str, inspiration_id: Optional[str] = None) -> Idea: idea = Idea( name=name, description=description, project_id=project_id, created_by=user_id, inspiration_id=inspiration_id ) idea_id = await self.dao.ideas.create_idea(idea) idea.id = idea_id return idea async def get_ideas(self, project_id: Optional[str], user_id: str, limit: int = 20, offset: int = 0) -> List[dict]: return await self.dao.ideas.get_ideas(project_id, user_id, limit, offset) async def get_idea(self, idea_id: str) -> Optional[Idea]: return await self.dao.ideas.get_idea(idea_id) async def update_idea(self, idea_id: str, name: Optional[str] = None, description: Optional[str] = None, inspiration_id: Optional[str] = None) -> Optional[Idea]: idea = await self.dao.ideas.get_idea(idea_id) if not idea: return None if name is not None: idea.name = name if description is not None: idea.description = description if inspiration_id is not None: idea.inspiration_id = inspiration_id idea.updated_at = datetime.now() await self.dao.ideas.update_idea(idea) return idea async def delete_idea(self, idea_id: str) -> bool: return await self.dao.ideas.delete_idea(idea_id) async def add_generation_to_idea(self, idea_id: str, generation_id: str) -> bool: # Verify idea exists idea = await self.dao.ideas.get_idea(idea_id) if not idea: return False # Get generation gen = await self.dao.generations.get_generation(generation_id) if not gen: return False # Link gen.idea_id = idea_id gen.updated_at = datetime.now() await self.dao.generations.update_generation(gen) return True async def remove_generation_from_idea(self, idea_id: str, generation_id: str) -> bool: # Verify idea exists (optional, but good for validation) idea = await self.dao.ideas.get_idea(idea_id) if not idea: return False # Get generation gen = await self.dao.generations.get_generation(generation_id) if not gen: return False # Unlink only if currently linked to this idea if gen.idea_id == idea_id: gen.idea_id = None gen.updated_at = datetime.now() await self.dao.generations.update_generation(gen) return True return False