from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from ..database import get_db from ..models.address import Address from ..schemas.address import AddressCreate, AddressUpdate, AddressOut from ..services import eta_service from .deps import get_current_user router = APIRouter(prefix="/addresses", tags=["addresses"]) @router.get("/", response_model=list[AddressOut]) def list_addresses(db: Session = Depends(get_db), user=Depends(get_current_user)): return db.query(Address).filter(Address.user_id == user.id).all() @router.post("/", response_model=AddressOut, status_code=201) def create_address(data: AddressCreate, db: Session = Depends(get_db), user=Depends(get_current_user)): # Assign the closest route based on coordinates route_id = None if data.lat and data.lng: route_id = eta_service.assign_route(data.lat, data.lng) # If this is default, unset others if data.is_default: db.query(Address).filter(Address.user_id == user.id).update({"is_default": False}) # First address is automatically default existing_count = db.query(Address).filter(Address.user_id == user.id).count() is_default = data.is_default or existing_count == 0 address = Address( user_id=user.id, label=data.label, street=data.street, colony=data.colony, city=data.city, lat=data.lat, lng=data.lng, route_id=route_id, is_default=is_default, ) db.add(address) db.commit() db.refresh(address) return address @router.patch("/{address_id}", response_model=AddressOut) def update_address(address_id: int, data: AddressUpdate, db: Session = Depends(get_db), user=Depends(get_current_user)): address = db.query(Address).filter(Address.id == address_id, Address.user_id == user.id).first() if not address: raise HTTPException(status_code=404, detail="Domicilio no encontrado") if data.label is not None: address.label = data.label if data.street is not None: address.street = data.street if data.colony is not None: address.colony = data.colony if data.is_default is True: db.query(Address).filter(Address.user_id == user.id).update({"is_default": False}) address.is_default = True db.commit() db.refresh(address) return address @router.delete("/{address_id}", status_code=204) def delete_address(address_id: int, db: Session = Depends(get_db), user=Depends(get_current_user)): address = db.query(Address).filter(Address.id == address_id, Address.user_id == user.id).first() if not address: raise HTTPException(status_code=404, detail="Domicilio no encontrado") db.delete(address) db.commit()