create marketplace with stalls

This commit is contained in:
Tiago vasconcelos 2022-09-12 16:58:56 +01:00
parent 6ef7411999
commit f429037d63
4 changed files with 91 additions and 28 deletions

View file

@ -9,6 +9,8 @@ from lnbits.settings import WALLET
from . import db
from .models import (
CreateMarket,
CreateMarketStalls,
Market,
OrderDetail,
Orders,
@ -332,11 +334,55 @@ 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
return 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]
return [{**row} for row in rows]
async def create_diagonalley_market(data: CreateMarket):
market_id = urlsafe_short_hash()
await db.execute(
"""
INSERT INTO diagonalley.markets (id, usr, name)
VALUES (?, ?, ?)
""",
(
market_id,
data.usr,
data.name,
),
)
market = await get_diagonalley_market(market_id)
assert market, "Newly created market couldn't be retrieved"
return market
async def create_diagonalley_market_stalls(
market_id: str, data: List[CreateMarketStalls]
):
for stallid in data:
id = urlsafe_short_hash()
await db.execute(
"""
INSERT INTO diagonalley.market_stalls (id, marketid, stallid)
VALUES (?, ?, ?)
""",
(
id,
market_id,
stallid,
),
)
market_stalls = await get_diagonalley_market_stalls(market_id)
return market_stalls
async def update_diagonalley_market(market_id):
pass

View file

@ -103,3 +103,6 @@ class Market(BaseModel):
id: str
usr: str
name: Optional[str]
class CreateMarketStalls(BaseModel):
stallid: str

View file

