Files
SIB/backend/app/api/taxis/__init__.py

145 lines
4.3 KiB
Python
Raw Normal View History

2026-02-21 09:53:31 -05:00
from fastapi import APIRouter, Depends, Query, HTTPException, UploadFile, File, Form
from sqlmodel import Session, select
import os
import shutil
from uuid import uuid4, UUID
from typing import List, Optional
2026-02-21 09:53:31 -05:00
from app.core.database import get_session
from app.models.taxi import Taxi
from app.api.deps import get_current_admin
from app.services.image_handler import save_image, delete_image
2026-02-21 09:53:31 -05:00
router = APIRouter(prefix="/api/taxis", tags=["taxis"])
2026-02-21 09:53:31 -05:00
@router.get("", response_model=List[Taxi])
2026-02-21 09:53:31 -05:00
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."""
try:
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)
2026-02-21 09:53:31 -05:00
if english_speaking is not None:
statement = statement.where(Taxi.english_speaking == english_speaking)
taxis = session.exec(statement).all()
return taxis
except Exception as e:
print(f"Error fetching taxis: {e}")
raise HTTPException(status_code=500, detail=str(e))
2026-02-21 09:53:31 -05:00
@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:
image_url = save_image(image, "profiles")
2026-02-21 09:53:31 -05:00
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}", response_model=Taxi)
2026-02-21 09:53:31 -05:00
async def update_taxi(
taxi_id: UUID,
2026-02-21 09:53:31 -05:00
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:
if db_taxi.image_url:
delete_image(db_taxi.image_url)
db_taxi.image_url = save_image(image, "profiles")
2026-02-21 09:53:31 -05:00
session.add(db_taxi)
session.commit()
session.refresh(db_taxi)
return db_taxi
@router.delete("/{taxi_id}")
async def delete_taxi(
taxi_id: UUID,
2026-02-21 09:53:31 -05:00
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")
if db_taxi.image_url:
delete_image(db_taxi.image_url)
2026-02-21 09:53:31 -05:00
session.delete(db_taxi)
session.commit()
return {"ok": True}