import logging from typing import Annotated from fastapi import APIRouter, Depends from starlette import status from common.exceptions import FeedbackNotFoundException, LogNotFoundException from components.dbo.models.feedback import Feedback from components.dbo.models.log import Log from schemas.feedback import FeedbackCreate import common.dependencies as DI from sqlalchemy.orm import sessionmaker router = APIRouter() logger = logging.getLogger(__name__) @router.get('/feedbacks', status_code=status.HTTP_200_OK) async def get_all_feedbacks(db: Annotated[sessionmaker, Depends(DI.get_db)]): logger.info("Handling GET request to /feedbacks") try: with db() as session: result = session.query(Feedback).all() logger.info(f"Successfully retrieved {len(result)} feedbacks") return result except Exception as e: logger.error(f"Error retrieving feedbacks: {str(e)}") raise e @router.get('/feedback/{feedback_id}', status_code=status.HTTP_200_OK) async def get_feedback(feedback_id: int, db: Annotated[sessionmaker, Depends(DI.get_db)]): logger.info(f"Handling GET request to /feedback/{feedback_id}") try: with db() as session: feedback = ( session.query(Feedback).filter(Feedback.feedback_id == feedback_id).first() ) if feedback is None: logger.warning(f"Feedback not found: {feedback_id}") raise FeedbackNotFoundException(feedback_id) logger.info(f"Successfully retrieved feedback {feedback_id}") return feedback except Exception as e: logger.error(f"Error retrieving feedback {feedback_id}: {str(e)}") raise e @router.post('/feedback', status_code=status.HTTP_201_CREATED) async def create_feedback(feedback: FeedbackCreate, db: Annotated[sessionmaker, Depends(DI.get_db)]): logger.info("Handling POST request to /feedback") try: with db() as session: log_entry = session.query(Log).filter(Log.id == feedback.log_id).first() if log_entry is None: logger.warning(f"Log not found: {feedback.log_id}") raise LogNotFoundException(feedback.log_id) new_feedback = Feedback( log_id=feedback.log_id, userComment=feedback.userComment, userScore=feedback.userScore, manualEstimate=feedback.manualEstimate, llmEstimate=feedback.llmEstimate, ) session.add(new_feedback) session.commit() session.refresh(new_feedback) logger.info( f"Successfully created feedback with ID: {new_feedback.id}" ) return new_feedback except Exception as e: logger.error(f"Error creating feedback: {str(e)}") raise e