Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# pyproject.toml
[tool.black]
line-length = 120
#exclude = ["src/frontend"]
108 changes: 42 additions & 66 deletions src/backend/app/api/v1/endpoints/address.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,11 @@
AddressListResponse,
AddressCreateRequest,
AddressUpdateRequest,
SetDefaultAddressResponse # 用于设置默认地址的响应
SetDefaultAddressResponse, # 用于设置默认地址的响应
)
from backend.app.services.address_service import AddressService
from backend.app.dependencies.service_deps import get_address_service
from backend.app.utils.exceptions import (
UserNotFoundException,
AddressNotFoundException
)
from backend.app.utils.exceptions import UserNotFoundException, AddressNotFoundException

from sqlalchemy.engine.base import Connection # 用于类型提示
from backend.app.utils import logger
Expand All @@ -31,28 +28,26 @@
response_model=AddressResponse,
status_code=status.HTTP_201_CREATED,
tags=["Shipping Addresses"],
summary="为当前用户添加新的收货地址"
summary="为当前用户添加新的收货地址",
)
async def add_new_address(
address_in: AddressCreateRequest, # 请求体
current_user: CurrentUserSchema = Depends(get_current_active_user),
db: Connection = Depends(get_db_connection),
address_service: AddressService = Depends(get_address_service) # 注入服务
address_in: AddressCreateRequest, # 请求体
current_user: CurrentUserSchema = Depends(get_current_active_user),
db: Connection = Depends(get_db_connection),
address_service: AddressService = Depends(get_address_service), # 注入服务
):
"""
为当前认证的用户创建一个新的收货地址。
如果 `IsDefault` 在请求中为 `true`,服务层需要处理将其他地址设为非默认的逻辑,
并更新用户的 `DefaultAddressID`。
"""
logger.info(
f"UserID {current_user.UserID} attempting to add new address: {address_in.model_dump(exclude_unset=True)}")
f"UserID {current_user.UserID} attempting to add new address: {address_in.model_dump(exclude_unset=True)}"
)
try:
with db.begin_nested() if db.in_transaction() else db.begin():
new_address = await address_service.create_new_address(
db=db,
address_in=address_in,
user_id=current_user.UserID,
actor_id=current_user.UserID
db=db, address_in=address_in, user_id=current_user.UserID, actor_id=current_user.UserID
)
except Exception as e:
logger.error(f"Failed to create new address for UserID {current_user.UserID}: {e}")
Expand All @@ -61,16 +56,11 @@ async def add_new_address(
return new_address


@router.get(
"/",
response_model=AddressListResponse,
tags=["Shipping Addresses"],
summary="获取当前用户的所有收货地址"
)
@router.get("/", response_model=AddressListResponse, tags=["Shipping Addresses"], summary="获取当前用户的所有收货地址")
async def get_user_addresses(
current_user: CurrentUserSchema = Depends(get_current_active_user),
db: Connection = Depends(get_db_connection),
address_service: AddressService = Depends(get_address_service)
current_user: CurrentUserSchema = Depends(get_current_active_user),
db: Connection = Depends(get_db_connection),
address_service: AddressService = Depends(get_address_service),
):
"""
检索当前已认证用户的所有收货地址列表。
Expand All @@ -89,16 +79,13 @@ async def get_user_addresses(


@router.get(
"/{address_id}",
response_model=AddressResponse,
tags=["Shipping Addresses"],
summary="获取特定收货地址的详情"
"/{address_id}", response_model=AddressResponse, tags=["Shipping Addresses"], summary="获取特定收货地址的详情"
)
async def get_address_by_id(
address_id: int = FastApiPath(..., title="地址ID", description="要检索的地址的唯一ID", gt=0),
current_user: CurrentUserSchema = Depends(get_current_active_user),
db: Connection = Depends(get_db_connection),
address_service: AddressService = Depends(get_address_service)
address_id: int = FastApiPath(..., title="地址ID", description="要检索的地址的唯一ID", gt=0),
current_user: CurrentUserSchema = Depends(get_current_active_user),
db: Connection = Depends(get_db_connection),
address_service: AddressService = Depends(get_address_service),
):
"""
根据 AddressID 获取单个收货地址的详细信息。
Expand All @@ -108,10 +95,7 @@ async def get_address_by_id(
try:
with db.begin_nested() if db.in_transaction() else db.begin():
address = await address_service.get_address_by_id_for_user(
db=db,
address_id=address_id,
user_id=current_user.UserID,
actor_id=current_user.UserID
db=db, address_id=address_id, user_id=current_user.UserID, actor_id=current_user.UserID
)
except AddressNotFoundException as e:
logger.error(f"Address not found for UserID {current_user.UserID}: {e}")
Expand All @@ -124,33 +108,31 @@ async def get_address_by_id(


@router.put(
"/{address_id}",
response_model=AddressResponse,
tags=["Shipping Addresses"],
summary="更新现有收货地址的详情"
"/{address_id}", response_model=AddressResponse, tags=["Shipping Addresses"], summary="更新现有收货地址的详情"
)
async def update_address_details(
address_update_in: AddressUpdateRequest, # 请求体
address_id: int = FastApiPath(..., title="地址ID", description="要更新的地址的唯一ID", gt=0),
current_user: CurrentUserSchema = Depends(get_current_active_user),
db: Connection = Depends(get_db_connection),
address_service: AddressService = Depends(get_address_service)
address_update_in: AddressUpdateRequest, # 请求体
address_id: int = FastApiPath(..., title="地址ID", description="要更新的地址的唯一ID", gt=0),
current_user: CurrentUserSchema = Depends(get_current_active_user),
db: Connection = Depends(get_db_connection),
address_service: AddressService = Depends(get_address_service),
):
"""
更新指定 `AddressID` 的收货地址的文本内容(收货人、电话、地址详情)。
此端点不处理将地址设为默认的逻辑。
需要验证该地址是否属于当前用户。
"""
logger.info(
f"Updating address AddressID: {address_id} for UserID: {current_user.UserID} with data: {address_update_in.model_dump(exclude_unset=True)}")
f"Updating address AddressID: {address_id} for UserID: {current_user.UserID} with data: {address_update_in.model_dump(exclude_unset=True)}"
)
try:
with db.begin_nested() if db.in_transaction() else db.begin():
updated_address = await address_service.update_address_details(
db=db,
address_id=address_id,
address_in=address_update_in,
user_id_making_change=current_user.UserID,
actor_id=current_user.UserID
actor_id=current_user.UserID,
)
except AddressNotFoundException as e:
logger.error(f"Address not found for UserID {current_user.UserID}: {e}")
Expand All @@ -166,13 +148,13 @@ async def update_address_details(
"/{address_id}/set-default",
response_model=SetDefaultAddressResponse,
tags=["Shipping Addresses"],
summary="将指定地址设为当前用户的默认收货地址"
summary="将指定地址设为当前用户的默认收货地址",
)
async def set_address_as_default(
address_id: int = FastApiPath(..., title="地址ID", description="要设为默认的地址的唯一ID", gt=0),
current_user: CurrentUserSchema = Depends(get_current_active_user),
db: Connection = Depends(get_db_connection),
address_service: AddressService = Depends(get_address_service)
address_id: int = FastApiPath(..., title="地址ID", description="要设为默认的地址的唯一ID", gt=0),
current_user: CurrentUserSchema = Depends(get_current_active_user),
db: Connection = Depends(get_db_connection),
address_service: AddressService = Depends(get_address_service),
):
"""
将指定的 `AddressID` 设置为当前认证用户的默认收货地址。
Expand All @@ -186,10 +168,7 @@ async def set_address_as_default(
try:
with db.begin_nested() if db.in_transaction() else db.begin():
resp = await address_service.set_default_address_for_user(
db=db,
user_id=current_user.UserID,
address_id_to_set_default=address_id,
actor_id=current_user.UserID
db=db, user_id=current_user.UserID, address_id_to_set_default=address_id, actor_id=current_user.UserID
)
except AddressNotFoundException as e:
logger.error(f"Address not found for UserID {current_user.UserID}: {e}")
Expand All @@ -203,15 +182,15 @@ async def set_address_as_default(

@router.delete(
"/{address_id}",
status_code=status.HTTP_204_NO_CONTENT, # 成功删除通常返回 204
status_code=status.HTTP_204_NO_CONTENT,
tags=["Shipping Addresses"],
summary="删除用户的特定收货地址"
summary="删除用户的特定收货地址", # 成功删除通常返回 204
)
async def delete_address(
address_id: int = FastApiPath(..., title="地址ID", description="要删除的地址的唯一ID", gt=0),
current_user: CurrentUserSchema = Depends(get_current_active_user),
db: Connection = Depends(get_db_connection),
address_service: AddressService = Depends(get_address_service)
address_id: int = FastApiPath(..., title="地址ID", description="要删除的地址的唯一ID", gt=0),
current_user: CurrentUserSchema = Depends(get_current_active_user),
db: Connection = Depends(get_db_connection),
address_service: AddressService = Depends(get_address_service),
):
"""
根据 `AddressID` 删除当前用户的某个收货地址。
Expand All @@ -223,10 +202,7 @@ async def delete_address(
with db.begin_nested() if db.in_transaction() else db.begin():
# 这里假设 AddressService 有一个 delete_address 方法
success = await address_service.delete_address_for_user(
db=db,
address_id=address_id,
user_id_making_request=current_user.UserID,
actor_id=current_user.UserID
db=db, address_id=address_id, user_id_making_request=current_user.UserID, actor_id=current_user.UserID
)
except AddressNotFoundException as e:
logger.error(f"Address not found for UserID {current_user.UserID}: {e}")
Expand Down
Loading