146 lines
4.3 KiB
Python
146 lines
4.3 KiB
Python
from fastapi import APIRouter, Depends, Query, HTTPException, UploadFile, File, Form
|
|
from sqlmodel import Session, select
|
|
from typing import Optional
|
|
import os
|
|
import shutil
|
|
from uuid import uuid4
|
|
from app.core.database import get_session
|
|
from app.models.taxi import Taxi
|
|
from app.api.deps import get_current_admin
|
|
|
|
router = APIRouter(prefix="/api/taxis", tags=["taxis"])
|
|
|
|
UPLOAD_DIR = "uploads"
|
|
|
|
|
|
@router.get("")
|
|
async def get_taxis(
|
|
corregimiento: Optional[str] = Query(None),
|
|
shift: Optional[str] = Query(None),
|
|
english_speaking: Optional[bool] = Query(None),
|
|
is_active: Optional[bool] = Query(None),
|
|
session: Session = Depends(get_session)
|
|
):
|
|
"""Get all taxis with optional filters."""
|
|
statement = select(Taxi)
|
|
|
|
if is_active is not None:
|
|
statement = statement.where(Taxi.is_active == is_active)
|
|
|
|
if corregimiento:
|
|
statement = statement.where(Taxi.corregimiento.contains(corregimiento))
|
|
|
|
if shift:
|
|
statement = statement.where(Taxi.shift == shift)
|
|
|
|
if english_speaking is not None:
|
|
statement = statement.where(Taxi.english_speaking == english_speaking)
|
|
|
|
taxis = session.exec(statement).all()
|
|
return taxis
|
|
|
|
|
|
@router.post("")
|
|
async def create_taxi(
|
|
owner_name: str = Form(...),
|
|
phone_number: str = Form(...),
|
|
license_plate: str = Form(...),
|
|
corregimiento: str = Form(...),
|
|
shift: str = Form(...),
|
|
cooperative: Optional[str] = Form(None),
|
|
rating: float = Form(5.0),
|
|
english_speaking: bool = Form(False),
|
|
is_active: bool = Form(True),
|
|
image: Optional[UploadFile] = File(None),
|
|
session: Session = Depends(get_session),
|
|
_: bool = Depends(get_current_admin)
|
|
):
|
|
"""Create a new taxi entry (Admin only)."""
|
|
image_url = None
|
|
if image:
|
|
ext = os.path.splitext(image.filename)[1]
|
|
filename = f"{uuid4()}{ext}"
|
|
path = os.path.join(UPLOAD_DIR, "profiles", filename)
|
|
with open(path, "wb") as buffer:
|
|
shutil.copyfileobj(image.file, buffer)
|
|
image_url = f"/uploads/profiles/{filename}"
|
|
|
|
taxi = Taxi(
|
|
owner_name=owner_name,
|
|
phone_number=phone_number,
|
|
license_plate=license_plate,
|
|
cooperative=cooperative,
|
|
corregimiento=corregimiento,
|
|
shift=shift,
|
|
rating=rating,
|
|
english_speaking=english_speaking,
|
|
image_url=image_url,
|
|
is_active=is_active
|
|
)
|
|
session.add(taxi)
|
|
session.commit()
|
|
session.refresh(taxi)
|
|
return taxi
|
|
|
|
|
|
@router.put("/{taxi_id}")
|
|
async def update_taxi(
|
|
taxi_id: str,
|
|
owner_name: str = Form(...),
|
|
phone_number: str = Form(...),
|
|
license_plate: str = Form(...),
|
|
corregimiento: str = Form(...),
|
|
shift: str = Form(...),
|
|
cooperative: Optional[str] = Form(None),
|
|
rating: float = Form(5.0),
|
|
english_speaking: bool = Form(False),
|
|
is_active: bool = Form(True),
|
|
image: Optional[UploadFile] = File(None),
|
|
session: Session = Depends(get_session),
|
|
_: bool = Depends(get_current_admin)
|
|
):
|
|
"""Update a taxi entry (Admin only)."""
|
|
db_taxi = session.get(Taxi, taxi_id)
|
|
if not db_taxi:
|
|
raise HTTPException(status_code=404, detail="Taxi not found")
|
|
|
|
# Update fields
|
|
db_taxi.owner_name = owner_name
|
|
db_taxi.phone_number = phone_number
|
|
db_taxi.license_plate = license_plate
|
|
db_taxi.corregimiento = corregimiento
|
|
db_taxi.shift = shift
|
|
db_taxi.cooperative = cooperative
|
|
db_taxi.rating = rating
|
|
db_taxi.english_speaking = english_speaking
|
|
db_taxi.is_active = is_active
|
|
|
|
# Handle image upload
|
|
if image:
|
|
ext = os.path.splitext(image.filename)[1]
|
|
filename = f"{uuid4()}{ext}"
|
|
path = os.path.join(UPLOAD_DIR, "profiles", filename)
|
|
with open(path, "wb") as buffer:
|
|
shutil.copyfileobj(image.file, buffer)
|
|
db_taxi.image_url = f"/uploads/profiles/{filename}"
|
|
|
|
session.add(db_taxi)
|
|
session.commit()
|
|
session.refresh(db_taxi)
|
|
return db_taxi
|
|
|
|
|
|
@router.delete("/{taxi_id}")
|
|
async def delete_taxi(
|
|
taxi_id: str,
|
|
session: Session = Depends(get_session),
|
|
_: bool = Depends(get_current_admin)
|
|
):
|
|
"""Delete a taxi entry (Admin only)."""
|
|
db_taxi = session.get(Taxi, taxi_id)
|
|
if not db_taxi:
|
|
raise HTTPException(status_code=404, detail="Taxi not found")
|
|
session.delete(db_taxi)
|
|
session.commit()
|
|
return {"ok": True}
|