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 . import db
from .models import ( from .models import (
CreateMarket,
CreateMarketStalls,
Market, Market,
OrderDetail, OrderDetail,
Orders, Orders,
@ -332,11 +334,55 @@ async def get_diagonalley_market(market_id: str) -> Optional[Market]:
row = await db.fetchone( row = await db.fetchone(
"SELECT * FROM diagonalley.markets WHERE id = ?", (market_id,) "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): async def get_diagonalley_market_stalls(market_id: str):
rows = await db.fetchall( rows = await db.fetchall(
"SELECT * FROM diagonalley.market_stalls WHERE marketid = ?", (market_id,) "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 id: str
usr: str usr: str
name: Optional[str] name: Optional[str]
class CreateMarketStalls(BaseModel):
stallid: str

View file

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

View file

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