feat: fixes

This commit is contained in:
itqop 2025-11-26 23:32:39 +03:00
parent 527146e651
commit 6a14e2d65c
4 changed files with 68 additions and 4 deletions

View File

@ -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,

View File

@ -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()

View File

@ -73,6 +73,12 @@ class HomeListResponse(BaseModel):
total: int
class HomeCountResponse(BaseModel):
"""Home count response schema."""
total: int
class HomeQuery(PaginationParams):
"""Home query schema."""

View File

@ -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