This commit is contained in:
Tiago vasconcelos 2022-01-28 15:11:31 +00:00
parent d6d33c6a22
commit cad896f909
3 changed files with 65 additions and 67 deletions

View file

@ -16,6 +16,7 @@ from .models import (
Products, Products,
Stalls, Stalls,
Zones, Zones,
createOrder,
createProduct, createProduct,
createStalls, createStalls,
createZones, createZones,
@ -83,7 +84,7 @@ async def get_diagonalley_product(product_id: str) -> Optional[Products]:
row = await db.fetchone( row = await db.fetchone(
"SELECT * FROM diagonalley.products WHERE id = ?", (product_id,) "SELECT * FROM diagonalley.products WHERE id = ?", (product_id,)
) )
return Products.from_row(row) if row else None return Products(**row) if row else None
async def get_diagonalley_products(wallet_ids: Union[str, List[str]]) -> List[Products]: async def get_diagonalley_products(wallet_ids: Union[str, List[str]]) -> List[Products]:
@ -98,7 +99,7 @@ async def get_diagonalley_products(wallet_ids: Union[str, List[str]]) -> List[Pr
""", """,
(*wallet_ids,), (*wallet_ids,),
) )
return [Products.from_row(row) for row in rows] return [Products(**row) for row in rows]
async def delete_diagonalley_product(product_id: str) -> None: async def delete_diagonalley_product(product_id: str) -> None:
@ -139,12 +140,12 @@ async def update_diagonalley_zone(zone_id: str, **kwargs) -> Optional[Zones]:
(*kwargs.values(), zone_id), (*kwargs.values(), zone_id),
) )
row = await db.fetchone("SELECT * FROM diagonalley.zones WHERE id = ?", (zone_id,)) row = await db.fetchone("SELECT * FROM diagonalley.zones WHERE id = ?", (zone_id,))
return Zones.from_row(row) if row else None return Zones(**row) if row else None
async def get_diagonalley_zone(zone_id: str) -> Optional[Zones]: async def get_diagonalley_zone(zone_id: str) -> Optional[Zones]:
row = await db.fetchone("SELECT * FROM diagonalley.zones WHERE id = ?", (zone_id,)) row = await db.fetchone("SELECT * FROM diagonalley.zones WHERE id = ?", (zone_id,))
return Zones.from_row(row) if row else None return Zones(**row) if row else None
async def get_diagonalley_zones(wallet_ids: Union[str, List[str]]) -> List[Zones]: async def get_diagonalley_zones(wallet_ids: Union[str, List[str]]) -> List[Zones]:
@ -182,7 +183,7 @@ async def get_diagonalley_zones(wallet_ids: Union[str, List[str]]) -> List[Zones
rows = await db.fetchall( rows = await db.fetchall(
f"SELECT * FROM diagonalley.zones WHERE wallet IN ({q})", (*wallet_ids,) f"SELECT * FROM diagonalley.zones WHERE wallet IN ({q})", (*wallet_ids,)
) )
return [Zones.from_row(row) for row in rows] return [Zones(**row) for row in rows]
async def delete_diagonalley_zone(zone_id: str) -> None: async def delete_diagonalley_zone(zone_id: str) -> None:
@ -233,7 +234,7 @@ async def update_diagonalley_stall(stall_id: str, **kwargs) -> Optional[Stalls]:
row = await db.fetchone( row = await db.fetchone(
"SELECT * FROM diagonalley.stalls WHERE id = ?", (stall_id,) "SELECT * FROM diagonalley.stalls WHERE id = ?", (stall_id,)
) )
return Stalls.from_row(row) if row else None return Stalls(**row) if row else None
async def get_diagonalley_stall(stall_id: str) -> Optional[Stalls]: async def get_diagonalley_stall(stall_id: str) -> Optional[Stalls]:
@ -266,7 +267,7 @@ async def get_diagonalley_stall(stall_id: str) -> Optional[Stalls]:
row = await db.fetchone( row = await db.fetchone(
"SELECT * FROM diagonalley.stalls WHERE id = ?", (stall_id,) "SELECT * FROM diagonalley.stalls WHERE id = ?", (stall_id,)
) )
return Stalls.from_row(row) if row else None return Stalls(**row) if row else None
async def get_diagonalley_stalls(wallet_ids: Union[str, List[str]]) -> List[Stalls]: async def get_diagonalley_stalls(wallet_ids: Union[str, List[str]]) -> List[Stalls]:
@ -303,7 +304,7 @@ async def get_diagonalley_stalls(wallet_ids: Union[str, List[str]]) -> List[Stal
rows = await db.fetchall( rows = await db.fetchall(
f"SELECT * FROM diagonalley.stalls WHERE wallet IN ({q})", (*wallet_ids,) f"SELECT * FROM diagonalley.stalls WHERE wallet IN ({q})", (*wallet_ids,)
) )
return [Stalls.from_row(row) for row in rows] return [Stalls(**row) for row in rows]
async def delete_diagonalley_stall(stall_id: str) -> None: async def delete_diagonalley_stall(stall_id: str) -> None:
@ -314,47 +315,34 @@ async def delete_diagonalley_stall(stall_id: str) -> None:
async def create_diagonalley_order( async def create_diagonalley_order(
*, data: createOrder
productid: str,
wallet: str,
product: str,
quantity: int,
shippingzone: str,
address: str,
email: str,
invoiceid: str,
paid: bool,
shipped: bool,
) -> Orders: ) -> Orders:
returning = "" if db.type == SQLITE else "RETURNING ID"
method = db.execute if db.type == SQLITE else db.fetchone
order_id = urlsafe_short_hash() order_id = urlsafe_short_hash()
result = await (method)( await db.execute(
f""" f"""
INSERT INTO diagonalley.orders (id, productid, wallet, product, INSERT INTO diagonalley.orders (id, productid, wallet, product,
quantity, shippingzone, address, email, invoiceid, paid, shipped) quantity, shippingzone, address, email, invoiceid, paid, shipped)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
{returning}
""", """,
( (
order_id, order_id,
productid, data.productid,
wallet, data.wallet,
product, data.product,
quantity, data.quantity,
shippingzone, data.shippingzone,
address, data.address,
email, data.email,
invoiceid, data.invoiceid,
False, False,
False, False,
), ),
) )
if db.type == SQLITE: # if db.type == SQLITE:
order_id = result._result_proxy.lastrowid # order_id = result._result_proxy.lastrowid
else: # else:
order_id = result[0] # order_id = result[0]
link = await get_diagonalley_order(order_id) link = await get_diagonalley_order(order_id)
assert link, "Newly created link couldn't be retrieved" assert link, "Newly created link couldn't be retrieved"
@ -365,7 +353,7 @@ async def get_diagonalley_order(order_id: str) -> Optional[Orders]:
row = await db.fetchone( row = await db.fetchone(
"SELECT * FROM diagonalley.orders WHERE id = ?", (order_id,) "SELECT * FROM diagonalley.orders WHERE id = ?", (order_id,)
) )
return Orders.from_row(row) if row else None return Orders(**row) if row else None
async def get_diagonalley_orders(wallet_ids: Union[str, List[str]]) -> List[Orders]: async def get_diagonalley_orders(wallet_ids: Union[str, List[str]]) -> List[Orders]:
@ -377,7 +365,7 @@ async def get_diagonalley_orders(wallet_ids: Union[str, List[str]]) -> List[Orde
f"SELECT * FROM diagonalley.orders WHERE wallet IN ({q})", (*wallet_ids,) f"SELECT * FROM diagonalley.orders WHERE wallet IN ({q})", (*wallet_ids,)
) )
# #
return [Orders.from_row(row) for row in rows] return [Orders(**row) for row in rows]
async def delete_diagonalley_order(order_id: str) -> None: async def delete_diagonalley_order(order_id: str) -> None:

View file

@ -59,15 +59,25 @@ class Zones(BaseModel):
countries: str countries: str
class createOrder(BaseModel):
productid: str = Query(...)
stall: str = Query(...)
product: str = Query(...)
quantity: int = Query(..., ge=1)
shippingzone: int = Query(...)
address: str = Query(...)
email: str = Query(...)
invoiceid: str = Query(...)
class Orders(BaseModel): class Orders(BaseModel):
id: str = Query(None) id: str
productid: str = Query(None) productid: str
stall: str = Query(None) stall: str
product: str = Query(None) product: str
quantity: int = Query(0) quantity: int
shippingzone: int = Query(0) shippingzone: int
address: str = Query(None) address: str
email: str = Query(None) email: str
invoiceid: str = Query(None) invoiceid: str
paid: bool paid: bool
shipped: bool shipped: bool

View file

@ -44,6 +44,7 @@ from .models import (
Products, Products,
Stalls, Stalls,
Zones, Zones,
createOrder,
createProduct, createProduct,
createStalls, createStalls,
createZones, createZones,
@ -87,8 +88,8 @@ async def api_diagonalley_products(
@diagonalley_ext.post("/api/v1/products") @diagonalley_ext.post("/api/v1/products")
@diagonalley_ext.put("/api/v1/products/{product_id}") @diagonalley_ext.put("/api/v1/products/{product_id}")
async def api_diagonalley_product_create( async def api_diagonalley_product_create(
product_id,
data: createProduct, data: createProduct,
product_id: str = Query(None),
wallet: WalletTypeInfo = Depends(get_key_type) wallet: WalletTypeInfo = Depends(get_key_type)
): ):
@ -186,7 +187,7 @@ async def api_diagonalley_stalls(wallet: WalletTypeInfo = Depends(get_key_type),
@diagonalley_ext.post("/api/v1/stalls") @diagonalley_ext.post("/api/v1/stalls")
@diagonalley_ext.put("/api/v1/stalls/{stall_id}") @diagonalley_ext.put("/api/v1/stalls/{stall_id}")
async def api_diagonalley_stall_create(data: createStalls, stall_id = None, wallet: WalletTypeInfo = Depends(get_key_type)): async def api_diagonalley_stall_create(data: createStalls, stall_id: str = Query(None), wallet: WalletTypeInfo = Depends(get_key_type)):
if stall_id: if stall_id:
stall = await get_diagonalley_stall(stall_id) stall = await get_diagonalley_stall(stall_id)
@ -222,23 +223,22 @@ async def api_diagonalley_stall_delete(stall_id: str = Query(None), wallet: Wall
@diagonalley_ext.get("/api/v1/orders") @diagonalley_ext.get("/api/v1/orders")
async def api_diagonalley_orders(wallet: WalletTypeInfo = Depends(get_key_type)): async def api_diagonalley_orders(wallet: WalletTypeInfo = Depends(get_key_type), all_wallets: bool = Query(False)):
wallet_ids = [wallet.wallet.id] wallet_ids = [wallet.wallet.id]
if "all_wallets" in request.args: if all_wallets:
wallet_ids = (await get_user(wallet.wallet.user)).wallet_ids wallet_ids = (await get_user(wallet.wallet.user)).wallet_ids
try: try:
return ([order._asdict() for order in await get_diagonalley_orders(wallet_ids)]) return ([order.dict() for order in await get_diagonalley_orders(wallet_ids)])
except: except:
return ({"message": "We could not retrieve the orders."})) return ({"message": "We could not retrieve the orders."})
@diagonalley_ext.post("/api/v1/orders") @diagonalley_ext.post("/api/v1/orders")
async def api_diagonalley_order_create(data: createOrder, wallet: WalletTypeInfo = Depends(get_key_type)):
async def api_diagonalley_order_create(data: createOrders, wallet: WalletTypeInfo = Depends(get_key_type)): order = await create_diagonalley_order(wallet_id=wallet.wallet.id, data=data)
order = await create_diagonalley_order(wallet_id=wallet.wallet.id, data) return order.dict()
return ({**order._asdict()})
@diagonalley_ext.delete("/api/v1/orders/{order_id}") @diagonalley_ext.delete("/api/v1/orders/{order_id}")
@ -281,7 +281,7 @@ async def api_diagonalley_order_shipped(order_id: str = Query(None), wallet: Wal
"SELECT * FROM diagonalley.orders WHERE id = ?", (order_id,) "SELECT * FROM diagonalley.orders WHERE id = ?", (order_id,)
) )
return ([order._asdict() for order in get_diagonalley_orders(order["wallet"])])) return ([order.dict() for order in get_diagonalley_orders(order["wallet"])])
###List products based on stall id ###List products based on stall id
@ -303,14 +303,14 @@ async def api_diagonalley_stall_products(stall_id: str = Query(None), wallet: Wa
if not products: if not products:
return ({"message": "No products"}) return ({"message": "No products"})
return ([products._asdict() for products in await get_diagonalley_products(rows[1])]) return ([products.dict() for products in await get_diagonalley_products(rows[1])])
###Check a product has been shipped ###Check a product has been shipped
@diagonalley_ext.get("/api/v1/stall/checkshipped/{checking_id}") @diagonalley_ext.get("/api/v1/stall/checkshipped/{checking_id}")
async def api_diagonalley_stall_checkshipped(checking_id: str = Query(None), wallet: WalletTypeInfo = Depends(get_key_type)): async def api_diagonalley_stall_checkshipped(checking_id, wallet: WalletTypeInfo = Depends(get_key_type)):
rows = await db.fetchone( rows = await db.fetchone(
"SELECT * FROM diagonalley.orders WHERE invoiceid = ?", (checking_id,) "SELECT * FROM diagonalley.orders WHERE invoiceid = ?", (checking_id,)
) )
@ -321,19 +321,19 @@ async def api_diagonalley_stall_checkshipped(checking_id: str = Query(None), wal
@diagonalley_ext.post("/api/v1/stall/order/{stall_id}") @diagonalley_ext.post("/api/v1/stall/order/{stall_id}")
async def api_diagonalley_stall_order(data:createOrders, wallet: WalletTypeInfo = Depends(get_key_type)): async def api_diagonalley_stall_order(stall_id, data: createOrder, wallet: WalletTypeInfo = Depends(get_key_type)):
product = await get_diagonalley_product(data.id) product = await get_diagonalley_product(data.productid)
shipping = await get_diagonalley_stall(stall_id) shipping = await get_diagonalley_stall(stall_id)
if data.shippingzone == 1: if data.shippingzone == 1:
shippingcost = shipping.zone1cost shippingcost = shipping.zone1cost #missing in model
else: else:
shippingcost = shipping.zone2cost shippingcost = shipping.zone2cost #missing in model
checking_id, payment_request = await create_invoice( checking_id, payment_request = await create_invoice(
wallet_id=product.wallet, wallet_id=product.wallet,
amount=shippingcost + (data.quantity * product.price), amount=shippingcost + (data.quantity * product.price),
memo=data.id, memo=shipping.wallet,
) )
selling_id = urlsafe_b64encode(uuid4().bytes_le).decode("utf-8") selling_id = urlsafe_b64encode(uuid4().bytes_le).decode("utf-8")
await db.execute( await db.execute(
@ -343,8 +343,8 @@ async def api_diagonalley_stall_order(data:createOrders, wallet: WalletTypeInfo
""", """,
( (
selling_id, selling_id,
data.id, data.productid,
product.wallet, product.wallet, #doesn't exist in model
product.product, product.product,
data.quantity, data.quantity,
data.shippingzone, data.shippingzone,
@ -355,4 +355,4 @@ async def api_diagonalley_stall_order(data:createOrders, wallet: WalletTypeInfo
False, False,
), ),
) )
return ({"checking_id": checking_id, "payment_request": payment_request})) return ({"checking_id": checking_id, "payment_request": payment_request})