File size: 3,515 Bytes
fcf8749 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 | """
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."""
# Verify driver exists
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",
)
# Verify assignment exists and belongs to driver
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",
)
# Check for duplicate feedback
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",
)
# Create feedback
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",
)
|