Renamed DA to shop

This commit is contained in:
ben 2022-12-20 08:21:48 +00:00
parent 8fdebc2a98
commit 2a89743a3d
17 changed files with 354 additions and 354 deletions

View File

@ -1,7 +1,7 @@
<h1>Diagon Alley</h1>
<h1>Shop</h1>
<h2>A movable market stand</h2>
Make a list of products to sell, point the list to an relay (or many), stack sats.
Diagon Alley is a movable market stand, for anon transactions. You then give permission for an relay to list those products. Delivery addresses are sent through the Lightning Network.
Shop is a movable market stand, for anon transactions. You then give permission for an relay to list those products. Delivery addresses are sent through the Lightning Network.
<img src="https://i.imgur.com/P1tvBSG.png">
<h2>API endpoints</h2>

View File

@ -7,20 +7,20 @@ from lnbits.db import Database
from lnbits.helpers import template_renderer
from lnbits.tasks import catch_everything_and_restart
db = Database("ext_diagonalley")
db = Database("ext_shop")
diagonalley_ext: APIRouter = APIRouter(prefix="/diagonalley", tags=["diagonalley"])
shop_ext: APIRouter = APIRouter(prefix="/shop", tags=["shop"])
diagonalley_static_files = [
shop_static_files = [
{
"path": "/diagonalley/static",
"app": StaticFiles(directory="lnbits/extensions/diagonalley/static"),
"name": "diagonalley_static",
"path": "/shop/static",
"app": StaticFiles(directory="lnbits/extensions/shop/static"),
"name": "shop_static",
}
]
# if 'nostradmin' not in LNBITS_ADMIN_EXTENSIONS:
# @diagonalley_ext.get("/", response_class=HTMLResponse)
# @shop_ext.get("/", response_class=HTMLResponse)
# async def index(request: Request):
# return template_renderer().TemplateResponse(
# "error.html", {"request": request, "err": "Ask system admin to enable NostrAdmin!"}
@ -28,9 +28,9 @@ diagonalley_static_files = [
# else:
def diagonalley_renderer():
return template_renderer(["lnbits/extensions/diagonalley/templates"])
# return template_renderer(["lnbits/extensions/diagonalley/templates"])
def shop_renderer():
return template_renderer(["lnbits/extensions/shop/templates"])
# return template_renderer(["lnbits/extensions/shop/templates"])
from .tasks import wait_for_paid_invoices
@ -38,6 +38,6 @@ from .views import * # noqa
from .views_api import * # noqa
def diagonalley_start():
def shop_start():
loop = asyncio.get_event_loop()
loop.create_task(catch_everything_and_restart(wait_for_paid_invoices))

View File

@ -29,11 +29,11 @@ from .models import (
###Products
async def create_diagonalley_product(data: createProduct) -> Products:
async def create_shop_product(data: createProduct) -> Products:
product_id = urlsafe_short_hash()
await db.execute(
f"""
INSERT INTO diagonalley.products (id, stall, product, categories, description, image, price, quantity)
INSERT INTO shop.products (id, stall, product, categories, description, image, price, quantity)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
""",
(
@ -47,59 +47,59 @@ async def create_diagonalley_product(data: createProduct) -> Products:
data.quantity,
),
)
product = await get_diagonalley_product(product_id)
product = await get_shop_product(product_id)
assert product, "Newly created product couldn't be retrieved"
return product
async def update_diagonalley_product(product_id: str, **kwargs) -> Optional[Stalls]:
async def update_shop_product(product_id: str, **kwargs) -> Optional[Stalls]:
q = ", ".join([f"{field[0]} = ?" for field in kwargs.items()])
await db.execute(
f"UPDATE diagonalley.products SET {q} WHERE id = ?",
f"UPDATE shop.products SET {q} WHERE id = ?",
(*kwargs.values(), product_id),
)
row = await db.fetchone(
"SELECT * FROM diagonalley.products WHERE id = ?", (product_id,)
"SELECT * FROM shop.products WHERE id = ?", (product_id,)
)
return Products(**row) if row else None
async def get_diagonalley_product(product_id: str) -> Optional[Products]:
async def get_shop_product(product_id: str) -> Optional[Products]:
row = await db.fetchone(
"SELECT * FROM diagonalley.products WHERE id = ?", (product_id,)
"SELECT * FROM shop.products WHERE id = ?", (product_id,)
)
return Products(**row) if row else None
async def get_diagonalley_products(stall_ids: Union[str, List[str]]) -> List[Products]:
async def get_shop_products(stall_ids: Union[str, List[str]]) -> List[Products]:
if isinstance(stall_ids, str):
stall_ids = [stall_ids]
# with open_ext_db("diagonalley") as db:
# with open_ext_db("shop") as db:
q = ",".join(["?"] * len(stall_ids))
rows = await db.fetchall(
f"""
SELECT * FROM diagonalley.products WHERE stall IN ({q})
SELECT * FROM shop.products WHERE stall IN ({q})
""",
(*stall_ids,),
)
return [Products(**row) for row in rows]
async def delete_diagonalley_product(product_id: str) -> None:
await db.execute("DELETE FROM diagonalley.products WHERE id = ?", (product_id,))
async def delete_shop_product(product_id: str) -> None:
await db.execute("DELETE FROM shop.products WHERE id = ?", (product_id,))
###zones
async def create_diagonalley_zone(user, data: createZones) -> Zones:
async def create_shop_zone(user, data: createZones) -> Zones:
zone_id = urlsafe_short_hash()
await db.execute(
f"""
INSERT INTO diagonalley.zones (
INSERT INTO shop.zones (
id,
"user",
cost,
@ -111,45 +111,45 @@ async def create_diagonalley_zone(user, data: createZones) -> Zones:
(zone_id, user, data.cost, data.countries.lower()),
)
zone = await get_diagonalley_zone(zone_id)
zone = await get_shop_zone(zone_id)
assert zone, "Newly created zone couldn't be retrieved"
return zone
async def update_diagonalley_zone(zone_id: str, **kwargs) -> Optional[Zones]:
async def update_shop_zone(zone_id: str, **kwargs) -> Optional[Zones]:
q = ", ".join([f"{field[0]} = ?" for field in kwargs.items()])
await db.execute(
f"UPDATE diagonalley.zones SET {q} WHERE id = ?",
f"UPDATE shop.zones SET {q} WHERE id = ?",
(*kwargs.values(), zone_id),
)
row = await db.fetchone("SELECT * FROM diagonalley.zones WHERE id = ?", (zone_id,))
row = await db.fetchone("SELECT * FROM shop.zones WHERE id = ?", (zone_id,))
return Zones(**row) if row else None
async def get_diagonalley_zone(zone_id: str) -> Optional[Zones]:
row = await db.fetchone("SELECT * FROM diagonalley.zones WHERE id = ?", (zone_id,))
async def get_shop_zone(zone_id: str) -> Optional[Zones]:
row = await db.fetchone("SELECT * FROM shop.zones WHERE id = ?", (zone_id,))
return Zones(**row) if row else None
async def get_diagonalley_zones(user: str) -> List[Zones]:
async def get_shop_zones(user: str) -> List[Zones]:
rows = await db.fetchall(
'SELECT * FROM diagonalley.zones WHERE "user" = ?', (user,)
'SELECT * FROM shop.zones WHERE "user" = ?', (user,)
)
return [Zones(**row) for row in rows]
async def delete_diagonalley_zone(zone_id: str) -> None:
await db.execute("DELETE FROM diagonalley.zones WHERE id = ?", (zone_id,))
async def delete_shop_zone(zone_id: str) -> None:
await db.execute("DELETE FROM shop.zones WHERE id = ?", (zone_id,))
###Stalls
async def create_diagonalley_stall(data: createStalls) -> Stalls:
async def create_shop_stall(data: createStalls) -> Stalls:
stall_id = urlsafe_short_hash()
await db.execute(
f"""
INSERT INTO diagonalley.stalls (
INSERT INTO shop.stalls (
id,
wallet,
name,
@ -171,62 +171,62 @@ async def create_diagonalley_stall(data: createStalls) -> Stalls:
),
)
stall = await get_diagonalley_stall(stall_id)
stall = await get_shop_stall(stall_id)
assert stall, "Newly created stall couldn't be retrieved"
return stall
async def update_diagonalley_stall(stall_id: str, **kwargs) -> Optional[Stalls]:
async def update_shop_stall(stall_id: str, **kwargs) -> Optional[Stalls]:
q = ", ".join([f"{field[0]} = ?" for field in kwargs.items()])
await db.execute(
f"UPDATE diagonalley.stalls SET {q} WHERE id = ?",
f"UPDATE shop.stalls SET {q} WHERE id = ?",
(*kwargs.values(), stall_id),
)
row = await db.fetchone(
"SELECT * FROM diagonalley.stalls WHERE id = ?", (stall_id,)
"SELECT * FROM shop.stalls WHERE id = ?", (stall_id,)
)
return Stalls(**row) if row else None
async def get_diagonalley_stall(stall_id: str) -> Optional[Stalls]:
async def get_shop_stall(stall_id: str) -> Optional[Stalls]:
row = await db.fetchone(
"SELECT * FROM diagonalley.stalls WHERE id = ?", (stall_id,)
"SELECT * FROM shop.stalls WHERE id = ?", (stall_id,)
)
return Stalls(**row) if row else None
async def get_diagonalley_stalls(wallet_ids: Union[str, List[str]]) -> List[Stalls]:
async def get_shop_stalls(wallet_ids: Union[str, List[str]]) -> List[Stalls]:
q = ",".join(["?"] * len(wallet_ids))
rows = await db.fetchall(
f"SELECT * FROM diagonalley.stalls WHERE wallet IN ({q})", (*wallet_ids,)
f"SELECT * FROM shop.stalls WHERE wallet IN ({q})", (*wallet_ids,)
)
return [Stalls(**row) for row in rows]
async def get_diagonalley_stalls_by_ids(
async def get_shop_stalls_by_ids(
stall_ids: Union[str, List[str]]
) -> List[Stalls]:
q = ",".join(["?"] * len(stall_ids))
rows = await db.fetchall(
f"SELECT * FROM diagonalley.stalls WHERE id IN ({q})", (*stall_ids,)
f"SELECT * FROM shop.stalls WHERE id IN ({q})", (*stall_ids,)
)
return [Stalls(**row) for row in rows]
async def delete_diagonalley_stall(stall_id: str) -> None:
await db.execute("DELETE FROM diagonalley.stalls WHERE id = ?", (stall_id,))
async def delete_shop_stall(stall_id: str) -> None:
await db.execute("DELETE FROM shop.stalls WHERE id = ?", (stall_id,))
###Orders
async def create_diagonalley_order(data: createOrder, invoiceid: str) -> Orders:
async def create_shop_order(data: createOrder, invoiceid: str) -> Orders:
returning = "" if db.type == SQLITE else "RETURNING ID"
method = db.execute if db.type == SQLITE else db.fetchone
result = await (method)(
f"""
INSERT INTO diagonalley.orders (wallet, shippingzone, address, email, total, invoiceid, paid, shipped)
INSERT INTO shop.orders (wallet, shippingzone, address, email, total, invoiceid, paid, shipped)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
{returning}
""",
@ -245,19 +245,19 @@ async def create_diagonalley_order(data: createOrder, invoiceid: str) -> Orders:
return result._result_proxy.lastrowid
else:
return result[0]
# link = await get_diagonalley_order(link.id)
# link = await get_shop_order(link.id)
# assert link, "Newly created link couldn't be retrieved"
# return link
async def create_diagonalley_order_details(
async def create_shop_order_details(
order_id: str, data: List[createOrderDetails]
):
for item in data:
item_id = urlsafe_short_hash()
await db.execute(
"""
INSERT INTO diagonalley.order_details (id, order_id, product_id, quantity)
INSERT INTO shop.order_details (id, order_id, product_id, quantity)
VALUES (?, ?, ?, ?)
""",
(
@ -267,36 +267,36 @@ async def create_diagonalley_order_details(
item.quantity,
),
)
order_details = await get_diagonalley_order_details(order_id)
order_details = await get_shop_order_details(order_id)
return order_details
async def get_diagonalley_order_details(order_id: str) -> List[OrderDetail]:
async def get_shop_order_details(order_id: str) -> List[OrderDetail]:
rows = await db.fetchall(
f"SELECT * FROM diagonalley.order_details WHERE order_id = ?", (order_id,)
f"SELECT * FROM shop.order_details WHERE order_id = ?", (order_id,)
)
return [OrderDetail(**row) for row in rows]
async def get_diagonalley_order(order_id: str) -> Optional[Orders]:
async def get_shop_order(order_id: str) -> Optional[Orders]:
row = await db.fetchone(
"SELECT * FROM diagonalley.orders WHERE id = ?", (order_id,)
"SELECT * FROM shop.orders WHERE id = ?", (order_id,)
)
return Orders(**row) if row else None
async def get_diagonalley_order_invoiceid(invoice_id: str) -> Optional[Orders]:
async def get_shop_order_invoiceid(invoice_id: str) -> Optional[Orders]:
row = await db.fetchone(
"SELECT * FROM diagonalley.orders WHERE invoiceid = ?", (invoice_id,)
"SELECT * FROM shop.orders WHERE invoiceid = ?", (invoice_id,)
)
return Orders(**row) if row else None
async def set_diagonalley_order_paid(payment_hash: str) -> Orders:
async def set_shop_order_paid(payment_hash: str) -> Orders:
await db.execute(
"""
UPDATE diagonalley.orders
UPDATE shop.orders
SET paid = true
WHERE invoiceid = ?
""",
@ -304,10 +304,10 @@ async def set_diagonalley_order_paid(payment_hash: str) -> Orders:
)
async def set_diagonalley_order_pubkey(payment_hash: str, pubkey: str):
async def set_shop_order_pubkey(payment_hash: str, pubkey: str):
await db.execute(
"""
UPDATE diagonalley.orders
UPDATE shop.orders
SET pubkey = ?
WHERE invoiceid = ?
""",
@ -318,7 +318,7 @@ async def set_diagonalley_order_pubkey(payment_hash: str, pubkey: str):
)
async def update_diagonalley_product_stock(products):
async def update_shop_product_stock(products):
q = "\n".join(
[f"""WHEN id='{p.product_id}' THEN quantity - {p.quantity}""" for p in products]
@ -327,7 +327,7 @@ async def update_diagonalley_product_stock(products):
await db.execute(
f"""
UPDATE diagonalley.products
UPDATE shop.products
SET quantity=(CASE
{q}
END)
@ -337,53 +337,53 @@ async def update_diagonalley_product_stock(products):
)
async def get_diagonalley_orders(wallet_ids: Union[str, List[str]]) -> List[Orders]:
async def get_shop_orders(wallet_ids: Union[str, List[str]]) -> List[Orders]:
if isinstance(wallet_ids, str):
wallet_ids = [wallet_ids]
q = ",".join(["?"] * len(wallet_ids))
rows = await db.fetchall(
f"SELECT * FROM diagonalley.orders WHERE wallet IN ({q})", (*wallet_ids,)
f"SELECT * FROM shop.orders WHERE wallet IN ({q})", (*wallet_ids,)
)
#
return [Orders(**row) for row in rows]
async def delete_diagonalley_order(order_id: str) -> None:
await db.execute("DELETE FROM diagonalley.orders WHERE id = ?", (order_id,))
async def delete_shop_order(order_id: str) -> None:
await db.execute("DELETE FROM shop.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,))
async def get_shop_markets(user: str) -> List[Market]:
rows = await db.fetchall("SELECT * FROM shop.markets WHERE usr = ?", (user,))
return [Market(**row) for row in rows]
async def get_diagonalley_market(market_id: str) -> Optional[Market]:
async def get_shop_market(market_id: str) -> Optional[Market]:
row = await db.fetchone(
"SELECT * FROM diagonalley.markets WHERE id = ?", (market_id,)
"SELECT * FROM shop.markets WHERE id = ?", (market_id,)
)
return Market(**row) if row else None
async def get_diagonalley_market_stalls(market_id: str):
async def get_shop_market_stalls(market_id: str):
rows = await db.fetchall(
"SELECT * FROM diagonalley.market_stalls WHERE marketid = ?", (market_id,)
"SELECT * FROM shop.market_stalls WHERE marketid = ?", (market_id,)
)
ids = [row["stallid"] for row in rows]
return await get_diagonalley_stalls_by_ids(ids)
return await get_shop_stalls_by_ids(ids)
async def create_diagonalley_market(data: CreateMarket):
async def create_shop_market(data: CreateMarket):
market_id = urlsafe_short_hash()
await db.execute(
"""
INSERT INTO diagonalley.markets (id, usr, name)
INSERT INTO shop.markets (id, usr, name)
VALUES (?, ?, ?)
""",
(
@ -392,12 +392,12 @@ async def create_diagonalley_market(data: CreateMarket):
data.name,
),
)
market = await get_diagonalley_market(market_id)
market = await get_shop_market(market_id)
assert market, "Newly created market couldn't be retrieved"
return market
async def create_diagonalley_market_stalls(
async def create_shop_market_stalls(
market_id: str, data: List[CreateMarketStalls]
):
for stallid in data:
@ -405,7 +405,7 @@ async def create_diagonalley_market_stalls(
await db.execute(
"""
INSERT INTO diagonalley.market_stalls (id, marketid, stallid)
INSERT INTO shop.market_stalls (id, marketid, stallid)
VALUES (?, ?, ?)
""",
(
@ -414,11 +414,11 @@ async def create_diagonalley_market_stalls(
stallid,
),
)
market_stalls = await get_diagonalley_market_stalls(market_id)
market_stalls = await get_shop_market_stalls(market_id)
return market_stalls
async def update_diagonalley_market(market_id):
async def update_shop_market(market_id):
pass
@ -428,7 +428,7 @@ async def update_diagonalley_market(market_id):
async def create_chat_message(data: CreateChatMessage):
await db.execute(
"""
INSERT INTO diagonalley.messages (msg, pubkey, id_conversation)
INSERT INTO shop.messages (msg, pubkey, id_conversation)
VALUES (?, ?, ?)
""",
(
@ -439,29 +439,29 @@ async def create_chat_message(data: CreateChatMessage):
)
async def get_diagonalley_latest_chat_messages(room_name: str):
async def get_shop_latest_chat_messages(room_name: str):
rows = await db.fetchall(
"SELECT * FROM diagonalley.messages WHERE id_conversation = ? ORDER BY timestamp DESC LIMIT 20",
"SELECT * FROM shop.messages WHERE id_conversation = ? ORDER BY timestamp DESC LIMIT 20",
(room_name,),
)
return [ChatMessage(**row) for row in rows]
async def get_diagonalley_chat_messages(room_name: str):
async def get_shop_chat_messages(room_name: str):
rows = await db.fetchall(
"SELECT * FROM diagonalley.messages WHERE id_conversation = ? ORDER BY timestamp DESC",
"SELECT * FROM shop.messages WHERE id_conversation = ? ORDER BY timestamp DESC",
(room_name,),
)
return [ChatMessage(**row) for row in rows]
async def get_diagonalley_chat_by_merchant(ids: List[str]) -> List[ChatMessage]:
async def get_shop_chat_by_merchant(ids: List[str]) -> List[ChatMessage]:
q = ",".join(["?"] * len(ids))
rows = await db.fetchall(
f"SELECT * FROM diagonalley.messages WHERE id_conversation IN ({q})",
f"SELECT * FROM shop.messages WHERE id_conversation IN ({q})",
(*ids,),
)
return [ChatMessage(**row) for row in rows]

View File

@ -4,7 +4,7 @@ async def m001_initial(db):
"""
await db.execute(
"""
CREATE TABLE diagonalley.stalls (
CREATE TABLE shop.stalls (
id TEXT PRIMARY KEY,
wallet TEXT NOT NULL,
name TEXT NOT NULL,
@ -22,7 +22,7 @@ async def m001_initial(db):
"""
await db.execute(
f"""
CREATE TABLE diagonalley.products (
CREATE TABLE shop.products (
id TEXT PRIMARY KEY,
stall TEXT NOT NULL REFERENCES {db.references_schema}stalls (id),
product TEXT NOT NULL,
@ -41,7 +41,7 @@ async def m001_initial(db):
"""
await db.execute(
"""
CREATE TABLE diagonalley.zones (
CREATE TABLE shop.zones (
id TEXT PRIMARY KEY,
"user" TEXT NOT NULL,
cost TEXT NOT NULL,
@ -55,7 +55,7 @@ async def m001_initial(db):
"""
await db.execute(
f"""
CREATE TABLE diagonalley.orders (
CREATE TABLE shop.orders (
id {db.serial_primary_key},
wallet TEXT NOT NULL,
username TEXT,
@ -79,7 +79,7 @@ async def m001_initial(db):
"""
await db.execute(
f"""
CREATE TABLE diagonalley.order_details (
CREATE TABLE shop.order_details (
id TEXT PRIMARY KEY,
order_id INTEGER NOT NULL REFERENCES {db.references_schema}orders (id),
product_id TEXT NOT NULL REFERENCES {db.references_schema}products (id),
@ -93,7 +93,7 @@ async def m001_initial(db):
"""
await db.execute(
"""
CREATE TABLE diagonalley.markets (
CREATE TABLE shop.markets (
id TEXT PRIMARY KEY,
usr TEXT NOT NULL,
name TEXT
@ -106,7 +106,7 @@ async def m001_initial(db):
"""
await db.execute(
f"""
CREATE TABLE diagonalley.market_stalls (
CREATE TABLE shop.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)
@ -121,7 +121,7 @@ async def m002_add_chat_messages(db):
"""
await db.execute(
f"""
CREATE TABLE diagonalley.messages (
CREATE TABLE shop.messages (
id {db.serial_primary_key},
msg TEXT NOT NULL,
pubkey TEXT NOT NULL,
@ -138,8 +138,8 @@ async def m002_add_chat_messages(db):
Create indexes for message fetching
"""
await db.execute(
"CREATE INDEX idx_messages_timestamp ON diagonalley.messages (timestamp DESC)"
"CREATE INDEX idx_messages_timestamp ON shop.messages (timestamp DESC)"
)
await db.execute(
"CREATE INDEX idx_messages_conversations ON diagonalley.messages (id_conversation)"
"CREATE INDEX idx_messages_conversations ON shop.messages (id_conversation)"
)

View File

@ -10,8 +10,8 @@ from collections import defaultdict
from fastapi import WebSocket
from loguru import logger
from lnbits.extensions.diagonalley.crud import create_chat_message
from lnbits.extensions.diagonalley.models import CreateChatMessage
from lnbits.extensions.shop.crud import create_chat_message
from lnbits.extensions.shop.models import CreateChatMessage
class Notifier:

View File

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -6,10 +6,10 @@ from lnbits.core.models import Payment
from lnbits.tasks import register_invoice_listener
from .crud import (
get_diagonalley_order_details,
get_diagonalley_order_invoiceid,
set_diagonalley_order_paid,
update_diagonalley_product_stock,
get_shop_order_details,
get_shop_order_invoiceid,
set_shop_order_paid,
update_shop_product_stock,
)
@ -23,17 +23,17 @@ async def wait_for_paid_invoices():
async def on_invoice_paid(payment: Payment) -> None:
if payment.extra.get("tag") != "diagonalley":
if payment.extra.get("tag") != "shop":
return
order = await get_diagonalley_order_invoiceid(payment.payment_hash)
order = await get_shop_order_invoiceid(payment.payment_hash)
if not order:
logger.error("this should never happen", payment)
return
# set order as paid
await set_diagonalley_order_paid(payment.payment_hash)
await set_shop_order_paid(payment.payment_hash)
# deduct items sold from stock
details = await get_diagonalley_order_details(order.id)
await update_diagonalley_product_stock(details)
details = await get_shop_order_details(order.id)
await update_shop_product_stock(details)

View File

@ -7,7 +7,7 @@
<q-card>
<q-card-section>
<h5 class="text-subtitle1 q-my-none">
Diagon Alley: Decentralised Market-Stalls
Shop: Decentralised Market-Stalls
</h5>
<p>Each Stall has its own keys!<br /></p>
@ -25,7 +25,7 @@
Ratings are managed by the relay. Your stall can be listed in multiple
relays, even over TOR, if you wish to be anonymous.<br />
More information on the
<a href="https://github.com/lnbits/Diagon-Alley">Diagon Alley Protocol</a
<a href="https://github.com/lnbits/Diagon-Alley">Shop Protocol</a
><br />
<small>
Created by, <a href="https://github.com/benarc">Ben Arc</a></small
@ -51,7 +51,7 @@
<q-card-section>
<code
><span class="text-light-blue">GET</span>
/diagonalley/api/v1/stall/products/&lt;relay_id&gt;</code
/shop/api/v1/stall/products/&lt;relay_id&gt;</code
>
<h5 class="text-caption q-mt-sm q-mb-none">Body (application/json)</h5>
<h5 class="text-caption q-mt-sm q-mb-none">
@ -76,7 +76,7 @@
<q-card-section>
<code
><span class="text-light-green">POST</span>
/diagonalley/api/v1/stall/order/&lt;relay_id&gt;</code
/shop/api/v1/stall/order/&lt;relay_id&gt;</code
>
<h5 class="text-caption q-mt-sm q-mb-none">Body (application/json)</h5>
<code
@ -112,7 +112,7 @@
<q-card-section>
<code
><span class="text-light-blue">GET</span>
/diagonalley/api/v1/stall/checkshipped/&lt;checking_id&gt;</code
/shop/api/v1/stall/checkshipped/&lt;checking_id&gt;</code
>
<h5 class="text-caption q-mt-sm q-mb-none">Headers</h5>
<h5 class="text-caption q-mt-sm q-mb-none">

View File

@ -398,9 +398,9 @@
</q-card-section>
<q-separator inset></q-separator>
<q-card-section>
<div class="text-h6">Diagon Alley</div>
<div class="text-h6">Shop</div>
<div class="text-subtitle2">
Step inside the Leaky Cauldron and enter the Diagon Alley. Make this
Step inside the Leaky Cauldron and enter the Shop. Make this
market available on Nostr!
</div>
</q-card-section>
@ -412,7 +412,7 @@
checked-icon="check"
color="green"
unchecked-icon="clear"
label='"Diagon Alley" mode (Nostr)'
label='"Shop" mode (Nostr)'
@input="toggleDA"
>
<q-tooltip>Coming soon...</q-tooltip></q-toggle
@ -703,7 +703,7 @@
icon="storefront"
:color="($q.dark.isActive) ? 'grey-7' : 'grey-5'"
type="a"
:href="'/diagonalley/stalls/' + props.row.id"
:href="'/shop/stalls/' + props.row.id"
target="_blank"
></q-btn>
<q-tooltip> Stall simple UI shopping cart </q-tooltip>
@ -777,7 +777,7 @@
icon="storefront"
:color="($q.dark.isActive) ? 'grey-7' : 'grey-5'"
type="a"
:href="'/diagonalley/market/' + props.row.id"
:href="'/shop/market/' + props.row.id"
target="_blank"
></q-btn>
<q-tooltip> Link to pass to stall relay </q-tooltip>
@ -921,12 +921,12 @@
<q-card>
<q-card-section>
<h6 class="text-subtitle1 q-my-none">
LNbits Diagon Alley Extension, powered by Nostr
LNbits Shop Extension, powered by Nostr
</h6>
</q-card-section>
<q-card-section class="q-pa-none">
<q-separator></q-separator>
<q-list> {% include "diagonalley/_api_docs.html" %} </q-list>
<q-list> {% include "shop/_api_docs.html" %} </q-list>
</q-card-section>
</q-card>
<!-- CHAT BOX -->
@ -1062,7 +1062,7 @@
</div>
<q-dialog v-model="onboarding.show">
<q-card class="q-pa-lg">
<h6 class="q-my-md text-primary">How to use Diagon Alley</h6>
<h6 class="q-my-md text-primary">How to use Shop</h6>
<q-stepper v-model="step" color="primary" vertical animated>
<q-step
:name="1"
@ -1155,7 +1155,7 @@
obj._data = _.clone(obj)
obj.stores = []
LNbits.api
.request('GET', `/diagonalley/api/v1/markets/${obj.id}/stalls`, null)
.request('GET', `/shop/api/v1/markets/${obj.id}/stalls`, null)
.then(response => {
if (response.data) {
obj.stores = response.data.map(s => s.name).toString()
@ -1503,7 +1503,7 @@
LNbits.api
.request(
'GET',
'/diagonalley/api/v1/keys',
'/shop/api/v1/keys',
this.g.user.wallets[0].adminkey
)
.then(response => {
@ -1512,7 +1512,7 @@
this.stallDialog.data.publickey = this.keys.pubkey
this.stallDialog.data.privatekey = this.keys.privkey
this.$q.localStorage.set(
`lnbits.diagonalley.${this.g.user.id}`,
`lnbits.shop.${this.g.user.id}`,
this.keys
)
}
@ -1523,7 +1523,7 @@
},
restoreKeys() {
let keys = this.$q.localStorage.getItem(
`lnbits.diagonalley.${this.g.user.id}`
`lnbits.shop.${this.g.user.id}`
)
if (keys) {
this.keys = keys
@ -1580,7 +1580,7 @@
LNbits.api
.request(
'GET',
'/diagonalley/api/v1/stalls?all_wallets=true',
'/shop/api/v1/stalls?all_wallets=true',
self.g.user.wallets[0].adminkey
)
.then(function (response) {
@ -1636,7 +1636,7 @@
LNbits.api
.request(
'PUT',
'/diagonalley/api/v1/stalls/' + data.id,
'/shop/api/v1/stalls/' + data.id,
_.findWhere(self.g.user.wallets, {
id: self.stallDialog.data.wallet
}).inkey,
@ -1658,7 +1658,7 @@
LNbits.api
.request(
'POST',
'/diagonalley/api/v1/stalls',
'/shop/api/v1/stalls',
_.findWhere(self.g.user.wallets, {
id: self.stallDialog.data.wallet
}).inkey,
@ -1685,7 +1685,7 @@
LNbits.api
.request(
'DELETE',
'/diagonalley/api/v1/stalls/' + stallId,
'/shop/api/v1/stalls/' + stallId,
_.findWhere(self.g.user.wallets, {id: stall.wallet}).adminkey
)
.then(function (response) {
@ -1710,7 +1710,7 @@
LNbits.api
.request(
'GET',
'/diagonalley/api/v1/products?all_stalls=true',
'/shop/api/v1/products?all_stalls=true',
self.g.user.wallets[0].inkey
)
.then(function (response) {
@ -1783,7 +1783,7 @@
LNbits.api
.request(
'PUT',
'/diagonalley/api/v1/products/' + data.id,
'/shop/api/v1/products/' + data.id,
_.findWhere(self.g.user.wallets, {
id: wallet
}).inkey,
@ -1809,7 +1809,7 @@
LNbits.api
.request(
'POST',
'/diagonalley/api/v1/products',
'/shop/api/v1/products',
_.findWhere(self.g.user.wallets, {id: walletId}).inkey,
data
)
@ -1831,7 +1831,7 @@
LNbits.api
.request(
'DELETE',
'/diagonalley/api/v1/products/' + productId,
'/shop/api/v1/products/' + productId,
_.findWhere(this.g.user.wallets, {id: walletId}).adminkey
)
.then(() => {
@ -1856,7 +1856,7 @@
LNbits.api
.request(
'GET',
'/diagonalley/api/v1/zones',
'/shop/api/v1/zones',
this.g.user.wallets[0].inkey
)
.then(function (response) {
@ -1896,7 +1896,7 @@
LNbits.api
.request(
'POST',
'/diagonalley/api/v1/zones/' + data.id,
'/shop/api/v1/zones/' + data.id,
self.g.user.wallets[0].adminkey,
data
)
@ -1918,7 +1918,7 @@
LNbits.api
.request(
'POST',
'/diagonalley/api/v1/zones',
'/shop/api/v1/zones',
self.g.user.wallets[0].inkey,
data
)
@ -1942,7 +1942,7 @@
LNbits.api
.request(
'DELETE',
'/diagonalley/api/v1/zones/' + zoneId,
'/shop/api/v1/zones/' + zoneId,
self.g.user.wallets[0].adminkey
)
.then(function (response) {
@ -1965,7 +1965,7 @@
LNbits.api
.request(
'GET',
'/diagonalley/api/v1/markets',
'/shop/api/v1/markets',
this.g.user.wallets[0].inkey
)
.then(response => {
@ -2003,7 +2003,7 @@
LNbits.api
.request(
'PUT',
'/diagonalley/api/v1/shops' + data.id,
'/shop/api/v1/shops' + data.id,
_.findWhere(self.g.user.wallets, {
id: self.marketDialog.data.wallet
}).inkey,
@ -2026,7 +2026,7 @@
LNbits.api
.request(
'POST',
'/diagonalley/api/v1/markets',
'/shop/api/v1/markets',
this.g.user.wallets[0].inkey,
data
)
@ -2050,7 +2050,7 @@
LNbits.api
.request(
'DELETE',
'/diagonalley/api/v1/shops/' + shopId,
'/shop/api/v1/shops/' + shopId,
_.findWhere(self.g.user.wallets, {id: shop.wallet}).inkey
)
.then(function (response) {
@ -2075,7 +2075,7 @@
await LNbits.api
.request(
'GET',
'/diagonalley/api/v1/orders?all_wallets=true',
'/shop/api/v1/orders?all_wallets=true',
this.g.user.wallets[0].inkey
)
.then(function (response) {
@ -2099,7 +2099,7 @@
LNbits.api
.request(
'POST',
'/diagonalley/api/v1/orders',
'/shop/api/v1/orders',
_.findWhere(self.g.user.wallets, {id: self.orderDialog.data.wallet})
.inkey,
data
@ -2123,7 +2123,7 @@
LNbits.api
.request(
'DELETE',
'/diagonalley/api/v1/orders/' + orderId,
'/shop/api/v1/orders/' + orderId,
_.findWhere(self.g.user.wallets, {id: order.wallet}).adminkey
)
.then(function (response) {
@ -2140,7 +2140,7 @@
LNbits.api
.request(
'GET',
'/diagonalley/api/v1/orders/shipped/' + order_id,
'/shop/api/v1/orders/shipped/' + order_id,
this.g.user.wallets[0].inkey
)
.then(response => {
@ -2161,7 +2161,7 @@
await LNbits.api
.request(
'GET',
`/diagonalley/api/v1/chat/messages/merchant?orders=${this.orders
`/shop/api/v1/chat/messages/merchant?orders=${this.orders
.map(o => o.invoiceid)
.toString()}`,
this.g.user.wallets[0].adminkey
@ -2176,7 +2176,7 @@
},
updateLastSeenMsg(id) {
let data = this.$q.localStorage.getItem(
`lnbits.diagonalley.${this.g.user.id}`
`lnbits.shop.${this.g.user.id}`
)
let chat = {
...data.chat,
@ -2186,7 +2186,7 @@
]
}
}
this.$q.localStorage.set(`lnbits.diagonalley.${this.g.user.id}`, {
this.$q.localStorage.set(`lnbits.shop.${this.g.user.id}`, {
...data,
chat
})
@ -2194,7 +2194,7 @@
},
checkUnreadMessages() {
let lastMsgs = this.$q.localStorage.getItem(
`lnbits.diagonalley.${this.g.user.id}`
`lnbits.shop.${this.g.user.id}`
).chat
for (let key in this.messages) {
let idx = this.orders.findIndex(f => f.invoiceid == key)
@ -2253,14 +2253,14 @@
ws_scheme = 'ws://'
}
ws = new WebSocket(
ws_scheme + location.host + '/diagonalley/ws/' + room_name
ws_scheme + location.host + '/shop/ws/' + room_name
)
function checkWebSocket(event) {
if (ws.readyState === WebSocket.CLOSED) {
console.log('WebSocket CLOSED: Reopening')
ws = new WebSocket(
ws_scheme + location.host + '/diagonalley/ws/' + room_name
ws_scheme + location.host + '/shop/ws/' + room_name
)
}
}
@ -2293,7 +2293,7 @@
this.getMarkets()
await this.getAllMessages()
let keys = this.$q.localStorage.getItem(
`lnbits.diagonalley.${this.g.user.id}`
`lnbits.shop.${this.g.user.id}`
)
if (keys) {
this.keys = keys

View File

@ -76,7 +76,7 @@
<q-card class="card--product">
{% raw %}
<q-img
:src="item.image ? item.image : '/diagonalley/static/images/placeholder.png'"
:src="item.image ? item.image : '/shop/static/images/placeholder.png'"
alt="Product Image"
loading="lazy"
spinner-color="white"
@ -357,7 +357,7 @@
})
}
LNbits.api
.request('POST', '/diagonalley/api/v1/orders', null, data)
.request('POST', '/shop/api/v1/orders', null, data)
.then(res => {
this.checkoutDialog = {show: false, data: {}}
@ -378,7 +378,7 @@
LNbits.api
.request(
'GET',
`/diagonalley/api/v1/orders/payments/${this.qrCodeDialog.data.payment_hash}`
`/shop/api/v1/orders/payments/${this.qrCodeDialog.data.payment_hash}`
)
.then(res => {
if (res.data.paid) {

View File

@ -320,8 +320,8 @@
},
restoreKeys() {
this.user.keys = this.keysDialog.data
let data = this.$q.localStorage.getItem(`lnbits.diagonalley.data`)
this.$q.localStorage.set(`lnbits.diagonalley.data`, {
let data = this.$q.localStorage.getItem(`lnbits.shop.data`)
this.$q.localStorage.set(`lnbits.shop.data`, {
...data,
keys: this.user.keys
})
@ -332,7 +332,7 @@
LNbits.utils
.confirmDialog('Are you sure you want to delete your stored data?')
.onOk(() => {
this.$q.localStorage.remove('lnbits.diagonalley.data')
this.$q.localStorage.remove('lnbits.shop.data')
this.user = null
})
},
@ -342,7 +342,7 @@
return
return await LNbits.api
.request('GET', `/diagonalley/api/v1/keys`, null)
.request('GET', `/shop/api/v1/keys`, null)
.then(response => {
if (response.data) {
let data = {
@ -363,7 +363,7 @@
await LNbits.api
.request(
'GET',
`/diagonalley/api/v1/chat/messages/${room_name}${
`/shop/api/v1/chat/messages/${room_name}${
all ? '?all_messages=true' : ''
}`
)
@ -397,14 +397,14 @@
ws_scheme = 'ws://'
}
ws = new WebSocket(
ws_scheme + location.host + '/diagonalley/ws/' + room_name
ws_scheme + location.host + '/shop/ws/' + room_name
)
function checkWebSocket(event) {
if (ws.readyState === WebSocket.CLOSED) {
console.log('WebSocket CLOSED: Reopening')
ws = new WebSocket(
ws_scheme + location.host + '/diagonalley/ws/' + room_name
ws_scheme + location.host + '/shop/ws/' + room_name
)
}
}
@ -447,7 +447,7 @@
})
let data =
this.$q.localStorage.getItem(`lnbits.diagonalley.data`) || false
this.$q.localStorage.getItem(`lnbits.shop.data`) || false
if (data) {
this.user = data
@ -468,7 +468,7 @@
await this.getMessages(order_id)
this.$q.localStorage.set(`lnbits.diagonalley.data`, this.user)
this.$q.localStorage.set(`lnbits.shop.data`, this.user)
this.startChat(order_id)
}
})

View File

@ -76,7 +76,7 @@
<q-card class="card--product">
{% raw %}
<q-img
:src="item.image ? item.image : '/diagonalley/static/images/placeholder.png'"
:src="item.image ? item.image : '/shop/static/images/placeholder.png'"
alt="Product Image"
loading="lazy"
spinner-color="white"
@ -359,7 +359,7 @@
})
},
getPubkey() {
let data = this.$q.localStorage.getItem(`lnbits.diagonalley.data`)
let data = this.$q.localStorage.getItem(`lnbits.shop.data`)
if (data && data.keys.publickey) {
this.checkoutDialog.data.pubkey = data.keys.publickey
} else {
@ -381,7 +381,7 @@
})
}
LNbits.api
.request('POST', '/diagonalley/api/v1/orders', null, data)
.request('POST', '/shop/api/v1/orders', null, data)
.then(res => {
this.checkoutDialog = {show: false, data: {}}
@ -402,7 +402,7 @@
LNbits.api
.request(
'GET',
`/diagonalley/api/v1/orders/payments/${this.qrCodeDialog.data.payment_hash}`
`/shop/api/v1/orders/payments/${this.qrCodeDialog.data.payment_hash}`
)
.then(res => {
if (res.data.paid) {
@ -416,7 +416,7 @@
{
label: 'See Order',
handler: () => {
window.location.href = `/diagonalley/order/?merch=${this.stall.id}&invoice_id=${this.qrCodeDialog.data.payment_hash}`
window.location.href = `/shop/order/?merch=${this.stall.id}&invoice_id=${this.qrCodeDialog.data.payment_hash}`
}
}
]
@ -425,7 +425,7 @@
this.resetCart()
this.closeQrCodeDialog()
setTimeout(() => {
window.location.href = `/diagonalley/order/?merch=${this.stall.id}&invoice_id=${this.qrCodeDialog.data.payment_hash}`
window.location.href = `/shop/order/?merch=${this.stall.id}&invoice_id=${this.qrCodeDialog.data.payment_hash}`
}, 5000)
}
})

View File

@ -11,40 +11,40 @@ from starlette.responses import HTMLResponse
from lnbits.core.models import User
from lnbits.decorators import check_user_exists # type: ignore
from lnbits.extensions.diagonalley import diagonalley_ext, diagonalley_renderer
from lnbits.extensions.diagonalley.models import CreateChatMessage
from lnbits.extensions.diagonalley.notifier import Notifier
from lnbits.extensions.shop import shop_ext, shop_renderer
from lnbits.extensions.shop.models import CreateChatMessage
from lnbits.extensions.shop.notifier import Notifier
from .crud import (
create_chat_message,
get_diagonalley_market,
get_diagonalley_market_stalls,
get_diagonalley_order_details,
get_diagonalley_order_invoiceid,
get_diagonalley_products,
get_diagonalley_stall,
get_diagonalley_zone,
get_diagonalley_zones,
update_diagonalley_product_stock,
get_shop_market,
get_shop_market_stalls,
get_shop_order_details,
get_shop_order_invoiceid,
get_shop_products,
get_shop_stall,
get_shop_zone,
get_shop_zones,
update_shop_product_stock,
)
templates = Jinja2Templates(directory="templates")
@diagonalley_ext.get("/", response_class=HTMLResponse)
@shop_ext.get("/", response_class=HTMLResponse)
async def index(request: Request, user: User = Depends(check_user_exists)):
return diagonalley_renderer().TemplateResponse(
"diagonalley/index.html", {"request": request, "user": user.dict()}
return shop_renderer().TemplateResponse(
"shop/index.html", {"request": request, "user": user.dict()}
)
@diagonalley_ext.get("/stalls/{stall_id}", response_class=HTMLResponse)
@shop_ext.get("/stalls/{stall_id}", response_class=HTMLResponse)
async def display(request: Request, stall_id):
stall = await get_diagonalley_stall(stall_id)
products = await get_diagonalley_products(stall_id)
stall = await get_shop_stall(stall_id)
products = await get_shop_products(stall_id)
zones = []
for id in stall.shippingzones.split(","):
z = await get_diagonalley_zone(id)
z = await get_shop_zone(id)
z = z.dict()
zones.append({"label": z["countries"], "cost": z["cost"], "value": z["id"]})
@ -57,8 +57,8 @@ async def display(request: Request, stall_id):
del stall["privatekey"]
stall["zones"] = zones
return diagonalley_renderer().TemplateResponse(
"diagonalley/stall.html",
return shop_renderer().TemplateResponse(
"shop/stall.html",
{
"request": request,
"stall": stall,
@ -67,23 +67,23 @@ async def display(request: Request, stall_id):
)
@diagonalley_ext.get("/market/{market_id}", response_class=HTMLResponse)
@shop_ext.get("/market/{market_id}", response_class=HTMLResponse)
async def display(request: Request, market_id):
market = await get_diagonalley_market(market_id)
market = await get_shop_market(market_id)
if not market:
raise HTTPException(
status_code=HTTPStatus.NOT_FOUND, detail="Marketplace doesn't exist."
)
stalls = await get_diagonalley_market_stalls(market_id)
stalls = await get_shop_market_stalls(market_id)
stalls_ids = [stall.id for stall in stalls]
products = [
product.dict() for product in await get_diagonalley_products(stalls_ids)
product.dict() for product in await get_shop_products(stalls_ids)
]
return diagonalley_renderer().TemplateResponse(
"diagonalley/market.html",
return shop_renderer().TemplateResponse(
"shop/market.html",
{
"request": request,
"market": market,
@ -93,20 +93,20 @@ async def display(request: Request, market_id):
)
@diagonalley_ext.get("/order", response_class=HTMLResponse)
@shop_ext.get("/order", response_class=HTMLResponse)
async def chat_page(
request: Request,
merch: str = Query(...),
invoice_id: str = Query(...),
keys: str = Query(None),
):
stall = await get_diagonalley_stall(merch)
order = await get_diagonalley_order_invoiceid(invoice_id)
_order = await get_diagonalley_order_details(order.id)
products = await get_diagonalley_products(stall.id)
stall = await get_shop_stall(merch)
order = await get_shop_order_invoiceid(invoice_id)
_order = await get_shop_order_details(order.id)
products = await get_shop_products(stall.id)
return diagonalley_renderer().TemplateResponse(
"diagonalley/order.html",
return shop_renderer().TemplateResponse(
"shop/order.html",
{
"request": request,
"stall": {
@ -155,7 +155,7 @@ notifier = Notifier()
# manager = ConnectionManager()
# @diagonalley_ext.websocket("/ws/{room_name}")
# @shop_ext.websocket("/ws/{room_name}")
# async def websocket_endpoint(websocket: WebSocket, room_name: str):
# await manager.connect(websocket, room_name)
# try:
@ -165,7 +165,7 @@ notifier = Notifier()
# manager.disconnect(websocket)
@diagonalley_ext.websocket("/ws/{room_name}")
@shop_ext.websocket("/ws/{room_name}")
async def websocket_endpoint(
websocket: WebSocket, room_name: str, background_tasks: BackgroundTasks
):

View File

@ -21,41 +21,41 @@ from lnbits.decorators import (
)
from ...helpers import urlsafe_short_hash
from . import db, diagonalley_ext
from . import db, shop_ext
from .crud import (
create_diagonalley_market,
create_diagonalley_market_stalls,
create_diagonalley_order,
create_diagonalley_order_details,
create_diagonalley_product,
create_diagonalley_stall,
create_diagonalley_zone,
delete_diagonalley_order,
delete_diagonalley_product,
delete_diagonalley_stall,
delete_diagonalley_zone,
get_diagonalley_chat_by_merchant,
get_diagonalley_chat_messages,
get_diagonalley_latest_chat_messages,
get_diagonalley_market,
get_diagonalley_market_stalls,
get_diagonalley_markets,
get_diagonalley_order,
get_diagonalley_order_details,
get_diagonalley_order_invoiceid,
get_diagonalley_orders,
get_diagonalley_product,
get_diagonalley_products,
get_diagonalley_stall,
get_diagonalley_stalls,
get_diagonalley_stalls_by_ids,
get_diagonalley_zone,
get_diagonalley_zones,
set_diagonalley_order_pubkey,
update_diagonalley_market,
update_diagonalley_product,
update_diagonalley_stall,
update_diagonalley_zone,
create_shop_market,
create_shop_market_stalls,
create_shop_order,
create_shop_order_details,
create_shop_product,
create_shop_stall,
create_shop_zone,
delete_shop_order,
delete_shop_product,
delete_shop_stall,
delete_shop_zone,
get_shop_chat_by_merchant,
get_shop_chat_messages,
get_shop_latest_chat_messages,
get_shop_market,
get_shop_market_stalls,
get_shop_markets,
get_shop_order,
get_shop_order_details,
get_shop_order_invoiceid,
get_shop_orders,
get_shop_product,
get_shop_products,
get_shop_stall,
get_shop_stalls,
get_shop_stalls_by_ids,
get_shop_zone,
get_shop_zones,
set_shop_order_pubkey,
update_shop_market,
update_shop_product,
update_shop_stall,
update_shop_zone,
)
from .models import (
CreateMarket,
@ -73,8 +73,8 @@ from .models import (
### Products
@diagonalley_ext.get("/api/v1/products")
async def api_diagonalley_products(
@shop_ext.get("/api/v1/products")
async def api_shop_products(
wallet: WalletTypeInfo = Depends(get_key_type),
all_stalls: bool = Query(False),
):
@ -83,90 +83,90 @@ async def api_diagonalley_products(
if all_stalls:
wallet_ids = (await get_user(wallet.wallet.user)).wallet_ids
stalls = [stall.id for stall in await get_diagonalley_stalls(wallet_ids)]
stalls = [stall.id for stall in await get_shop_stalls(wallet_ids)]
if not stalls:
return
return [product.dict() for product in await get_diagonalley_products(stalls)]
return [product.dict() for product in await get_shop_products(stalls)]
@diagonalley_ext.post("/api/v1/products")
@diagonalley_ext.put("/api/v1/products/{product_id}")
async def api_diagonalley_product_create(
@shop_ext.post("/api/v1/products")
@shop_ext.put("/api/v1/products/{product_id}")
async def api_shop_product_create(
data: createProduct, product_id=None, wallet: WalletTypeInfo = Depends(get_key_type)
):
if product_id:
product = await get_diagonalley_product(product_id)
product = await get_shop_product(product_id)
if not product:
return {"message": "Withdraw product does not exist."}
stall = await get_diagonalley_stall(stall_id=product.stall)
stall = await get_shop_stall(stall_id=product.stall)
if stall.wallet != wallet.wallet.id:
return {"message": "Not your withdraw product."}
product = await update_diagonalley_product(product_id, **data.dict())
product = await update_shop_product(product_id, **data.dict())
else:
product = await create_diagonalley_product(data=data)
product = await create_shop_product(data=data)
return product.dict()
@diagonalley_ext.delete("/api/v1/products/{product_id}")
async def api_diagonalley_products_delete(
@shop_ext.delete("/api/v1/products/{product_id}")
async def api_shop_products_delete(
product_id, wallet: WalletTypeInfo = Depends(require_admin_key)
):
product = await get_diagonalley_product(product_id)
product = await get_shop_product(product_id)
if not product:
return {"message": "Product does not exist."}
stall = await get_diagonalley_stall(product.stall)
stall = await get_shop_stall(product.stall)
if stall.wallet != wallet.wallet.id:
return {"message": "Not your Diagon Alley."}
return {"message": "Not your Shop."}
await delete_diagonalley_product(product_id)
await delete_shop_product(product_id)
raise HTTPException(status_code=HTTPStatus.NO_CONTENT)
# # # Shippingzones
@diagonalley_ext.get("/api/v1/zones")
async def api_diagonalley_zones(wallet: WalletTypeInfo = Depends(get_key_type)):
@shop_ext.get("/api/v1/zones")
async def api_shop_zones(wallet: WalletTypeInfo = Depends(get_key_type)):
return await get_diagonalley_zones(wallet.wallet.user)
return await get_shop_zones(wallet.wallet.user)
@diagonalley_ext.post("/api/v1/zones")
async def api_diagonalley_zone_create(
@shop_ext.post("/api/v1/zones")
async def api_shop_zone_create(
data: createZones, wallet: WalletTypeInfo = Depends(get_key_type)
):
zone = await create_diagonalley_zone(user=wallet.wallet.user, data=data)
zone = await create_shop_zone(user=wallet.wallet.user, data=data)
return zone.dict()
@diagonalley_ext.post("/api/v1/zones/{zone_id}")
async def api_diagonalley_zone_update(
@shop_ext.post("/api/v1/zones/{zone_id}")
async def api_shop_zone_update(
data: createZones,
zone_id: str,
wallet: WalletTypeInfo = Depends(require_admin_key),
):
zone = await get_diagonalley_zone(zone_id)
zone = await get_shop_zone(zone_id)
if not zone:
return {"message": "Zone does not exist."}
if zone.user != wallet.wallet.user:
return {"message": "Not your record."}
zone = await update_diagonalley_zone(zone_id, **data.dict())
zone = await update_shop_zone(zone_id, **data.dict())
return zone
@diagonalley_ext.delete("/api/v1/zones/{zone_id}")
async def api_diagonalley_zone_delete(
@shop_ext.delete("/api/v1/zones/{zone_id}")
async def api_shop_zone_delete(
zone_id, wallet: WalletTypeInfo = Depends(require_admin_key)
):
zone = await get_diagonalley_zone(zone_id)
zone = await get_shop_zone(zone_id)
if not zone:
return {"message": "zone does not exist."}
@ -174,15 +174,15 @@ async def api_diagonalley_zone_delete(
if zone.user != wallet.wallet.user:
return {"message": "Not your zone."}
await delete_diagonalley_zone(zone_id)
await delete_shop_zone(zone_id)
raise HTTPException(status_code=HTTPStatus.NO_CONTENT)
# # # Stalls
@diagonalley_ext.get("/api/v1/stalls")
async def api_diagonalley_stalls(
@shop_ext.get("/api/v1/stalls")
async def api_shop_stalls(
wallet: WalletTypeInfo = Depends(get_key_type), all_wallets: bool = Query(False)
):
wallet_ids = [wallet.wallet.id]
@ -190,37 +190,37 @@ async def api_diagonalley_stalls(
if all_wallets:
wallet_ids = (await get_user(wallet.wallet.user)).wallet_ids
return [stall.dict() for stall in await get_diagonalley_stalls(wallet_ids)]
return [stall.dict() for stall in await get_shop_stalls(wallet_ids)]
@diagonalley_ext.post("/api/v1/stalls")
@diagonalley_ext.put("/api/v1/stalls/{stall_id}")
async def api_diagonalley_stall_create(
@shop_ext.post("/api/v1/stalls")
@shop_ext.put("/api/v1/stalls/{stall_id}")
async def api_shop_stall_create(
data: createStalls,
stall_id: str = None,
wallet: WalletTypeInfo = Depends(require_invoice_key),
):
if stall_id:
stall = await get_diagonalley_stall(stall_id)
stall = await get_shop_stall(stall_id)
if not stall:
return {"message": "Withdraw stall does not exist."}
if stall.wallet != wallet.wallet.id:
return {"message": "Not your withdraw stall."}
stall = await update_diagonalley_stall(stall_id, **data.dict())
stall = await update_shop_stall(stall_id, **data.dict())
else:
stall = await create_diagonalley_stall(data=data)
stall = await create_shop_stall(data=data)
return stall.dict()
@diagonalley_ext.delete("/api/v1/stalls/{stall_id}")
async def api_diagonalley_stall_delete(
@shop_ext.delete("/api/v1/stalls/{stall_id}")
async def api_shop_stall_delete(
stall_id: str, wallet: WalletTypeInfo = Depends(require_admin_key)
):
stall = await get_diagonalley_stall(stall_id)
stall = await get_shop_stall(stall_id)
if not stall:
return {"message": "Stall does not exist."}
@ -228,44 +228,44 @@ async def api_diagonalley_stall_delete(
if stall.wallet != wallet.wallet.id:
return {"message": "Not your Stall."}
await delete_diagonalley_stall(stall_id)
await delete_shop_stall(stall_id)
raise HTTPException(status_code=HTTPStatus.NO_CONTENT)
###Orders
@diagonalley_ext.get("/api/v1/orders")
async def api_diagonalley_orders(
@shop_ext.get("/api/v1/orders")
async def api_shop_orders(
wallet: WalletTypeInfo = Depends(get_key_type), all_wallets: bool = Query(False)
):
wallet_ids = [wallet.wallet.id]
if all_wallets:
wallet_ids = (await get_user(wallet.wallet.user)).wallet_ids
orders = await get_diagonalley_orders(wallet_ids)
orders = await get_shop_orders(wallet_ids)
orders_with_details = []
for order in orders:
order = order.dict()
order["details"] = await get_diagonalley_order_details(order["id"])
order["details"] = await get_shop_order_details(order["id"])
orders_with_details.append(order)
try:
return orders_with_details # [order for order in orders]
# return [order.dict() for order in await get_diagonalley_orders(wallet_ids)]
# return [order.dict() for order in await get_shop_orders(wallet_ids)]
except:
return {"message": "We could not retrieve the orders."}
@diagonalley_ext.get("/api/v1/orders/{order_id}")
async def api_diagonalley_order_by_id(order_id: str):
order = (await get_diagonalley_order(order_id)).dict()
order["details"] = await get_diagonalley_order_details(order_id)
@shop_ext.get("/api/v1/orders/{order_id}")
async def api_shop_order_by_id(order_id: str):
order = (await get_shop_order(order_id)).dict()
order["details"] = await get_shop_order_details(order_id)
return order
@diagonalley_ext.post("/api/v1/orders")
async def api_diagonalley_order_create(data: createOrder):
@shop_ext.post("/api/v1/orders")
async def api_shop_order_create(data: createOrder):
ref = urlsafe_short_hash()
payment_hash, payment_request = await create_invoice(
@ -273,14 +273,14 @@ async def api_diagonalley_order_create(data: createOrder):
amount=data.total,
memo=f"New order on Diagon alley",
extra={
"tag": "diagonalley",
"tag": "shop",
"reference": ref,
},
)
order_id = await create_diagonalley_order(invoiceid=payment_hash, data=data)
order_id = await create_shop_order(invoiceid=payment_hash, data=data)
logger.debug(f"ORDER ID {order_id}")
logger.debug(f"PRODUCTS {data.products}")
await create_diagonalley_order_details(order_id=order_id, data=data.products)
await create_shop_order_details(order_id=order_id, data=data.products)
return {
"payment_hash": payment_hash,
"payment_request": payment_request,
@ -288,9 +288,9 @@ async def api_diagonalley_order_create(data: createOrder):
}
@diagonalley_ext.get("/api/v1/orders/payments/{payment_hash}")
async def api_diagonalley_check_payment(payment_hash: str):
order = await get_diagonalley_order_invoiceid(payment_hash)
@shop_ext.get("/api/v1/orders/payments/{payment_hash}")
async def api_shop_check_payment(payment_hash: str):
order = await get_shop_order_invoiceid(payment_hash)
if not order:
raise HTTPException(
status_code=HTTPStatus.NOT_FOUND, detail="Order does not exist."
@ -304,11 +304,11 @@ async def api_diagonalley_check_payment(payment_hash: str):
return status
@diagonalley_ext.delete("/api/v1/orders/{order_id}")
async def api_diagonalley_order_delete(
@shop_ext.delete("/api/v1/orders/{order_id}")
async def api_shop_order_delete(
order_id: str, wallet: WalletTypeInfo = Depends(require_admin_key)
):
order = await get_diagonalley_order(order_id)
order = await get_shop_order(order_id)
if not order:
return {"message": "Order does not exist."}
@ -316,17 +316,17 @@ async def api_diagonalley_order_delete(
if order.wallet != wallet.wallet.id:
return {"message": "Not your Order."}
await delete_diagonalley_order(order_id)
await delete_shop_order(order_id)
raise HTTPException(status_code=HTTPStatus.NO_CONTENT)
@diagonalley_ext.get("/api/v1/orders/paid/{order_id}")
async def api_diagonalley_order_paid(
@shop_ext.get("/api/v1/orders/paid/{order_id}")
async def api_shop_order_paid(
order_id, wallet: WalletTypeInfo = Depends(require_admin_key)
):
await db.execute(
"UPDATE diagonalley.orders SET paid = ? WHERE id = ?",
"UPDATE shop.orders SET paid = ? WHERE id = ?",
(
True,
order_id,
@ -335,19 +335,19 @@ async def api_diagonalley_order_paid(
return "", HTTPStatus.OK
@diagonalley_ext.get("/api/v1/orders/shipped/{order_id}")
async def api_diagonalley_order_shipped(
@shop_ext.get("/api/v1/orders/shipped/{order_id}")
async def api_shop_order_shipped(
order_id, wallet: WalletTypeInfo = Depends(get_key_type)
):
await db.execute(
"UPDATE diagonalley.orders SET shipped = ? WHERE id = ?",
"UPDATE shop.orders SET shipped = ? WHERE id = ?",
(
True,
order_id,
),
)
order = await db.fetchone(
"SELECT * FROM diagonalley.orders WHERE id = ?", (order_id,)
"SELECT * FROM shop.orders WHERE id = ?", (order_id,)
)
return order
@ -356,35 +356,35 @@ async def api_diagonalley_order_shipped(
###List products based on stall id
@diagonalley_ext.get("/api/v1/stall/products/{stall_id}")
async def api_diagonalley_stall_products(
@shop_ext.get("/api/v1/stall/products/{stall_id}")
async def api_shop_stall_products(
stall_id, wallet: WalletTypeInfo = Depends(get_key_type)
):
rows = await db.fetchone(
"SELECT * FROM diagonalley.stalls WHERE id = ?", (stall_id,)
"SELECT * FROM shop.stalls WHERE id = ?", (stall_id,)
)
if not rows:
return {"message": "Stall does not exist."}
products = db.fetchone(
"SELECT * FROM diagonalley.products WHERE wallet = ?", (rows[1],)
"SELECT * FROM shop.products WHERE wallet = ?", (rows[1],)
)
if not products:
return {"message": "No products"}
return [products.dict() for products in await get_diagonalley_products(rows[1])]
return [products.dict() for products in await get_shop_products(rows[1])]
###Check a product has been shipped
@diagonalley_ext.get("/api/v1/stall/checkshipped/{checking_id}")
async def api_diagonalley_stall_checkshipped(
@shop_ext.get("/api/v1/stall/checkshipped/{checking_id}")
async def api_shop_stall_checkshipped(
checking_id, wallet: WalletTypeInfo = Depends(get_key_type)
):
rows = await db.fetchone(
"SELECT * FROM diagonalley.orders WHERE invoiceid = ?", (checking_id,)
"SELECT * FROM shop.orders WHERE invoiceid = ?", (checking_id,)
)
return {"shipped": rows["shipped"]}
@ -392,12 +392,12 @@ async def api_diagonalley_stall_checkshipped(
###Place order
# @diagonalley_ext.post("/api/v1/stall/order/{stall_id}")
# async def api_diagonalley_stall_order(
# @shop_ext.post("/api/v1/stall/order/{stall_id}")
# async def api_shop_stall_order(
# stall_id, data: createOrder, wallet: WalletTypeInfo = Depends(get_key_type)
# ):
# product = await get_diagonalley_product(data.productid)
# shipping = await get_diagonalley_stall(stall_id)
# product = await get_shop_product(data.productid)
# shipping = await get_shop_stall(stall_id)
# if data.shippingzone == 1:
# shippingcost = shipping.zone1cost # missing in model
@ -412,7 +412,7 @@ async def api_diagonalley_stall_checkshipped(
# selling_id = urlsafe_b64encode(uuid4().bytes_le).decode("utf-8")
# await db.execute(
# """
# INSERT INTO diagonalley.orders (id, productid, wallet, product, quantity, shippingzone, address, email, invoiceid, paid, shipped)
# INSERT INTO shop.orders (id, productid, wallet, product, quantity, shippingzone, address, email, invoiceid, paid, shipped)
# VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
# """,
# (
@ -437,43 +437,43 @@ async def api_diagonalley_stall_checkshipped(
##
@diagonalley_ext.get("/api/v1/markets")
async def api_diagonalley_markets(wallet: WalletTypeInfo = Depends(get_key_type)):
# await get_diagonalley_market_stalls(market_id="FzpWnMyHQMcRppiGVua4eY")
@shop_ext.get("/api/v1/markets")
async def api_shop_markets(wallet: WalletTypeInfo = Depends(get_key_type)):
# await get_shop_market_stalls(market_id="FzpWnMyHQMcRppiGVua4eY")
try:
return [
market.dict()
for market in await get_diagonalley_markets(wallet.wallet.user)
for market in await get_shop_markets(wallet.wallet.user)
]
except:
return {"message": "We could not retrieve the markets."}
@diagonalley_ext.get("/api/v1/markets/{market_id}/stalls")
async def api_diagonalley_market_stalls(market_id: str):
stall_ids = await get_diagonalley_market_stalls(market_id)
@shop_ext.get("/api/v1/markets/{market_id}/stalls")
async def api_shop_market_stalls(market_id: str):
stall_ids = await get_shop_market_stalls(market_id)
return stall_ids
@diagonalley_ext.post("/api/v1/markets")
@diagonalley_ext.put("/api/v1/markets/{market_id}")
async def api_diagonalley_stall_create(
@shop_ext.post("/api/v1/markets")
@shop_ext.put("/api/v1/markets/{market_id}")
async def api_shop_stall_create(
data: CreateMarket,
market_id: str = None,
wallet: WalletTypeInfo = Depends(require_invoice_key),
):
if market_id:
market = await get_diagonalley_market(market_id)
market = await get_shop_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())
market = await update_shop_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)
market = await create_shop_market(data=data)
await create_shop_market_stalls(market_id=market.id, data=data.stalls)
return market.dict()
@ -481,8 +481,8 @@ async def api_diagonalley_stall_create(
## KEYS
@diagonalley_ext.get("/api/v1/keys")
async def api_diagonalley_generate_keys():
@shop_ext.get("/api/v1/keys")
async def api_shop_generate_keys():
private_key = PrivateKey()
public_key = private_key.pubkey.serialize().hex()
while not public_key.startswith("02"):
@ -494,21 +494,21 @@ async def api_diagonalley_generate_keys():
## MESSAGES/CHAT
@diagonalley_ext.get("/api/v1/chat/messages/merchant")
@shop_ext.get("/api/v1/chat/messages/merchant")
async def api_get_merchant_messages(
orders: str = Query(...), wallet: WalletTypeInfo = Depends(require_admin_key)
):
return [
msg.dict() for msg in await get_diagonalley_chat_by_merchant(orders.split(","))
msg.dict() for msg in await get_shop_chat_by_merchant(orders.split(","))
]
@diagonalley_ext.get("/api/v1/chat/messages/{room_name}")
@shop_ext.get("/api/v1/chat/messages/{room_name}")
async def api_get_latest_chat_msg(room_name: str, all_messages: bool = Query(False)):
if all_messages:
messages = await get_diagonalley_chat_messages(room_name)
messages = await get_shop_chat_messages(room_name)
else:
messages = await get_diagonalley_latest_chat_messages(room_name)
messages = await get_shop_latest_chat_messages(room_name)
return messages