127 lines
4.2 KiB
Python
127 lines
4.2 KiB
Python
from fastapi import APIRouter, Depends, HTTPException, status, Request
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
from sqlalchemy.future import select
|
|
from pydantic import BaseModel
|
|
from typing import List, Optional
|
|
from ..models import Auction, Vehicle, VehicleEquipment, Equipment, User
|
|
from ..database import get_db
|
|
from ..security import verify_access_token # Ensure this is imported correctly
|
|
from fastapi.logger import logger
|
|
|
|
|
|
router = APIRouter()
|
|
|
|
# Define Pydantic models for data validation
|
|
|
|
class VehicleCreate(BaseModel):
|
|
brand: str
|
|
model: str
|
|
variant: Optional[str]
|
|
year: int
|
|
kilometers: int
|
|
condition: str
|
|
location: str
|
|
latitude: Optional[float]
|
|
longitude: Optional[float]
|
|
gasType: str
|
|
images: str
|
|
description: str
|
|
service: str
|
|
inspectedAt: Optional[str] # ISO format for datetime
|
|
equipment_ids: List[int] # List of equipment IDs
|
|
|
|
|
|
class AuctionCreate(BaseModel):
|
|
askingPrice: float
|
|
description: Optional[str]
|
|
vehicle: VehicleCreate
|
|
|
|
async def get_current_user_id(request: Request, db: AsyncSession = Depends(get_db)):
|
|
user_id = verify_access_token(request)
|
|
|
|
# Fetch user from database to check their role
|
|
result = await db.execute(select(User).filter(User.id == user_id))
|
|
user = result.scalars().first()
|
|
#print(f"\n user " + str(user.role))
|
|
|
|
if user is None:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_401_UNAUTHORIZED,
|
|
detail="User not found."
|
|
)
|
|
|
|
if not user.role.PRIVATE: # Only allow private users to create auctions
|
|
raise HTTPException(
|
|
status_code=status.HTTP_403_FORBIDDEN,
|
|
detail="Only private users can create an auction."
|
|
)
|
|
|
|
logger.info(f"\nCurrent user ID: {user.id}\n Current user role: {user.role}\n")
|
|
#logger.debug(f"\nCurrent user ID: {user.id}\n Current user role: {user.role}\n")
|
|
return user.id
|
|
|
|
|
|
# API route to create an auction
|
|
@router.post("/api/v1/test")
|
|
async def testFuncForDB(request: Request,user_id: int = Depends(get_current_user_id), db: AsyncSession = Depends(get_db)):
|
|
print("HIIIIIIIIIIIIIIIIIIT")
|
|
result = await db.execute(select(User).filter(User.id == user_id))
|
|
user = result.scalars().first()
|
|
if user:
|
|
email = user.email
|
|
else:
|
|
email = "User not found"
|
|
|
|
return {"message": "Test function for DB", "email": email}
|
|
|
|
|
|
# API route to create an auction
|
|
@router.post("/api/v1/auction")
|
|
async def create_auction(auction_data: AuctionCreate, db: AsyncSession = Depends(get_db), user_id: int = Depends(get_current_user_id)):
|
|
# Create Vehicle
|
|
vehicle_data = auction_data.vehicle
|
|
vehicle = Vehicle(
|
|
brand=vehicle_data.brand,
|
|
model=vehicle_data.model,
|
|
variant=vehicle_data.variant,
|
|
year=vehicle_data.year,
|
|
kilometers=vehicle_data.kilometers,
|
|
condition=vehicle_data.condition,
|
|
location=vehicle_data.location,
|
|
latitude=vehicle_data.latitude,
|
|
longitude=vehicle_data.longitude,
|
|
gasType=vehicle_data.gasType,
|
|
images=vehicle_data.images,
|
|
description=vehicle_data.description,
|
|
service=vehicle_data.service,
|
|
inspectedAt=vehicle_data.inspectedAt,
|
|
)
|
|
|
|
# Add vehicle to the database
|
|
db.add(vehicle)
|
|
await db.commit()
|
|
await db.refresh(vehicle)
|
|
|
|
# Add vehicle equipment
|
|
for equipment_id in vehicle_data.equipment_ids:
|
|
result = await db.execute(select(Equipment).filter(Equipment.id == equipment_id))
|
|
equipment = result.scalars().first()
|
|
if not equipment:
|
|
raise HTTPException(status_code=404, detail=f"Equipment with ID {equipment_id} not found")
|
|
vehicle_equipment = VehicleEquipment(vehicle_id=vehicle.id, equipment_id=equipment.id)
|
|
db.add(vehicle_equipment)
|
|
|
|
# Create Auction
|
|
auction = Auction(
|
|
vehicleId=vehicle.id,
|
|
userId=user_id, # This comes from the authenticated user
|
|
askingPrice=auction_data.askingPrice,
|
|
description=auction_data.description,
|
|
)
|
|
|
|
# Add auction to the database
|
|
db.add(auction)
|
|
await db.commit()
|
|
await db.refresh(auction)
|
|
|
|
return {"message": "Auction created successfully", "auction": auction, "vehicle": vehicle} |