diff --git a/lnbits/extensions/diagonalley/crud.py b/lnbits/extensions/diagonalley/crud.py index 67ef15c9..fbc1d332 100644 --- a/lnbits/extensions/diagonalley/crud.py +++ b/lnbits/extensions/diagonalley/crud.py @@ -12,6 +12,7 @@ from lnbits.settings import WALLET from . import db from .models import ( + Market, Orders, Products, Stalls, @@ -261,3 +262,27 @@ async def get_diagonalley_orders(wallet_ids: Union[str, List[str]]) -> List[Orde async def delete_diagonalley_order(order_id: str) -> None: await db.execute("DELETE FROM diagonalley.orders WHERE id = ?", (order_id,)) + +### Market/Marketplace + +async def get_diagonalley_markets(user: str) -> List[Market]: + rows = await db.fetchall( + 'SELECT * FROM diagonalley.markets WHERE usr = ?', (user,) + ) + return [Market(**row) for row in rows] + + +async def get_diagonalley_market(market_id: str) -> Optional[Market]: + row = await db.fetchone( + 'SELECT * FROM diagonalley.markets WHERE id = ?', (market_id,) + ) + Market(**row) if row else None + + +async def get_diagonalley_market_stalls(market_id: str): + rows = await db.fetchall( + "SELECT * FROM diagonalley.market_stalls WHERE marketid = ?", (market_id,) + ) + return [Stalls(**row) for row in rows] + + diff --git a/lnbits/extensions/diagonalley/migrations.py b/lnbits/extensions/diagonalley/migrations.py index 0ad308b8..e994d723 100644 --- a/lnbits/extensions/diagonalley/migrations.py +++ b/lnbits/extensions/diagonalley/migrations.py @@ -86,4 +86,30 @@ async def m001_initial(db): ); """ ) + + """ + Initial market table. + """ + await db.execute( + """ + CREATE TABLE diagonalley.markets ( + id TEXT PRIMARY KEY, + usr TEXT NOT NULL, + name TEXT + ); + """ + ) + + """ + Initial market stalls table. + """ + await db.execute( + """ + CREATE TABLE diagonalley.market_stalls ( + id TEXT PRIMARY KEY, + marketid TEXT NOT NULL REFERENCES {db.references_schema}markets (id), + stallid TEXT NOT NULL REFERENCES {db.references_schema}stalls (id) + ); + """ + ) diff --git a/lnbits/extensions/diagonalley/models.py b/lnbits/extensions/diagonalley/models.py index 2132d72f..4fbf04ff 100644 --- a/lnbits/extensions/diagonalley/models.py +++ b/lnbits/extensions/diagonalley/models.py @@ -1,4 +1,4 @@ -from typing import Optional +from typing import List, Optional from fastapi.param_functions import Query from pydantic import BaseModel @@ -81,3 +81,13 @@ class Orders(BaseModel): paid: bool shipped: bool time: int + +class CreateMarket(BaseModel): + usr: str = Query(...) + name: str = Query(None) + stalls: List[str] = Query(...) + +class Market(BaseModel): + id: str + usr: str + name: Optional[str] diff --git a/lnbits/extensions/diagonalley/templates/diagonalley/index.html b/lnbits/extensions/diagonalley/templates/diagonalley/index.html index 0a56408d..dbe443eb 100644 --- a/lnbits/extensions/diagonalley/templates/diagonalley/index.html +++ b/lnbits/extensions/diagonalley/templates/diagonalley/index.html @@ -816,7 +816,7 @@ new Vue({ { name: 'stall', align: 'left', - label: 'Stall', + label: 'Store', field: 'stall' }, { @@ -1384,23 +1384,21 @@ new Vue({ LNbits.utils.exportCSV(this.zonesTable.columns, this.zones) }, //////////////////////////////////////// - //////////////////SHOP////////////////// + //////////////////MARKET////////////////// //////////////////////////////////////// - getShops: function () { - var self = this - + getMarkets(){ LNbits.api .request( 'GET', - '/diagonalley/api/v1/shops?all_wallets=true', + '/diagonalley/api/v1/markets', this.g.user.wallets[0].inkey ) - .then(function (response) { + .then((response) => { if (response.data) { - self.shops = response.data.map(mapShops) + this.shops = response.data.map(mapShops) } }) - .catch(function (error) { + .catch((error) => { LNbits.utils.notifyApiError(error) }) }, @@ -1451,7 +1449,6 @@ new Vue({ }) }, createShop: function (data) { - var self = this console.log('cuntywoo') LNbits.api .request( @@ -1591,6 +1588,7 @@ new Vue({ this.getProducts() this.getZones() this.getOrders() + this.getMarkets() this.customerKeys = [ 'cb4c0164fe03fcdadcbfb4f76611c71620790944c24f21a1cd119395cdedfe1b', 'a9c17358a6dc4ceb3bb4d883eb87967a66b3453a0f3199f0b1c8eef8070c6a07' diff --git a/lnbits/extensions/diagonalley/views.py b/lnbits/extensions/diagonalley/views.py index 70d5c146..2ec75589 100644 --- a/lnbits/extensions/diagonalley/views.py +++ b/lnbits/extensions/diagonalley/views.py @@ -38,3 +38,21 @@ async def display(request: Request, stall_id): "products": [product.dict() for product in products] }, ) + +@diagonalley_ext.get("/{market_id}", response_class=HTMLResponse) +async def display(request: Request, stall_id): + stalls = await get_diagonalley_stall(stall_id) + products = await get_diagonalley_products(stall_id) + + if not stall: + raise HTTPException( + status_code=HTTPStatus.NOT_FOUND, detail="Stall does not exist." + ) + return diagonalley_renderer().TemplateResponse( + "diagonalley/stall.html", + { + "request": request, + "stall": stall.dict(), + "products": [product.dict() for product in products] + }, + ) diff --git a/lnbits/extensions/diagonalley/views_api.py b/lnbits/extensions/diagonalley/views_api.py index c57eeaa3..b2fb5a47 100644 --- a/lnbits/extensions/diagonalley/views_api.py +++ b/lnbits/extensions/diagonalley/views_api.py @@ -25,6 +25,8 @@ from .crud import ( delete_diagonalley_product, delete_diagonalley_stall, delete_diagonalley_zone, + get_diagonalley_market, + get_diagonalley_markets, get_diagonalley_order, get_diagonalley_orders, get_diagonalley_product, @@ -38,6 +40,7 @@ from .crud import ( update_diagonalley_zone, ) from .models import ( + CreateMarket, Orders, Products, Stalls, @@ -383,3 +386,39 @@ async def api_diagonalley_stall_order( ), ) return {"checking_id": checking_id, "payment_request": payment_request} + + +## +# MARKETS +## + +@diagonalley_ext.get("/api/v1/markets") +async def api_diagonalley_orders( + wallet: WalletTypeInfo = Depends(get_key_type) +): + try: + return [market.dict() for market in await get_diagonalley_markets(wallet.wallet.user)] + except: + return {"message": "We could not retrieve the markets."} + +@diagonalley_ext.post("/api/v1/markets") +@diagonalley_ext.put("/api/v1/markets/{market_id}") +async def api_diagonalley_stall_create( + data: CreateMarket, + market_id: str = None, + wallet: WalletTypeInfo = Depends(require_invoice_key), +): + + if market_id: + market = await get_diagonalley_market(market_id) + if not market: + return {"message": "Market does not exist."} + + if market.usr != wallet.wallet.user: + return {"message": "Not your market."} + + market = await update_diagonalley_market(market_id, **data.dict()) + else: + market = await create_diagonalley_market(data=data) + + return market.dict()