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",
    )