API Server Basket Logic

This commit is contained in:
2026-05-03 22:30:58 -04:00
parent bf576376e7
commit 082561ceac
3 changed files with 77 additions and 3 deletions
+40 -1
View File
@@ -1,5 +1,5 @@
from ..core.models import RepoTemplate
from .models import Prefix, Ticket, Count
from .models import Prefix, Ticket, Count, Basket
class PrefixRepo(RepoTemplate):
@@ -81,3 +81,42 @@ class CountsRepo(RepoTemplate):
self.cur.execute("SELECT * FROM counts")
results = self.cur.fetchall()
return [Count(*r) for r in results]
class BasketRepo(RepoTemplate):
"""Repo that controls the baskets system."""
def get_all_baskets(self):
"""Gets all baskets from db."""
self.cur.execute("SELECT * FROM baskets ORDER BY prefix, basket_id")
results = self.cur.fetchall()
return [Basket(*r) for r in results]
def get_prefix_baskets(self, prefix: str):
"""Gets all baskets of a particular prefix."""
self.cur.execute("SELECT * FROM baskets WHERE prefix = ? ORDER BY basket_id", (prefix,))
results = self.cur.fetchall()
return [Basket(*r) for r in results]
def get_one_baskets(self, prefix: str, b_id: int):
"""Gets one basket."""
self.cur.execute("SELECT * FROM baskets WHERE prefix = ? AND basket_id = ?", (prefix, b_id))
result = self.cur.fetchone()
if result:
return Basket(*result)
else:
return Basket(prefix, b_id)
def get_range_baskets(self, prefix: str, r_start: int, r_end: int):
"""Gets a range of baskets."""
self.cur.execute("SELECT * FROM baskets WHERE prefix = ? AND basket_id BETWEEN ? AND ? ORDER BY basket_id", (prefix, r_start, r_end))
results = self.cur.fetchall()
return [Basket(*r) for r in results]
def post_baskets(self, bs: list[Basket]):
"""Posts baskets to database."""
for b in bs:
self.cur.execute("""INSERT INTO baskets VALUES (?, ?, ?, ?)
ON CONFLICT (prefix, basket_id) DO UPDATE
SET description = EXCLUDED.description""", (b.prefix, b.basket_id, b.description, b.winning_ticket))
self.conn.commit()
return {"detail": "Baskets posted successfully."}
+36 -2
View File
@@ -1,7 +1,7 @@
from fastapi import APIRouter, Header, status, HTTPException
from .repos import PrefixRepo, TicketRepo, CountsRepo
from .models import Prefix, Ticket
from .repos import PrefixRepo, TicketRepo, CountsRepo, BasketRepo
from .models import Prefix, Ticket, Basket
from ..core.auth import AuthRepo
prefix_router = APIRouter(prefix="/api/prefix")
@@ -68,3 +68,37 @@ counts_router = APIRouter(prefix="/api/counts")
def get_counts(tam_auth_key: str = Header("")):
AuthRepo().verify_key(tam_auth_key)
return CountsRepo().get_counts()
basket_router = APIRouter(prefix="/api/baskets")
@basket_router.get("")
def get_all_baskets(tam_auth_key: str = Header("")):
AuthRepo().verify_key(tam_auth_key)
return BasketRepo().get_all_baskets()
@basket_router.get("/{prefix}")
def get_prefix_baskets(prefix: str, tam_auth_key: str = Header("")):
AuthRepo().verify_key(tam_auth_key)
return BasketRepo().get_prefix_baskets(prefix)
@basket_router.get("/{prefix}/{s_id}")
def get_basket_scope(prefix: str, s_id: str, tam_auth_key: str = Header("")) -> Basket | list[Basket]:
AuthRepo().verify_key(tam_auth_key)
if "-" in s_id:
l_id = s_id.split("-", maxsplit=2)
try:
r_start, r_end = int(l_id[0]), int(l_id[1])
except ValueError:
raise inv_numbers_ex
return BasketRepo().get_range_baskets(prefix, r_start, r_end)
else:
try:
i_id = int(s_id)
except ValueError:
raise inv_numbers_ex
return BasketRepo().get_one_baskets(prefix, i_id)
@basket_router.post("")
def post_baskets(bs: list[Basket], tam_auth_key: str = Header("")):
AuthRepo().verify_key(tam_auth_key)
return BasketRepo().post_baskets(bs)
+1
View File
@@ -8,3 +8,4 @@ def append_routers(app: FastAPI):
app.include_router(routers.prefix_router)
app.include_router(routers.ticket_router)
app.include_router(routers.counts_router)
app.include_router(routers.basket_router)