""" Jármű értékelési végpontok a Social 1 modulhoz. """ import uuid from typing import List from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select, and_ from sqlalchemy.orm import selectinload from app.db.session import get_db from app.api.deps import get_current_user from app.models.vehicle import VehicleUserRating from app.models.vehicle_definitions import VehicleModelDefinition from app.models.identity import User from app.schemas.vehicle import VehicleRatingCreate, VehicleRatingResponse router = APIRouter() @router.post("/{vehicle_id}/ratings", response_model=VehicleRatingResponse, status_code=status.HTTP_201_CREATED) async def create_vehicle_rating( vehicle_id: int, rating: VehicleRatingCreate, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user) ): """ Értékelés beküldése egy járműhöz. Csak a jármű tulajdonosa (vagy jogosult felhasználó) értékelhet. Egy felhasználó csak egyszer értékelhet egy adott járművet. """ # 1. Ellenőrizzük, hogy a jármű létezik-e vehicle = await db.scalar( select(VehicleModelDefinition).where(VehicleModelDefinition.id == vehicle_id) ) if not vehicle: raise HTTPException(status_code=404, detail="Jármű nem található") # 2. Ellenőrizzük, hogy a felhasználó jogosult-e értékelni (jelenleg csak tulajdonos) # TODO: Később kibővíthető más jogosultságokkal is # Most feltételezzük, hogy mindenki értékelhet, de csak egyszer # 3. Ellenőrizzük, hogy már létezik-e értékelés ettől a felhasználótól ehhez a járműhöz existing_rating = await db.scalar( select(VehicleUserRating).where( and_( VehicleUserRating.vehicle_id == vehicle_id, VehicleUserRating.user_id == current_user.id ) ) ) if existing_rating: raise HTTPException( status_code=status.HTTP_409_CONFLICT, detail="Már értékelted ezt a járművet. Csak egy értékelés engedélyezett felhasználónként." ) # 4. Hozzuk létre az új értékelést new_rating = VehicleUserRating( vehicle_id=vehicle_id, user_id=current_user.id, driving_experience=rating.driving_experience, reliability=rating.reliability, comfort=rating.comfort, consumption_satisfaction=rating.consumption_satisfaction, comment=rating.comment ) db.add(new_rating) await db.commit() await db.refresh(new_rating) # 5. Átlagpontszám számítása average_score = new_rating.average_score # 6. Válasz összeállítása return VehicleRatingResponse( id=new_rating.id, vehicle_id=new_rating.vehicle_id, user_id=new_rating.user_id, driving_experience=new_rating.driving_experience, reliability=new_rating.reliability, comfort=new_rating.comfort, consumption_satisfaction=new_rating.consumption_satisfaction, comment=new_rating.comment, average_score=average_score, created_at=new_rating.created_at, updated_at=new_rating.updated_at ) @router.get("/{vehicle_id}/ratings", response_model=List[VehicleRatingResponse]) async def get_vehicle_ratings( vehicle_id: int, skip: int = 0, limit: int = 100, db: AsyncSession = Depends(get_db), current_user: User = Depends(get_current_user) ): """ Az összes értékelés lekérése egy adott járműhöz. """ # Ellenőrizzük, hogy a jármű létezik-e vehicle = await db.scalar( select(VehicleModelDefinition).where(VehicleModelDefinition.id == vehicle_id) ) if not vehicle: raise HTTPException(status_code=404, detail="Jármű nem található") # Lekérjük az értékeléseket stmt = ( select(VehicleUserRating) .where(VehicleUserRating.vehicle_id == vehicle_id) .order_by(VehicleUserRating.created_at.desc()) .offset(skip) .limit(limit) ) result = await db.scalars(stmt) ratings = result.all() # Átalakítás válasz sémává response_ratings = [] for rating in ratings: response_ratings.append( VehicleRatingResponse( id=rating.id, vehicle_id=rating.vehicle_id, user_id=rating.user_id, driving_experience=rating.driving_experience, reliability=rating.reliability, comfort=rating.comfort, consumption_satisfaction=rating.consumption_satisfaction, comment=rating.comment, average_score=rating.average_score, created_at=rating.created_at, updated_at=rating.updated_at ) ) return response_ratings