from fastapi import APIRouter, HTTPException, Depends from sqlalchemy.orm import Session from sqlalchemy import and_ from typing import List from app.models.address import AddressDB, AddressCreate, AddressUpdate, AddressInfo from app.models.database import get_db from app.api.deps import get_current_user from app.models.user import UserDB router = APIRouter() @router.post("/", response_model=AddressInfo) async def create_address( address: AddressCreate, db: Session = Depends(get_db), current_user: UserDB = Depends(get_current_user) ): """创建配送地址""" # 如果设置为默认地址,先将其他地址的默认状态取消 if address.is_default: db.query(AddressDB).filter( and_( AddressDB.user_id == current_user.userid, AddressDB.is_default == True ) ).update({"is_default": False}) db_address = AddressDB( user_id=current_user.userid, **address.model_dump() ) db.add(db_address) db.commit() db.refresh(db_address) return db_address @router.get("/", response_model=List[AddressInfo]) async def get_addresses( db: Session = Depends(get_db), current_user: UserDB = Depends(get_current_user) ): """获取用户的所有配送地址""" addresses = db.query(AddressDB).filter( AddressDB.user_id == current_user.userid ).all() return addresses @router.put("/{address_id}", response_model=AddressInfo) async def update_address( address_id: int, address: AddressUpdate, db: Session = Depends(get_db), current_user: UserDB = Depends(get_current_user) ): """更新配送地址""" db_address = db.query(AddressDB).filter( and_( AddressDB.id == address_id, AddressDB.user_id == current_user.userid ) ).first() if not db_address: raise HTTPException(status_code=404, detail="地址不存在") # 如果设置为默认地址,先将其他地址的默认状态取消 update_data = address.model_dump(exclude_unset=True) if update_data.get("is_default"): db.query(AddressDB).filter( and_( AddressDB.user_id == current_user.userid, AddressDB.is_default == True ) ).update({"is_default": False}) for key, value in update_data.items(): setattr(db_address, key, value) db.commit() db.refresh(db_address) return db_address @router.delete("/{address_id}") async def delete_address( address_id: int, db: Session = Depends(get_db), current_user: UserDB = Depends(get_current_user) ): """删除配送地址""" result = db.query(AddressDB).filter( and_( AddressDB.id == address_id, AddressDB.user_id == current_user.userid ) ).delete() if not result: raise HTTPException(status_code=404, detail="地址不存在") db.commit() return {"message": "地址已删除"} @router.post("/{address_id}/set-default", response_model=AddressInfo) async def set_default_address( address_id: int, db: Session = Depends(get_db), current_user: UserDB = Depends(get_current_user) ): """设置默认地址""" # 取消其他默认地址 db.query(AddressDB).filter( and_( AddressDB.user_id == current_user.userid, AddressDB.is_default == True ) ).update({"is_default": False}) # 设置新的默认地址 db_address = db.query(AddressDB).filter( and_( AddressDB.id == address_id, AddressDB.user_id == current_user.userid ) ).first() if not db_address: raise HTTPException(status_code=404, detail="地址不存在") db_address.is_default = True db.commit() db.refresh(db_address) return db_address