From 082561ceac4a16a92eb31100d476dbdda6bb3027 Mon Sep 17 00:00:00 2001 From: Dilan Gilluly Date: Sun, 3 May 2026 22:30:58 -0400 Subject: [PATCH] API Server Basket Logic --- apiserver/src/data/repos.py | 41 ++++++++++++++++++++++++++++++++++- apiserver/src/data/routers.py | 38 ++++++++++++++++++++++++++++++-- apiserver/src/routers.py | 1 + 3 files changed, 77 insertions(+), 3 deletions(-) diff --git a/apiserver/src/data/repos.py b/apiserver/src/data/repos.py index 9f04be0..0e7337f 100644 --- a/apiserver/src/data/repos.py +++ b/apiserver/src/data/repos.py @@ -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."} diff --git a/apiserver/src/data/routers.py b/apiserver/src/data/routers.py index a156f34..1062920 100644 --- a/apiserver/src/data/routers.py +++ b/apiserver/src/data/routers.py @@ -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) diff --git a/apiserver/src/routers.py b/apiserver/src/routers.py index 588d5f8..bbc72b3 100644 --- a/apiserver/src/routers.py +++ b/apiserver/src/routers.py @@ -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)