| """ |
| Feedback API endpoint. |
| Handles POST /api/v1/feedback for driver feedback submission. |
| """ |
|
|
| from fastapi import APIRouter, Depends, HTTPException, status |
| from sqlalchemy import select |
| from sqlalchemy.ext.asyncio import AsyncSession |
|
|
| from app.database import get_db |
| from app.models import Driver, Assignment, DriverFeedback |
| from app.models.driver import HardestAspect |
| from app.schemas.feedback import FeedbackRequest, FeedbackResponse |
|
|
| router = APIRouter(prefix="/feedback", tags=["Feedback"]) |
|
|
|
|
| @router.post( |
| "", |
| response_model=FeedbackResponse, |
| status_code=status.HTTP_201_CREATED, |
| summary="Submit driver feedback", |
| description="Allows drivers to submit feedback about their assignment.", |
| ) |
| async def submit_feedback( |
| request: FeedbackRequest, |
| db: AsyncSession = Depends(get_db), |
| ) -> FeedbackResponse: |
| """Submit driver feedback for an assignment.""" |
| |
| |
| result = await db.execute( |
| select(Driver).where(Driver.id == request.driver_id) |
| ) |
| driver = result.scalar_one_or_none() |
| |
| if not driver: |
| raise HTTPException( |
| status_code=status.HTTP_404_NOT_FOUND, |
| detail=f"Driver with ID {request.driver_id} not found", |
| ) |
| |
| |
| result = await db.execute( |
| select(Assignment).where(Assignment.id == request.assignment_id) |
| ) |
| assignment = result.scalar_one_or_none() |
| |
| if not assignment: |
| raise HTTPException( |
| status_code=status.HTTP_404_NOT_FOUND, |
| detail=f"Assignment with ID {request.assignment_id} not found", |
| ) |
| |
| if assignment.driver_id != request.driver_id: |
| raise HTTPException( |
| status_code=status.HTTP_400_BAD_REQUEST, |
| detail="Assignment does not belong to the specified driver", |
| ) |
| |
| |
| result = await db.execute( |
| select(DriverFeedback) |
| .where(DriverFeedback.driver_id == request.driver_id) |
| .where(DriverFeedback.assignment_id == request.assignment_id) |
| ) |
| existing_feedback = result.scalar_one_or_none() |
| |
| if existing_feedback: |
| raise HTTPException( |
| status_code=status.HTTP_409_CONFLICT, |
| detail="Feedback already submitted for this assignment", |
| ) |
| |
| |
| hardest_aspect = None |
| if request.hardest_aspect: |
| try: |
| hardest_aspect = HardestAspect(request.hardest_aspect) |
| except ValueError: |
| hardest_aspect = HardestAspect.OTHER |
| |
| feedback = DriverFeedback( |
| driver_id=request.driver_id, |
| assignment_id=request.assignment_id, |
| fairness_rating=request.fairness_rating, |
| stress_level=request.stress_level, |
| tiredness_level=request.tiredness_level, |
| hardest_aspect=hardest_aspect, |
| comments=request.comments, |
| ) |
| |
| db.add(feedback) |
| await db.commit() |
| await db.refresh(feedback) |
| |
| return FeedbackResponse( |
| id=feedback.id, |
| driver_id=feedback.driver_id, |
| assignment_id=feedback.assignment_id, |
| fairness_rating=feedback.fairness_rating, |
| stress_level=feedback.stress_level, |
| tiredness_level=feedback.tiredness_level, |
| hardest_aspect=feedback.hardest_aspect.value if feedback.hardest_aspect else None, |
| comments=feedback.comments, |
| created_at=feedback.created_at, |
| message="Feedback submitted successfully", |
| ) |
|
|