11"""
2- All jaffle shop routers
2+ All jaffle shop routers for api v1
33"""
44
5+ from typing import List
6+
57import duckdb
68from urllib .parse import urlencode
79from fastapi import APIRouter , Depends , Response , Request
810
911from app .db import get_db
10- from app .const import PAGE_SIZE
12+ from app .const import DEFAULT_PAGE_SIZE , API_V1_PREFIX
13+ from app .models import Customer
1114
12- # defined routers
1315customers_router = APIRouter (tags = ["customers" ])
1416orders_router = APIRouter (tags = ["orders" ])
1517item_router = APIRouter (tags = ["items" ])
@@ -35,14 +37,15 @@ def _get_paged_response(
3537 response : Response = None ,
3638 where_clause : str = "" ,
3739 sort_by : str = "" ,
40+ page_size : int = DEFAULT_PAGE_SIZE ,
3841):
3942 """
4043 Get a paged response from a collection endpoint
4144 Will insert next header if applicable
4245 """
4346
44- offset = (page - 1 ) * PAGE_SIZE
45- last_item = offset + PAGE_SIZE
47+ offset = (page - 1 ) * page_size
48+ last_item = offset + page_size
4649 count = db .query (f"SELECT COUNT(*) FROM { table_name } { where_clause } " ).fetchone ()[0 ]
4750
4851 # get base url from request
@@ -51,7 +54,7 @@ def _get_paged_response(
5154 # )
5255 # scheme = request.headers.get("X-Forwarded-Proto", "http")
5356
54- url = f"/{ table_name } "
57+ url = API_V1_PREFIX + f"/{ table_name } "
5558 query_params = dict (request .query_params )
5659 if last_item < count and response :
5760 query_params ["page" ] = page + 1
@@ -60,7 +63,7 @@ def _get_paged_response(
6063
6164 return _get_list_response (
6265 db ,
63- f"SELECT * FROM { table_name } { where_clause } { sort_by } LIMIT { PAGE_SIZE } OFFSET { offset } " ,
66+ f"SELECT * FROM { table_name } { where_clause } { sort_by } LIMIT { page_size } OFFSET { offset } " ,
6467 )
6568
6669
@@ -78,17 +81,25 @@ def _get_single_response(db: duckdb.DuckDBPyConnection, query: str):
7881#
7982
8083
81- @customers_router .get ("/customers" )
84+ @customers_router .get ("/customers" , response_model = List [ Customer ] )
8285async def get_customers (
8386 page : int = 1 ,
87+ page_size : int = DEFAULT_PAGE_SIZE ,
8488 response : Response = None ,
8589 request : Request = None ,
8690 db : duckdb .DuckDBPyConnection = Depends (get_db ),
8791):
88- return _get_paged_response (db , request , "customers" , page , response )
92+ return _get_paged_response (
93+ db = db ,
94+ request = request ,
95+ table_name = "customers" ,
96+ page = page ,
97+ response = response ,
98+ page_size = page_size ,
99+ )
89100
90101
91- @customers_router .get ("/customers/{customer_id}" )
102+ @customers_router .get ("/customers/{customer_id}" , response_model = Customer )
92103async def get_customer (
93104 customer_id : str , db : duckdb .DuckDBPyConnection = Depends (get_db )
94105):
@@ -116,6 +127,7 @@ def _enrich_orders(db: duckdb.DuckDBPyConnection, orders: list[dict]):
116127@orders_router .get ("/orders" )
117128async def get_orders (
118129 page : int = 1 ,
130+ page_size : int = DEFAULT_PAGE_SIZE ,
119131 start_date : str = None ,
120132 end_date : str = None ,
121133 response : Response = None ,
@@ -124,14 +136,19 @@ async def get_orders(
124136):
125137 where_clause = ""
126138 if start_date :
127- where_clause += f" AND ordered_at >= '{ start_date } '"
139+ where_clause += f" AND ordered_at::DATE >= '{ start_date } '"
128140 if end_date :
129- where_clause += f" AND ordered_at <= '{ end_date } '"
141+ where_clause += f" AND ordered_at::DATE <= '{ end_date } '"
130142 if where_clause :
131143 where_clause = f"WHERE { where_clause [5 :]} "
132- sort_by = "ORDER BY ordered_at ASC"
133144 orders = _get_paged_response (
134- db , request , "orders" , page , response , where_clause , sort_by
145+ db = db ,
146+ request = request ,
147+ table_name = "orders" ,
148+ page = page ,
149+ page_size = page_size ,
150+ response = response ,
151+ where_clause = where_clause ,
135152 )
136153 return _enrich_orders (db , orders )
137154
@@ -147,11 +164,19 @@ async def get_order(order_id: str, db: duckdb.DuckDBPyConnection = Depends(get_d
147164@item_router .get ("/items" )
148165async def get_items (
149166 page : int = 1 ,
167+ page_size : int = DEFAULT_PAGE_SIZE ,
150168 response : Response = None ,
151169 request : Request = None ,
152170 db : duckdb .DuckDBPyConnection = Depends (get_db ),
153171):
154- return _get_paged_response (db , request , "items" , page , response )
172+ return _get_paged_response (
173+ db = db ,
174+ request = request ,
175+ table_name = "items" ,
176+ page = page ,
177+ response = response ,
178+ page_size = page_size ,
179+ )
155180
156181
157182@item_router .get ("/items/{item_id}" )
@@ -165,11 +190,19 @@ async def get_item(item_id: str, db: duckdb.DuckDBPyConnection = Depends(get_db)
165190@product_router .get ("/products" )
166191async def get_products (
167192 page : int = 1 ,
193+ page_size : int = DEFAULT_PAGE_SIZE ,
168194 response : Response = None ,
169195 request : Request = None ,
170196 db : duckdb .DuckDBPyConnection = Depends (get_db ),
171197):
172- return _get_paged_response (db , request , "products" , page , response )
198+ return _get_paged_response (
199+ db = db ,
200+ request = request ,
201+ table_name = "products" ,
202+ page = page ,
203+ response = response ,
204+ page_size = page_size ,
205+ )
173206
174207
175208@product_router .get ("/products/{sku}" )
@@ -183,11 +216,19 @@ async def get_product(sku: str, db: duckdb.DuckDBPyConnection = Depends(get_db))
183216@store_router .get ("/stores" )
184217async def get_stores (
185218 page : int = 1 ,
219+ page_size : int = DEFAULT_PAGE_SIZE ,
186220 response : Response = None ,
187221 request : Request = None ,
188222 db : duckdb .DuckDBPyConnection = Depends (get_db ),
189223):
190- return _get_paged_response (db , request , "stores" , page , response )
224+ return _get_paged_response (
225+ db = db ,
226+ request = request ,
227+ table_name = "stores" ,
228+ page = page ,
229+ response = response ,
230+ page_size = page_size ,
231+ )
191232
192233
193234@store_router .get ("/stores/{store_id}" )
@@ -201,11 +242,19 @@ async def get_store(store_id: str, db: duckdb.DuckDBPyConnection = Depends(get_d
201242@supplies_router .get ("/supplies" )
202243async def get_supplies (
203244 page : int = 1 ,
245+ page_size : int = DEFAULT_PAGE_SIZE ,
204246 response : Response = None ,
205247 request : Request = None ,
206248 db : duckdb .DuckDBPyConnection = Depends (get_db ),
207249):
208- return _get_paged_response (db , request , "supplies" , page , response )
250+ return _get_paged_response (
251+ db = db ,
252+ request = request ,
253+ table_name = "supplies" ,
254+ page = page ,
255+ response = response ,
256+ page_size = page_size ,
257+ )
209258
210259
211260@supplies_router .get ("/supplies/{supply_id}" )
0 commit comments