@ -179,12 +179,12 @@
</q-form>
</q-card>
</q-dialog>
<!-- SHOP DIALOG -->
<!-- MARKETPLACE/SHOP DIALOG -->
<q-dialog v-model="marketDialog.show" position="top">
<q-card class="q-pa-lg q-pt-xl" style="width: 500px">
<q-form @submit="sendShopFormData" class="q-gutter-md">
<q-form @submit="sendMarketplaceFormData" class="q-gutter-md">
<q-toggle
label="Activate shop"
label="Activate marketplace"
color="primary"
v-model="marketDialog.data.activate"
></q-toggle>
@ -197,13 +197,19 @@
label="Stalls"
v-model.trim="marketDialog.data.stalls"
></q-select>
<q-input
filled
dense
v-model.trim="marketDialog.data.name"
label="Name"
></q-input>
<div class="row q-mt-lg">
<q-btn
v-if="marketDialog.data.id"
unelevated
color="primary"
type="submit"
>Update Relay</q-btn
>Update Marketplace</q-btn
>
<q-btn
v-else
@ -212,7 +218,7 @@
:disable="marketDialog.data.activate == null
|| marketDialog.data.stalls == null"
type="submit"
>Launch</q-btn
>Launch Marketplace</q-btn
>
<q-btn
@ -368,7 +374,7 @@
>+ Store
<q-tooltip> Create a store to list products on </q-tooltip></q-btn
>
<q-btn unelevated color="primary" @click="shopDialog.show = true"
<q-btn unelevated color="primary" @click="marketDialog.show = true"
>Launch frontend shop (not Nostr)
<q-tooltip>
Makes a simple frontend shop for your stalls</q-tooltip
@ -809,6 +815,11 @@
return obj
}
const mapMarkets = obj => {
obj._data = _.clone(obj)
return obj
}
const humanReadableZones = zones => {
return zones.map(z => `${z.id} - ${z.countries}`)
}
@ -1505,7 +1516,7 @@
)
.then(response => {
if (response.data) {
this.shops = response.data.map(mapShops)
this.markets = response.data.map(mapMarkets)
}
})
.catch(error => {
@ -1514,12 +1525,12 @@
},
openShopUpdateDialog: function (linkId) {
var self = this
var link = _.findWhere(self.shops, {id: linkId})
var link = _.findWhere(self.markets, {id: linkId})
this.shopDialog.data = _.clone(link._data)
this.shopDialog.show = true
this.marketDialog.data = _.clone(link._data)
this.marketDialog.show = true
},
sendShopFormData: function () {
sendMarketplaceFormData: function () {
let data = {...this.marketDialog.data}
if (!data.usr) {
@ -1529,7 +1540,7 @@
if (data.id) {
this.updateZone(data)
} else {
this.createZone(data)
this.createMarketplace(data)
}
},
updateShop: function (data) {
@ -1539,24 +1550,24 @@
'PUT',
'/diagonalley/api/v1/shops' + data.id,
_.findWhere(self.g.user.wallets, {
id: self.shopDialog.data.wallet
id: self.marketDialog.data.wallet
}).inkey,
_.pick(data, 'countries', 'cost')
)
.then(function (response) {
self.shops = _.reject(self.shops, function (obj) {
self.markets = _.reject(self.markets, function (obj) {
return obj.id == data.id
})
self.shops.push(mapShops(response.data))
self.shopDialog.show = false
self.shopDialog.data = {}
self.markets.push(mapShops(response.data))
self.marketDialog.show = false
self.marketDialog.data = {}
data = {}
})
.catch(function (error) {
LNbits.utils.notifyApiError(error)
})
},
createShop(data) {
createMarketplace(data) {
LNbits.api
.request(
'POST',
@ -1565,9 +1576,9 @@
data
)
.then(response => {
this.shops.push(mapShops(response.data))
this.shopDialog.show = false
this.shopDialog.data = {}
this.markets.push(mapMarkets(response.data))
this.marketDialog.show = false
this.marketDialog.data = {}
data = {}
})
.catch(error => {
@ -1576,7 +1587,7 @@
},
deleteShop: function (shopId) {
var self = this
var shop = _.findWhere(self.shops, {id: shopId})
var shop = _.findWhere(self.markets, {id: shopId})
LNbits.utils
.confirmDialog('Are you sure you want to delete this Shop link?')
@ -1588,7 +1599,7 @@
_.findWhere(self.g.user.wallets, {id: shop.wallet}).inkey
)
.then(function (response) {
self.shops = _.reject(self.shops, function (obj) {
self.markets = _.reject(self.markets, function (obj) {
return obj.id == shopId
})
})
@ -1598,7 +1609,7 @@
})
},
exportShopsCSV: function () {
LNbits.utils.exportCSV(this.shopsTable.columns, this.shops)
LNbits.utils.exportCSV(this.shopsTable.columns, this.markets)
},
////////////////////////////////////////
////////////////ORDERS//////////////////
@ -1694,7 +1705,7 @@
this.getProducts()
this.getZones()
this.getOrders()
//this.getMarkets() # NOT YET IMPLEMENTED
this.getMarkets() // NOT YET IMPLEMENTED
this.customerKeys = [
'cb4c0164fe03fcdadcbfb4f76611c71620790944c24f21a1cd119395cdedfe1b',
'a9c17358a6dc4ceb3bb4d883eb87967a66b3453a0f3199f0b1c8eef8070c6a07'

View file

@ -21,6 +21,8 @@ from lnbits.decorators import (
from ...helpers import urlsafe_short_hash
from . import db, diagonalley_ext
from .crud import (
create_diagonalley_market,
create_diagonalley_market_stalls,
create_diagonalley_order,
create_diagonalley_order_details,
create_diagonalley_product,
@ -42,6 +44,7 @@ from .crud import (
get_diagonalley_stalls,
get_diagonalley_zone,
get_diagonalley_zones,
update_diagonalley_market,
update_diagonalley_product,
update_diagonalley_stall,
update_diagonalley_zone,
@ -439,7 +442,6 @@ async def api_diagonalley_stall_create(
market_id: str = None,
wallet: WalletTypeInfo = Depends(require_invoice_key),
):
if market_id:
market = await get_diagonalley_market(market_id)
if not market:
@ -451,5 +453,6 @@ async def api_diagonalley_stall_create(
market = await update_diagonalley_market(market_id, **data.dict())
else:
market = await create_diagonalley_market(data=data)
await create_diagonalley_market_stalls(market_id=market.id, data=data.stalls)
return market.dict()