75 lines
2.7 KiB
Python
75 lines
2.7 KiB
Python
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()
|