diff --git a/api/app/data/__pycache__/baskets.cpython-314.pyc b/api/app/data/__pycache__/baskets.cpython-314.pyc new file mode 100644 index 0000000..1568686 Binary files /dev/null and b/api/app/data/__pycache__/baskets.cpython-314.pyc differ diff --git a/api/app/data/baskets.py b/api/app/data/baskets.py new file mode 100644 index 0000000..6b82614 --- /dev/null +++ b/api/app/data/baskets.py @@ -0,0 +1,65 @@ +from dataclasses import dataclass +from db import RepoTemplate +from system.auth import AuthRepo +from fastapi import APIRouter, Header + +@dataclass +class Basket: + prefix: str + b_id: int + description: str = "" + donors: str = "" + winning_ticket: int = 0 + +class BasketRepo(RepoTemplate): + def get_all_baskets(self): + self.cur.execute("SELECT * FROM baskets ORDER BY prefix, b_id") + results = self.cur.fetchall() + return [Basket(*r) for r in results] + def get_prefix_baskets(self, prefix: str): + self.cur.execute("SELECT * FROM baskets WHERE prefix = ? ORDER BY prefix, b_id", (prefix,)) + results = self.cur.fetchall() + return [Basket(*r) for r in results] + def get_single_basket(self, prefix: str, b_id: int): + self.cur.execute("SELECT * FROM baskets WHERE prefix = ? AND b_id = ? ORDER BY prefix, b_id", (prefix, b_id)) + results = self.cur.fetchall() + return [Basket(*r) for r in results] + def get_range_baskets(self, prefix: str, id_from: int, id_to: int): + self.cur.execute("""SELECT * FROM baskets WHERE prefix = ? AND b_id BETWEEN ? AND ? + ORDER BY prefix, b_id""", (prefix, id_from, id_to)) + results = self.cur.fetchall() + return [Basket(*r) for r in results] + def post_baskets(self, bs: list[Basket]): + for b in bs: + self.cur.execute("""INSERT INTO baskets VALUES (?, ?, ?, ?, ?) ON CONFLICT (prefix, b_id) DO UPDATE SET + description = EXCLUDED.description, donors = EXCLUDED.donors""", + (b.prefix, b.b_id, b.description, b.donors, b.winning_ticket)) + self.conn.commit() + return bs + +basket_router = APIRouter(prefix="/api/baskets") + +@basket_router.get("") +def get_all_baskets(tam_key: str = Header("")): + AuthRepo().verify_key(tam_key) + return BasketRepo().get_all_baskets() + +@basket_router.get("/{prefix}") +def get_prefix_baskets(prefix: str, tam_key: str = Header("")): + AuthRepo().verify_key(tam_key) + return BasketRepo().get_prefix_baskets(prefix) + +@basket_router.get("/{prefix}/{b_id}") +def get_single_basket(prefix: str, b_id: int, tam_key: str = Header("")): + AuthRepo().verify_key(tam_key) + return BasketRepo().get_single_basket(prefix, b_id) + +@basket_router.get("/{prefix}/{id_from}/{id_to}") +def get_range_baskets(prefix: str, id_from: int, id_to: int, tam_key: str = Header("")): + AuthRepo().verify_key(tam_key) + return BasketRepo().get_range_baskets(prefix, id_from, id_to) + +@basket_router.post("") +def post_baskets(bs: list[Basket], tam_key: str = Header("")): + AuthRepo().verify_key(tam_key) + return BasketRepo().post_baskets(bs) diff --git a/api/app/db.py b/api/app/db.py index 3e1c02b..b1fed1c 100644 --- a/api/app/db.py +++ b/api/app/db.py @@ -19,6 +19,8 @@ def init_db(): cur.execute("CREATE TABLE IF NOT EXISTS prefixes (prefix TEXT PRIMARY KEY, color TEXT, weight INTEGER)") cur.execute("""CREATE TABLE IF NOT EXISTS tickets (prefix TEXT, t_id INTEGER, first_name TEXT, last_name TEXT, phone_number TEXT, pref TEXT, PRIMARY KEY (prefix, t_id))""") + cur.execute("""CREATE TABLE IF NOT EXISTS baskets (prefix TEXT, b_id INTEGER, description TEXT, donors TEXT, + winning_ticket INTEGER, PRIMARY KEY (prefix, b_id))""") conn.commit() conn.close() diff --git a/api/app/routers.py b/api/app/routers.py index e008d6a..e7a2ba5 100644 --- a/api/app/routers.py +++ b/api/app/routers.py @@ -2,8 +2,10 @@ from fastapi import FastAPI from system.auth import auth_router from system.prefixes import prefix_router from data.tickets import tickets_router +from data.baskets import basket_router def imp_routers(app: FastAPI): app.include_router(auth_router) app.include_router(prefix_router) app.include_router(tickets_router) + app.include_router(basket_router) diff --git a/client/drizzle.config.js b/client/drizzle.config.js index a817cd2..11902d4 100644 --- a/client/drizzle.config.js +++ b/client/drizzle.config.js @@ -1,6 +1,6 @@ import { defineConfig } from 'drizzle-kit'; -const dbURL = (process.env.TAM_DATA_DIR || "./data") + "/tam-local.db" +const dbURL = (process.env.TAM_DATA_DIR || './data') + '/tam-local.db'; export default defineConfig({ schema: './src/lib/server/db/schema.js', diff --git a/client/src/app.html b/client/src/app.html index 6a2bb58..a3adaa3 100644 --- a/client/src/app.html +++ b/client/src/app.html @@ -6,7 +6,7 @@ %sveltekit.head% -
+{data.venueName}
+{data.venueName}
-|
+ Baskets:
+ {#each prefixes as p (p.prefix)}
+ {p.prefix}
+ {/each}
+ {pageTitle}+ |
+ |||||||||||||||||||||||||||||||||||||||||||||||||
| {header} | + {/each} +|||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {item.b_id} | +(item.changed = true)} + bind:value={item.description} + /> | +(item.changed = true)} + bind:value={item.donors} + /> | ++ | ||||||||||||||||||||||||||||||||||||||||||||||
{status.message}
-{status.message}
+|
|
- |||||||||||||||||||||||||||||||||||||||||||||||||
{pageTitle} |
- |||||||||||||||||||||||||||||||||||||||||||||||||