diff --git a/src/hubgw/api/v1/homes.py b/src/hubgw/api/v1/homes.py index 55ae10f..c21b97e 100644 --- a/src/hubgw/api/v1/homes.py +++ b/src/hubgw/api/v1/homes.py @@ -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, diff --git a/src/hubgw/repositories/homes_repo.py b/src/hubgw/repositories/homes_repo.py index af4209e..c358bd6 100644 --- a/src/hubgw/repositories/homes_repo.py +++ b/src/hubgw/repositories/homes_repo.py @@ -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() diff --git a/src/hubgw/schemas/homes.py b/src/hubgw/schemas/homes.py index 34b4014..73dfb17 100644 --- a/src/hubgw/schemas/homes.py +++ b/src/hubgw/schemas/homes.py @@ -73,6 +73,12 @@ class HomeListResponse(BaseModel): total: int +class HomeCountResponse(BaseModel): + """Home count response schema.""" + + total: int + + class HomeQuery(PaginationParams): """Home query schema.""" diff --git a/src/hubgw/services/homes_service.py b/src/hubgw/services/homes_service.py index db2dd21..9dc3144 100644 --- a/src/hubgw/services/homes_service.py +++ b/src/hubgw/services/homes_service.py @@ -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