From b1473fc1a4449661b5f00a76a5d33976f2f2d7a5 Mon Sep 17 00:00:00 2001 From: Tiago Vasconcelos Date: Thu, 22 Dec 2022 18:26:34 +0000 Subject: [PATCH] add currency option --- lnbits/extensions/shop/crud.py | 22 ++++++++ lnbits/extensions/shop/migrations.py | 13 +++++ lnbits/extensions/shop/models.py | 11 ++++ .../extensions/shop/templates/shop/index.html | 52 ++++++++++++++++++- lnbits/extensions/shop/views_api.py | 26 ++++++++++ 5 files changed, 122 insertions(+), 2 deletions(-) diff --git a/lnbits/extensions/shop/crud.py b/lnbits/extensions/shop/crud.py index 8ddd0a53..1986829e 100644 --- a/lnbits/extensions/shop/crud.py +++ b/lnbits/extensions/shop/crud.py @@ -9,6 +9,7 @@ from lnbits.settings import WALLET from . import db from .models import ( + ShopSettings, ChatMessage, CreateChatMessage, CreateMarket, @@ -443,3 +444,24 @@ async def get_shop_chat_by_merchant(ids: List[str]) -> List[ChatMessage]: (*ids,), ) return [ChatMessage(**row) for row in rows] + + +async def get_shop_settings(user) -> Optional[ShopSettings]: + row = await db.fetchone("SELECT * FROM shop.settings WHERE 'user = ?", (user,)) + + return ShopSettings(**row) if row else None + + +async def set_shop_settings(user: str, data) -> Optional[ShopSettings]: + await db.execute( + f""" + UPDATE shop.settings + SET currency = ?, fiat_base_multiplier = ? + WHERE 'user' = ?; + """, + ( + data.currency, + data.fiat_base_multiplier, + user, + ), + ) diff --git a/lnbits/extensions/shop/migrations.py b/lnbits/extensions/shop/migrations.py index a99eab68..2936695e 100644 --- a/lnbits/extensions/shop/migrations.py +++ b/lnbits/extensions/shop/migrations.py @@ -1,4 +1,17 @@ async def m001_initial(db): + """ + Initial Shop settings table. + """ + await db.execute( + """ + CREATE TABLE shop.settings ( + "user" TEXT PRIMARY KEY, + currency TEXT DEFAULT 'sat', + fiat_base_multiplier INTEGER DEFAULT 1 + ); + """ + ) + """ Initial stalls table. """ diff --git a/lnbits/extensions/shop/models.py b/lnbits/extensions/shop/models.py index 20ac0a40..2282cef0 100644 --- a/lnbits/extensions/shop/models.py +++ b/lnbits/extensions/shop/models.py @@ -4,6 +4,17 @@ from fastapi.param_functions import Query from pydantic import BaseModel +class ShopSettings(BaseModel): + user: str + currency: str + fiat_base_multiplier: int + + +class SetSettings(BaseModel): + currency: str + fiat_base_multiplier: int = Query(100, ge=1) + + class Stalls(BaseModel): id: str wallet: str diff --git a/lnbits/extensions/shop/templates/shop/index.html b/lnbits/extensions/shop/templates/shop/index.html index 04833e5f..d546ce47 100644 --- a/lnbits/extensions/shop/templates/shop/index.html +++ b/lnbits/extensions/shop/templates/shop/index.html @@ -4,7 +4,7 @@ {% include "shop/_dialogs.html" %}
- + + Shipping Zone Create a shipping zone @@ -42,8 +42,18 @@ @click="errorMessage('First set shipping zone(s), then create a stall.')" >+ Product List a product + { + this.$q.notify({ + type: 'positive', + message: `Currency changed`, + icon: 'check' + }) + }) + .catch(error => { + LNbits.utils.notifyApiError(error) + }) + }, shopDataDownload() { const removeClone = obj => { delete obj._data @@ -1320,6 +1357,16 @@ } this.ws = ws + }, + async getCurrencies() { + await LNbits.api + .request('GET', '/shop/api/v1/currencies') + .then(response => { + this.currencies.units = ['sat', ...response.data] + }) + .catch(err => { + LNbits.utils.notifyApiError(err) + }) } }, async created() { @@ -1329,6 +1376,7 @@ this.onboarding.showAgain = showOnboard || false this.diagonAlley = this.$q.localStorage.getItem('lnbits.DAmode') || false + await this.getCurrencies() this.getStalls() this.getProducts() this.getZones() diff --git a/lnbits/extensions/shop/views_api.py b/lnbits/extensions/shop/views_api.py index d9f0c80b..86f0a8f5 100644 --- a/lnbits/extensions/shop/views_api.py +++ b/lnbits/extensions/shop/views_api.py @@ -9,6 +9,7 @@ from fastapi.params import Depends from loguru import logger from secp256k1 import PrivateKey, PublicKey from starlette.exceptions import HTTPException +from lnbits.utils.exchange_rates import currencies, get_fiat_rate_satoshis from lnbits.core.crud import get_user from lnbits.core.services import create_invoice @@ -23,6 +24,8 @@ from lnbits.helpers import urlsafe_short_hash from . import db, shop_ext from .crud import ( + set_shop_settings, + get_shop_settings, create_shop_market, create_shop_market_stalls, create_shop_order, @@ -58,6 +61,7 @@ from .crud import ( update_shop_zone, ) from .models import ( + SetSettings, CreateMarket, Orders, Products, @@ -452,3 +456,25 @@ async def api_get_latest_chat_msg(room_name: str, all_messages: bool = Query(Fal messages = await get_shop_latest_chat_messages(room_name) return messages + + +@shop_ext.get("/api/v1/currencies") +async def api_list_currencies_available(): + return list(currencies.keys()) + + +@shop_ext.get("/api/v1/settings") +async def api_get_settings(wallet: WalletTypeInfo = Depends(require_admin_key)): + user = wallet.wallet.user + + settings = await get_shop_settings(user) + + return settings + + +@shop_ext.put("/api/v1/settings") +async def api_set_settings( + data: SetSettings, wallet: WalletTypeInfo = Depends(require_admin_key) +): + user = wallet.wallet.user + return await set_shop_settings(user, data)