Skip to content

Commit

Permalink
wl improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
Furrior committed Jan 16, 2025
1 parent 948bd0e commit 112c2ff
Show file tree
Hide file tree
Showing 5 changed files with 101 additions and 18 deletions.
76 changes: 73 additions & 3 deletions app/routes/whitelist.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import datetime
import logging

from fastapi import APIRouter, Depends, HTTPException, status
from fastapi import APIRouter, Depends, status
from sqlmodel import select

from app.database.models import Player, Whitelist, WhitelistBan
from app.database.models import Player, Whitelist
from app.deps import SessionDep, verify_bearer
from app.schemas.whitelist import NewWhitelistBanCkey, NewWhitelistCkey
from app.routes.player import get_player_by_ckey, get_player_by_discord
from app.schemas.whitelist import NewWhitelistCkey, NewWhitelistDiscord

logger = logging.getLogger("main-logger")

Expand All @@ -24,3 +25,72 @@ async def get_whitelists(session: SessionDep, active_only: bool = True) -> list[
Whitelist.expiration_time > datetime.datetime.now()
)
return session.exec(selection).all()


@router.post("/", dependencies=[Depends(verify_bearer)])
async def create_whitelist(session: SessionDep, new_whitelist: Whitelist) -> Whitelist:
session.add(new_whitelist)
session.commit()
session.refresh(new_whitelist)
logger.info("Created whitelist: %s", new_whitelist)
return new_whitelist


@router.get("/{wl_type}/ckey/{ckey}", status_code=status.HTTP_200_OK)
async def get_whitelists_by_ckey(session: SessionDep, wl_type: str, ckey: str, active_only: bool = True) -> list[Whitelist]:
selection = select(Whitelist
).join(Player, Player.id == Whitelist.player_id
).where(Player.ckey == ckey
).where(Whitelist.wl_type == wl_type)
if active_only:
selection = selection.where(
Whitelist.valid).where(
Whitelist.expiration_time > datetime.datetime.now()
)
return session.exec(selection).all()


@router.post("/{wl_type}/ckey/{ckey}", dependencies=[Depends(verify_bearer)])
async def create_whitelist_by_ckey(session: SessionDep, wl_type: str, ckey: str, new_whitelist: NewWhitelistCkey) -> Whitelist:
player = await get_player_by_ckey(session, ckey)
admin = await get_player_by_ckey(session, new_whitelist.admin_ckey)

wl = Whitelist(
player_id=player.id,
admin_id=admin.id,
wl_type=wl_type,
expiration_time=datetime.datetime.now(
) + datetime.timedelta(days=new_whitelist.duration_days),
valid=new_whitelist.valid
)
return await create_whitelist(session, wl)


@router.get("/{wl_type}/discord/{discord_id}", status_code=status.HTTP_200_OK)
async def get_whitelists_by_discord(session: SessionDep, wl_type: str, discord_id: str, active_only: bool = True) -> list[Whitelist]:
selection = select(Whitelist).join(Player, Player.id == Whitelist.player_id).where(
Player.discord_id == discord_id).where(Whitelist.wl_type == wl_type)
if active_only:
selection = selection.where(
Whitelist.valid).where(
Whitelist.expiration_time > datetime.datetime.now()
)
return session.exec(selection).all()


@router.post("/{wl_type}/discord/{discord_id}", dependencies=[Depends(verify_bearer)])
async def create_whitelist_by_discord(session: SessionDep, new_whitelist: NewWhitelistDiscord) -> Whitelist:
player = await get_player_by_discord(session, new_whitelist.discord_id)
admin = await get_player_by_ckey(session, new_whitelist.admin_ckey)

wl = Whitelist(
player_id=player.id,
admin_id=admin.id,
wl_type=new_whitelist.wl_type,
expiration_time=datetime.datetime.now(
) + datetime.timedelta(days=new_whitelist.duration_days),
valid=new_whitelist.valid
)
return await create_whitelist(session, wl)

router.include_router(whitelist_ban_router)
26 changes: 19 additions & 7 deletions app/schemas/whitelist.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,28 @@
from pydantic import BaseModel


class NewWhitelistCkey(BaseModel):
player_ckey: str
admin_ckey: str
class NewWhitelistBase(BaseModel):
wl_type: str
duration_days: int


class NewWhitelistBanCkey(BaseModel):
class NewWhitelistBanBase(NewWhitelistBase):
reason: str | None = None


class NewWhitelistCkey(NewWhitelistBase):
player_ckey: str
admin_ckey: str
wl_type: str
duration_days: int
reason: str


class NewWhitelistBanCkey(NewWhitelistCkey, NewWhitelistBanBase):
pass


class NewWhitelistDiscord(NewWhitelistBase):
player_discord_id: str
admin_discord_id: str


class NewWhitelistBanDiscord(NewWhitelistCkey, NewWhitelistBanBase):
pass
1 change: 0 additions & 1 deletion app/tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ def client(app: FastAPI):

@pytest.fixture(scope="function")
def db_session():


# Create an in-memory SQLite database engine
# sqlite_engine = create_engine("sqlite:///:memory:", connect_args={"check_same_thread": False})
Expand Down
10 changes: 6 additions & 4 deletions app/tests/test_whitelist_route.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import datetime
from sqlmodel import select

from app.database.models import Player, Whitelist, WhitelistBan
from app.database.models import Whitelist


def test_get_whitelists_general_empty(client):
Expand All @@ -18,11 +17,14 @@ def test_get_whitelists_all(client, whitelist_factory):

assert wls == [Whitelist.model_validate(wl) for wl in response.json()]


def test_get_whitelists_active(client, whitelist_factory):
wls = [whitelist_factory() for _ in range(5)]
active_wls = [wl for wl in wls if wl.expiration_time > datetime.datetime.now() and wl.valid]
active_wls = [wl for wl in wls if wl.expiration_time >
datetime.datetime.now() and wl.valid]
response = client.get("/whitelist?active_only=true")
assert response.status_code == 200
assert len(response.json()) == len(active_wls)

assert active_wls == [Whitelist.model_validate(wl) for wl in response.json()]
assert active_wls == [Whitelist.model_validate(
wl) for wl in response.json()]
6 changes: 3 additions & 3 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
fastapi ~ = 0.112
fastapi ~= 0.112
fastapi[standard]
pydantic ~ = 2.8.2
sqlalchemy ~ = 2.0.33
pydantic ~= 2.8.2
sqlalchemy ~= 2.0.33
sqlmodel
psycopg2
aiohttp
Expand Down

0 comments on commit 112c2ff

Please sign in to comment.