diff --git a/src/hubgw/api/v1/luckperms.py b/src/hubgw/api/v1/luckperms.py index cd38019..45e7285 100644 --- a/src/hubgw/api/v1/luckperms.py +++ b/src/hubgw/api/v1/luckperms.py @@ -3,10 +3,11 @@ from fastapi import APIRouter, Depends, HTTPException from typing import Annotated -from hubgw.api.deps import get_luckperms_service, verify_api_key +from hubgw.api.deps import get_luckperms_service, get_user_service, verify_api_key from hubgw.services.luckperms_service import LuckPermsService +from hubgw.services.users_service import UserService from hubgw.schemas.luckperms import ( - LuckPermsPlayer, LuckPermsGroup, LuckPermsUserPermission, + LuckPermsPlayer, LuckPermsGroup, LuckPermsUserPermission, LuckPermsPlayerWithPermissions, LuckPermsPlayerCreateRequest ) from hubgw.core.errors import AppError, create_http_exception @@ -82,11 +83,12 @@ async def get_player_with_permissions( @router.post("/players", response_model=LuckPermsPlayer, status_code=201) async def create_player( request: LuckPermsPlayerCreateRequest, - service: Annotated[LuckPermsService, Depends(get_luckperms_service)], + luckperms_service: Annotated[LuckPermsService, Depends(get_luckperms_service)], + user_service: Annotated[UserService, Depends(get_user_service)], _: Annotated[str, Depends(verify_api_key)] ): """Create a new player in LuckPerms.""" try: - return await service.create_player(request) + return await luckperms_service.create_player(request, user_service) except AppError as e: raise create_http_exception(e) diff --git a/src/hubgw/api/v1/whitelist.py b/src/hubgw/api/v1/whitelist.py index 0a9d867..3c539d1 100644 --- a/src/hubgw/api/v1/whitelist.py +++ b/src/hubgw/api/v1/whitelist.py @@ -3,8 +3,10 @@ from fastapi import APIRouter, Depends from typing import Annotated, Optional -from hubgw.api.deps import get_whitelist_service, verify_api_key +from hubgw.api.deps import get_whitelist_service, get_luckperms_service, get_user_service, verify_api_key from hubgw.services.whitelist_service import WhitelistService +from hubgw.services.luckperms_service import LuckPermsService +from hubgw.services.users_service import UserService from hubgw.schemas.whitelist import ( WhitelistAddRequest, WhitelistRemoveRequest, WhitelistCheckRequest, WhitelistEntry, WhitelistCheckResponse, WhitelistListResponse, WhitelistQuery @@ -18,11 +20,13 @@ router = APIRouter() async def add_player( request: WhitelistAddRequest, service: Annotated[WhitelistService, Depends(get_whitelist_service)], + luckperms_service: Annotated[LuckPermsService, Depends(get_luckperms_service)], + user_service: Annotated[UserService, Depends(get_user_service)], _: Annotated[str, Depends(verify_api_key)] ): """Add player to whitelist.""" try: - return await service.add_player(request) + return await service.add_player(request, luckperms_service, user_service) except AppError as e: raise create_http_exception(e) diff --git a/src/hubgw/schemas/luckperms.py b/src/hubgw/schemas/luckperms.py index 25595de..7392ebf 100644 --- a/src/hubgw/schemas/luckperms.py +++ b/src/hubgw/schemas/luckperms.py @@ -2,8 +2,6 @@ from pydantic import BaseModel from typing import Optional -from datetime import datetime -from uuid import UUID from hubgw.schemas.common import BaseSchema diff --git a/src/hubgw/schemas/users.py b/src/hubgw/schemas/users.py index d8cc501..db5ffc7 100644 --- a/src/hubgw/schemas/users.py +++ b/src/hubgw/schemas/users.py @@ -7,4 +7,4 @@ from typing import Optional class GetUserGameIdResponse(BaseModel): """Response schema for getting user's game ID.""" - game_id: Optional[str] + game_id: str diff --git a/src/hubgw/schemas/whitelist.py b/src/hubgw/schemas/whitelist.py index 44ceab0..04907f7 100644 --- a/src/hubgw/schemas/whitelist.py +++ b/src/hubgw/schemas/whitelist.py @@ -10,7 +10,7 @@ class WhitelistAddRequest(BaseModel): """Whitelist add request schema.""" player_name: str - player_uuid: Optional[str] = None + player_uuid: str added_by: str added_at: datetime expires_at: Optional[datetime] = None diff --git a/src/hubgw/services/luckperms_service.py b/src/hubgw/services/luckperms_service.py index b4dff2f..a83d715 100644 --- a/src/hubgw/services/luckperms_service.py +++ b/src/hubgw/services/luckperms_service.py @@ -1,15 +1,16 @@ """LuckPerms service.""" +from loguru import logger from sqlalchemy.ext.asyncio import AsyncSession -from typing import List -from uuid import uuid3, NAMESPACE_OID +from typing import List, TYPE_CHECKING from hubgw.repositories.luckperms_repo import LuckPermsRepository from hubgw.schemas.luckperms import ( - LuckPermsPlayer, LuckPermsGroup, LuckPermsUserPermission, + LuckPermsPlayer, LuckPermsGroup, LuckPermsUserPermission, LuckPermsPlayerWithPermissions, LuckPermsPlayerCreateRequest ) from hubgw.core.errors import NotFoundError, AlreadyExistsError +from hubgw.services.users_service import UserService class LuckPermsService: @@ -56,13 +57,14 @@ class LuckPermsService: return LuckPermsPlayerWithPermissions.model_validate(player, permissions=permission_schemas) - async def create_player(self, request: LuckPermsPlayerCreateRequest) -> LuckPermsPlayer: + async def create_player(self, request: LuckPermsPlayerCreateRequest, user_service: UserService) -> LuckPermsPlayer: """Create a new player in LuckPerms.""" existing_player = await self.repo.get_player_by_username(request.username) if existing_player: raise AlreadyExistsError(f"Player with username {request.username} already exists") - uuid = str(uuid3(NAMESPACE_OID, request.username)) + user_game_id = await user_service.get_game_id_by_name(request.username) + uuid = user_game_id.game_id created_player = await self.repo.create_player( uuid=uuid, @@ -70,4 +72,4 @@ class LuckPermsService: primary_group=request.primary_group ) - return LuckPermsPlayer.model_validate(created_player) + return created_player diff --git a/src/hubgw/services/whitelist_service.py b/src/hubgw/services/whitelist_service.py index 85f3ba2..0e05596 100644 --- a/src/hubgw/services/whitelist_service.py +++ b/src/hubgw/services/whitelist_service.py @@ -8,7 +8,10 @@ from hubgw.schemas.whitelist import ( WhitelistAddRequest, WhitelistRemoveRequest, WhitelistCheckRequest, WhitelistEntry as SchemaWhitelistEntry, WhitelistCheckResponse, WhitelistListResponse, WhitelistQuery ) +from hubgw.schemas.luckperms import LuckPermsPlayerCreateRequest from hubgw.core.errors import AlreadyExistsError, NotFoundError +from hubgw.services.luckperms_service import LuckPermsService +from hubgw.services.users_service import UserService class WhitelistService: @@ -17,7 +20,21 @@ class WhitelistService: def __init__(self, session: AsyncSession): self.repo = WhitelistRepository(session) - async def add_player(self, request: WhitelistAddRequest) -> SchemaWhitelistEntry: + async def add_player( + self, + request: WhitelistAddRequest, + luckperms_service: LuckPermsService, + user_service: UserService + ) -> SchemaWhitelistEntry: + try: + luckperms_create_request = LuckPermsPlayerCreateRequest( + username=request.player_name, + primary_group="default" + ) + await luckperms_service.create_player(luckperms_create_request, user_service) + except AlreadyExistsError: + pass + existing = await self.repo.get_by_player_name(request.player_name) if existing: if existing.is_active: