83 lines
2.9 KiB
Python
83 lines
2.9 KiB
Python
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
|