from typing import List, Optional from fastapi import APIRouter, Depends, HTTPException, Query, Body from api.dependency import get_idea_service, get_project_id, get_generation_service from api.endpoints.auth import get_current_user from api.service.idea_service import IdeaService from api.service.generation_service import GenerationService from models.Idea import Idea from api.models.GenerationRequest import GenerationResponse, GenerationsResponse from api.models.IdeaRequest import IdeaCreateRequest, IdeaUpdateRequest, IdeaResponse router = APIRouter(prefix="/api/ideas", tags=["ideas"]) @router.post("", response_model=Idea) async def create_idea( request: IdeaCreateRequest, project_id: Optional[str] = Depends(get_project_id), current_user: dict = Depends(get_current_user), idea_service: IdeaService = Depends(get_idea_service) ): pid = project_id or request.project_id return await idea_service.create_idea(request.name, request.description, pid, str(current_user["_id"])) @router.get("", response_model=List[IdeaResponse]) async def get_ideas( project_id: Optional[str] = Depends(get_project_id), limit: int = 20, offset: int = 0, current_user: dict = Depends(get_current_user), idea_service: IdeaService = Depends(get_idea_service) ): return await idea_service.get_ideas(project_id, str(current_user["_id"]), limit, offset) @router.get("/{idea_id}", response_model=Idea) async def get_idea( idea_id: str, idea_service: IdeaService = Depends(get_idea_service) ): idea = await idea_service.get_idea(idea_id) if not idea: raise HTTPException(status_code=404, detail="Idea not found") return idea @router.put("/{idea_id}", response_model=Idea) async def update_idea( idea_id: str, request: IdeaUpdateRequest, idea_service: IdeaService = Depends(get_idea_service) ): idea = await idea_service.update_idea(idea_id, request.name, request.description) if not idea: raise HTTPException(status_code=404, detail="Idea not found") return idea @router.delete("/{idea_id}") async def delete_idea( idea_id: str, idea_service: IdeaService = Depends(get_idea_service) ): success = await idea_service.delete_idea(idea_id) if not success: raise HTTPException(status_code=404, detail="Idea not found or could not be deleted") return {"status": "success"} @router.get("/{idea_id}/generations", response_model=GenerationsResponse) async def get_idea_generations( idea_id: str, limit: int = 50, offset: int = 0, generation_service: GenerationService = Depends(get_generation_service) ): # Depending on how generation service implements filtering by idea_id. # We might need to update generation_service to support getting by idea_id directly # or ensure generic get_generations supports it. # Looking at generation_router.py, get_generations doesn't have idea_id arg? # Let's check generation_service.get_generations signature again. # It has: (character_id, limit, offset, user_id, project_id). NO IDEA_ID. # I need to update GenerationService.get_generations too! # For now, let's assume I will update it. return await generation_service.get_generations(idea_id=idea_id, limit=limit, offset=offset) @router.post("/{idea_id}/generations/{generation_id}") async def add_generation_to_idea( idea_id: str, generation_id: str, idea_service: IdeaService = Depends(get_idea_service) ): success = await idea_service.add_generation_to_idea(idea_id, generation_id) if not success: raise HTTPException(status_code=404, detail="Idea or Generation not found") return {"status": "success"} @router.delete("/{idea_id}/generations/{generation_id}") async def remove_generation_from_idea( idea_id: str, generation_id: str, idea_service: IdeaService = Depends(get_idea_service) ): success = await idea_service.remove_generation_from_idea(idea_id, generation_id) if not success: raise HTTPException(status_code=404, detail="Idea or Generation not found") return {"status": "success"}