feat: fixes
This commit is contained in:
parent
527146e651
commit
6a14e2d65c
|
|
@ -6,8 +6,9 @@ from fastapi import APIRouter, Depends
|
|||
|
||||
from hubgw.api.deps import get_homes_service, verify_api_key
|
||||
from hubgw.core.errors import AppError, create_http_exception
|
||||
from hubgw.schemas.homes import (Home, HomeGetRequest, HomeGetResponse,
|
||||
HomeListResponse, HomeUpsertRequest)
|
||||
from hubgw.schemas.homes import (Home, HomeCountResponse, HomeGetRequest,
|
||||
HomeGetResponse, HomeListResponse,
|
||||
HomeUpsertRequest)
|
||||
from hubgw.services.homes_service import HomesService
|
||||
|
||||
router = APIRouter()
|
||||
|
|
@ -39,6 +40,33 @@ async def get_home(
|
|||
raise create_http_exception(e)
|
||||
|
||||
|
||||
@router.post("/delete")
|
||||
async def delete_home(
|
||||
request: HomeGetRequest,
|
||||
service: Annotated[HomesService, Depends(get_homes_service)],
|
||||
_: Annotated[str, Depends(verify_api_key)],
|
||||
):
|
||||
"""Delete home by player UUID and name."""
|
||||
try:
|
||||
await service.delete_home(request)
|
||||
return {"success": True}
|
||||
except AppError as e:
|
||||
raise create_http_exception(e)
|
||||
|
||||
|
||||
@router.get("/count/{player_uuid}", response_model=HomeCountResponse)
|
||||
async def count_homes(
|
||||
player_uuid: str,
|
||||
service: Annotated[HomesService, Depends(get_homes_service)],
|
||||
_: Annotated[str, Depends(verify_api_key)],
|
||||
):
|
||||
"""Count homes for player."""
|
||||
try:
|
||||
return await service.count_homes(player_uuid)
|
||||
except AppError as e:
|
||||
raise create_http_exception(e)
|
||||
|
||||
|
||||
@router.get("/{player_uuid}", response_model=HomeListResponse)
|
||||
async def list_homes(
|
||||
player_uuid: str,
|
||||
|
|
|
|||
|
|
@ -74,6 +74,13 @@ class HomesRepository:
|
|||
await self.session.commit()
|
||||
return result.rowcount > 0
|
||||
|
||||
async def delete_by_player_and_name(self, player_uuid: str, name: str) -> bool:
|
||||
"""Delete home by player UUID and name."""
|
||||
stmt = delete(Home).where(Home.player_uuid == player_uuid, Home.name == name)
|
||||
result = await self.session.execute(stmt)
|
||||
await self.session.commit()
|
||||
return result.rowcount > 0
|
||||
|
||||
async def query(self, query: HomeQuery) -> tuple[List[Home], int]:
|
||||
"""Query homes with filters and pagination."""
|
||||
stmt = select(Home)
|
||||
|
|
@ -119,3 +126,9 @@ class HomesRepository:
|
|||
stmt = select(Home).where(Home.player_uuid == player_uuid).order_by(Home.name)
|
||||
result = await self.session.execute(stmt)
|
||||
return list(result.scalars().all())
|
||||
|
||||
async def count_by_player(self, player_uuid: str) -> int:
|
||||
"""Count homes for a player."""
|
||||
stmt = select(func.count(Home.id)).where(Home.player_uuid == player_uuid)
|
||||
result = await self.session.execute(stmt)
|
||||
return result.scalar()
|
||||
|
|
|
|||
|
|
@ -73,6 +73,12 @@ class HomeListResponse(BaseModel):
|
|||
total: int
|
||||
|
||||
|
||||
class HomeCountResponse(BaseModel):
|
||||
"""Home count response schema."""
|
||||
|
||||
total: int
|
||||
|
||||
|
||||
class HomeQuery(PaginationParams):
|
||||
"""Home query schema."""
|
||||
|
||||
|
|
|
|||
|
|
@ -5,8 +5,9 @@ from sqlalchemy.ext.asyncio import AsyncSession
|
|||
|
||||
from hubgw.core.errors import NotFoundError
|
||||
from hubgw.repositories.homes_repo import HomesRepository
|
||||
from hubgw.schemas.homes import (Home, HomeGetRequest, HomeGetResponse,
|
||||
HomeListResponse, HomeUpsertRequest)
|
||||
from hubgw.schemas.homes import (Home, HomeCountResponse, HomeGetRequest,
|
||||
HomeGetResponse, HomeListResponse,
|
||||
HomeUpsertRequest)
|
||||
|
||||
|
||||
class HomesService:
|
||||
|
|
@ -65,3 +66,19 @@ class HomesService:
|
|||
]
|
||||
|
||||
return HomeListResponse(homes=home_list, total=len(home_list))
|
||||
|
||||
async def count_homes(self, player_uuid: str) -> HomeCountResponse:
|
||||
"""Count homes for player."""
|
||||
total = await self.repo.count_by_player(player_uuid)
|
||||
return HomeCountResponse(total=total)
|
||||
|
||||
async def delete_home(self, request: HomeGetRequest) -> bool:
|
||||
"""Delete home by player UUID and name."""
|
||||
deleted = await self.repo.delete_by_player_and_name(
|
||||
request.player_uuid, request.name
|
||||
)
|
||||
if not deleted:
|
||||
raise NotFoundError(
|
||||
f"Home '{request.name}' not found for player {request.player_uuid}"
|
||||
)
|
||||
return deleted
|
||||
|
|
|
|||
Loading…
Reference in New Issue