Files
daily-journal-prompt/backend/app/api/v1/endpoints/feedback.py

194 lines
6.0 KiB
Python

"""
Feedback-related API endpoints.
"""
from typing import List, Dict, Any
from fastapi import APIRouter, HTTPException, Depends, status
from pydantic import BaseModel
from app.services.prompt_service import PromptService
from app.models.prompt import FeedbackWord, RateFeedbackWordsRequest, RateFeedbackWordsResponse
# Create router
router = APIRouter()
# Response models
class GenerateFeedbackWordsResponse(BaseModel):
"""Response model for generating feedback words."""
theme_words: List[str]
count: int = 6
class FeedbackQueuedWordsResponse(BaseModel):
"""Response model for queued feedback words."""
queued_words: List[FeedbackWord]
count: int
class FeedbackActiveWordsResponse(BaseModel):
"""Response model for active feedback words."""
active_words: List[FeedbackWord]
count: int
class FeedbackHistoricResponse(BaseModel):
"""Response model for full feedback history."""
feedback_history: List[Dict[str, Any]]
count: int
# Service dependency
async def get_prompt_service() -> PromptService:
"""Dependency to get PromptService instance."""
return PromptService()
@router.get("/queued", response_model=FeedbackQueuedWordsResponse)
async def get_queued_feedback_words(
prompt_service: PromptService = Depends(get_prompt_service)
):
"""
Get queued feedback words (positions 0-5) for user weighting.
Returns:
List of queued feedback words with weights
"""
try:
# Get queued feedback words from PromptService
queued_feedback_items = await prompt_service.get_feedback_queued_words()
# Convert to FeedbackWord models
queued_words = []
for i, item in enumerate(queued_feedback_items):
key = list(item.keys())[0]
word = item[key]
weight = item.get("weight", 3) # Default weight is 3
queued_words.append(FeedbackWord(key=key, word=word, weight=weight))
return FeedbackQueuedWordsResponse(
queued_words=queued_words,
count=len(queued_words)
)
except Exception as e:
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"Error getting queued feedback words: {str(e)}"
)
@router.get("/active", response_model=FeedbackActiveWordsResponse)
async def get_active_feedback_words(
prompt_service: PromptService = Depends(get_prompt_service)
):
"""
Get active feedback words (positions 6-11) for prompt generation.
Returns:
List of active feedback words with weights
"""
try:
# Get active feedback words from PromptService
active_feedback_items = await prompt_service.get_feedback_active_words()
# Convert to FeedbackWord models
active_words = []
for i, item in enumerate(active_feedback_items):
key = list(item.keys())[0]
word = item[key]
weight = item.get("weight", 3) # Default weight is 3
active_words.append(FeedbackWord(key=key, word=word, weight=weight))
return FeedbackActiveWordsResponse(
active_words=active_words,
count=len(active_words)
)
except Exception as e:
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"Error getting active feedback words: {str(e)}"
)
@router.get("/generate", response_model=GenerateFeedbackWordsResponse)
async def generate_feedback_words(
prompt_service: PromptService = Depends(get_prompt_service)
):
"""
Generate 6 theme feedback words using AI.
Returns:
List of 6 theme words for feedback
"""
try:
theme_words = await prompt_service.generate_theme_feedback_words()
if len(theme_words) != 6:
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"Expected 6 theme words, got {len(theme_words)}"
)
return GenerateFeedbackWordsResponse(
theme_words=theme_words,
count=len(theme_words)
)
except ValueError as e:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=str(e)
)
except Exception as e:
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"Error generating feedback words: {str(e)}"
)
@router.post("/rate", response_model=RateFeedbackWordsResponse)
async def rate_feedback_words(
request: RateFeedbackWordsRequest,
prompt_service: PromptService = Depends(get_prompt_service)
):
"""
Rate feedback words and update feedback system.
Args:
request: Dictionary of word to rating (0-6)
Returns:
Updated feedback words
"""
try:
feedback_words = await prompt_service.update_feedback_words(request.ratings)
return RateFeedbackWordsResponse(
feedback_words=feedback_words,
added_to_history=True
)
except ValueError as e:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=str(e)
)
except Exception as e:
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"Error rating feedback words: {str(e)}"
)
@router.get("/history", response_model=FeedbackHistoricResponse)
async def get_feedback_history(
prompt_service: PromptService = Depends(get_prompt_service)
):
"""
Get full feedback word history.
Returns:
Full feedback history with weights
"""
try:
feedback_historic = await prompt_service.get_feedback_historic()
return FeedbackHistoricResponse(
feedback_history=feedback_historic,
count=len(feedback_historic)
)
except Exception as e:
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"Error getting feedback history: {str(e)}"
)