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 ..core.models import RepoTemplate
from .models import Prefix, Ticket, Count from .models import Prefix, Ticket, Count, Basket
class PrefixRepo(RepoTemplate): class PrefixRepo(RepoTemplate):
@@ -81,3 +81,42 @@ class CountsRepo(RepoTemplate):
self.cur.execute("SELECT * FROM counts") self.cur.execute("SELECT * FROM counts")
results = self.cur.fetchall() results = self.cur.fetchall()
return [Count(*r) for r in results] 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 fastapi import APIRouter, Header, status, HTTPException
from .repos import PrefixRepo, TicketRepo, CountsRepo from .repos import PrefixRepo, TicketRepo, CountsRepo, BasketRepo
from .models import Prefix, Ticket from .models import Prefix, Ticket, Basket
from ..core.auth import AuthRepo from ..core.auth import AuthRepo
prefix_router = APIRouter(prefix="/api/prefix") prefix_router = APIRouter(prefix="/api/prefix")
@@ -68,3 +68,37 @@ counts_router = APIRouter(prefix="/api/counts")
def get_counts(tam_auth_key: str = Header("")): def get_counts(tam_auth_key: str = Header("")):
AuthRepo().verify_key(tam_auth_key) AuthRepo().verify_key(tam_auth_key)
return CountsRepo().get_counts() 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.prefix_router)
app.include_router(routers.ticket_router) app.include_router(routers.ticket_router)
app.include_router(routers.counts_router) app.include_router(routers.counts_router)
app.include_router(routers.basket_router)