From d5f4697251d73cd97a0f80c2f3e6e80457e35d7a Mon Sep 17 00:00:00 2001 From: Arc <33088785+arcbtc@users.noreply.github.com> Date: Thu, 16 Apr 2020 21:51:17 +0100 Subject: [PATCH] Added Diagon Alley extension --- lnbits/extensions/diagonalley/README.md | 10 + lnbits/extensions/diagonalley/__init__.py | 8 + lnbits/extensions/diagonalley/config.json | 6 + lnbits/extensions/diagonalley/crud.py | 128 ++++ lnbits/extensions/diagonalley/migrations.py | 64 ++ lnbits/extensions/diagonalley/models.py | 39 ++ .../templates/diagonalley/_api_docs.html | 64 ++ .../templates/diagonalley/index.html | 622 ++++++++++++++++++ .../templates/diagonalley/stall.html | 1 + lnbits/extensions/diagonalley/views.py | 14 + lnbits/extensions/diagonalley/views_api.py | 211 ++++++ 11 files changed, 1167 insertions(+) create mode 100644 lnbits/extensions/diagonalley/README.md create mode 100644 lnbits/extensions/diagonalley/__init__.py create mode 100644 lnbits/extensions/diagonalley/config.json create mode 100644 lnbits/extensions/diagonalley/crud.py create mode 100644 lnbits/extensions/diagonalley/migrations.py create mode 100644 lnbits/extensions/diagonalley/models.py create mode 100644 lnbits/extensions/diagonalley/templates/diagonalley/_api_docs.html create mode 100644 lnbits/extensions/diagonalley/templates/diagonalley/index.html create mode 100644 lnbits/extensions/diagonalley/templates/diagonalley/stall.html create mode 100644 lnbits/extensions/diagonalley/views.py create mode 100644 lnbits/extensions/diagonalley/views_api.py diff --git a/lnbits/extensions/diagonalley/README.md b/lnbits/extensions/diagonalley/README.md new file mode 100644 index 000000000..6ba653e79 --- /dev/null +++ b/lnbits/extensions/diagonalley/README.md @@ -0,0 +1,10 @@ +
curl -X GET http://YOUR-TOR-ADDRESS
diff --git a/lnbits/extensions/diagonalley/__init__.py b/lnbits/extensions/diagonalley/__init__.py
new file mode 100644
index 000000000..44fbeef04
--- /dev/null
+++ b/lnbits/extensions/diagonalley/__init__.py
@@ -0,0 +1,8 @@
+from flask import Blueprint
+
+
+diagonalley_ext = Blueprint("diagonalley", __name__, static_folder="static", template_folder="templates")
+
+
+from .views_api import * # noqa
+from .views import * # noqa
diff --git a/lnbits/extensions/diagonalley/config.json b/lnbits/extensions/diagonalley/config.json
new file mode 100644
index 000000000..9420bf089
--- /dev/null
+++ b/lnbits/extensions/diagonalley/config.json
@@ -0,0 +1,6 @@
+{
+ "name": "Diagon Alley",
+ "short_description": "Movable anonymous market stand",
+ "icon": "add_shopping_cart",
+ "contributors": ["eillarra"]
+}
diff --git a/lnbits/extensions/diagonalley/crud.py b/lnbits/extensions/diagonalley/crud.py
new file mode 100644
index 000000000..43403cfc5
--- /dev/null
+++ b/lnbits/extensions/diagonalley/crud.py
@@ -0,0 +1,128 @@
+from base64 import urlsafe_b64encode
+from uuid import uuid4
+from typing import List, Optional, Union
+
+from lnbits.db import open_ext_db
+
+from .models import Products, Orders, Indexers
+
+
+###Products
+
+def create_diagonalleys_product(*, wallet_id: str, product: str, categories: str, description: str, image: str, price: int, quantity: int) -> Products:
+ with open_ext_db("diagonalley") as db:
+ product_id = urlsafe_b64encode(uuid4().bytes_le).decode('utf-8')
+ db.execute(
+ """
+ INSERT INTO products (id, wallet, product, categories, description, image, price, quantity)
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
+ """,
+ (product_id, wallet_id, product, categories, description, image, price, quantity),
+ )
+
+ return get_diagonalleys_product(product_id)
+
+
+def get_diagonalleys_product(product_id: str) -> Optional[Products]:
+ with open_ext_db("diagonalley") as db:
+ row = db.fetchone("SELECT * FROM products WHERE id = ?", (product_id,))
+
+ return Products(**row) if row else None
+
+
+def get_diagonalleys_products(wallet_ids: Union[str, List[str]]) -> List[Products]:
+ if isinstance(wallet_ids, str):
+ wallet_ids = [wallet_ids]
+
+ with open_ext_db("diagonalley") as db:
+ q = ",".join(["?"] * len(wallet_ids))
+ rows = db.fetchall(f"SELECT * FROM products WHERE wallet IN ({q})", (*wallet_ids,))
+
+ return [Products(**row) for row in rows]
+
+
+def delete_diagonalleys_product(product_id: str) -> None:
+ with open_ext_db("diagonalley") as db:
+ db.execute("DELETE FROM products WHERE id = ?", (product_id,))
+
+
+
+
+###Indexers
+
+def create_diagonalleys_indexer(*, wallet_id: str, shopname: str, indexeraddress: str, shippingzone1: str, shippingzone2: str, zone1cost: int, zone2cost: int, email: str) -> Indexers:
+ with open_ext_db("diagonalley") as db:
+ indexer_id = urlsafe_b64encode(uuid4().bytes_le).decode('utf-8')
+ rating_key = urlsafe_b64encode(uuid4().bytes_le).decode('utf-8')
+ db.execute(
+ """
+ INSERT INTO indexers (id, wallet, shopname, indexeraddress, ratingkey, rating, shippingzone1, shippingzone2, zone1cost, zone2cost, email)
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+ """,
+ (indexer_id, wallet_id, shopname, indexeraddress, rating_key, 100, shippingzone1, shippingzone2, zone1cost, zone2cost, email),
+ )
+
+ return get_diagonalleys_indexer(indexer_id)
+
+
+def get_diagonalleys_indexer(indexer_id: str) -> Optional[Indexers]:
+ with open_ext_db("diagonalley") as db:
+ row = db.fetchone("SELECT * FROM indexers WHERE id = ?", (indexer_id,))
+
+ return Indexers(**row) if row else None
+
+
+def get_diagonalleys_indexers(wallet_ids: Union[str, List[str]]) -> List[Indexers]:
+ if isinstance(wallet_ids, str):
+ wallet_ids = [wallet_ids]
+
+ with open_ext_db("diagonalley") as db:
+ q = ",".join(["?"] * len(wallet_ids))
+ rows = db.fetchall(f"SELECT * FROM indexers WHERE wallet IN ({q})", (*wallet_ids,))
+
+ return [Indexers(**row) for row in rows]
+
+
+def delete_diagonalleys_indexer(indexer_id: str) -> None:
+ with open_ext_db("diagonalley") as db:
+ db.execute("DELETE FROM indexers WHERE id = ?", (indexer_id,))
+
+
+
+###Orders
+
+def create_diagonalleys_order(*, productid: str, wallet: str, product: str, quantity: int, shippingzone: str, address: str, email: str, invoiceid: str, paid: bool, shipped: bool) -> Indexers:
+ with open_ext_db("diagonalley") as db:
+ order_id = urlsafe_b64encode(uuid4().bytes_le).decode('utf-8')
+ db.execute(
+ """
+ INSERT INTO orders (id, productid, wallet, product, quantity, shippingzone, address, email, invoiceid, paid, shipped)
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+ """,
+ (order_id, productid, wallet, product, quantity, shippingzone, address, email, invoiceid, False, False),
+ )
+
+ return get_diagonalleys_order(order_id)
+
+
+def get_diagonalleys_order(order_id: str) -> Optional[Orders]:
+ with open_ext_db("diagonalley") as db:
+ row = db.fetchone("SELECT * FROM orders WHERE id = ?", (order_id,))
+
+ return Orders(**row) if row else None
+
+
+def get_diagonalleys_orders(wallet_ids: Union[str, List[str]]) -> List[Orders]:
+ if isinstance(wallet_ids, str):
+ wallet_ids = [wallet_ids]
+
+ with open_ext_db("diagonalley") as db:
+ q = ",".join(["?"] * len(wallet_ids))
+ rows = db.fetchall(f"SELECT * FROM orders WHERE wallet IN ({q})", (*wallet_ids,))
+
+ return [Orders(**row) for row in rows]
+
+
+def delete_diagonalleys_order(order_id: str) -> None:
+ with open_ext_db("diagonalley") as db:
+ db.execute("DELETE FROM orders WHERE id = ?", (order_id,))
diff --git a/lnbits/extensions/diagonalley/migrations.py b/lnbits/extensions/diagonalley/migrations.py
new file mode 100644
index 000000000..a584aafa2
--- /dev/null
+++ b/lnbits/extensions/diagonalley/migrations.py
@@ -0,0 +1,64 @@
+from lnbits.db import open_ext_db
+
+
+def m001_initial(db):
+ """
+ Initial products table.
+ """
+ db.execute("""
+ CREATE TABLE IF NOT EXISTS products (
+ id TEXT PRIMARY KEY,
+ wallet TEXT NOT NULL,
+ product TEXT NOT NULL,
+ categories TEXT NOT NULL,
+ description TEXT NOT NULL,
+ image TEXT NOT NULL,
+ price INTEGER NOT NULL,
+ quantity INTEGER NOT NULL
+ );
+ """)
+
+
+ """
+ Initial indexers table.
+ """
+ db.execute("""
+ CREATE TABLE IF NOT EXISTS indexers (
+ id TEXT PRIMARY KEY,
+ wallet TEXT NOT NULL,
+ shopname TEXT NOT NULL,
+ indexeraddress TEXT NOT NULL,
+ ratingkey TEXT NOT NULL,
+ rating INTEGER NOT NULL,
+ shippingzone1 TEXT NOT NULL,
+ shippingzone2 TEXT NOT NULL,
+ zone1cost INTEGER NOT NULL,
+ zone2cost INTEGER NOT NULL,
+ email TEXT NOT NULL
+ );
+ """)
+
+
+ """
+ Initial indexers table.
+ """
+ db.execute("""
+ CREATE TABLE IF NOT EXISTS orders (
+ id TEXT PRIMARY KEY,
+ productid TEXT NOT NULL,
+ wallet TEXT NOT NULL,
+ product TEXT NOT NULL,
+ quantity INTEGER NOT NULL,
+ shippingzone INTEGER NOT NULL,
+ address TEXT NOT NULL,
+ email TEXT NOT NULL,
+ invoiceid TEXT NOT NULL,
+ paid BOOLEAN NOT NULL,
+ shipped BOOLEAN NOT NULL
+ );
+ """)
+
+def migrate():
+ with open_ext_db("diagonalley") as db:
+ m001_initial(db)
+
diff --git a/lnbits/extensions/diagonalley/models.py b/lnbits/extensions/diagonalley/models.py
new file mode 100644
index 000000000..890463af3
--- /dev/null
+++ b/lnbits/extensions/diagonalley/models.py
@@ -0,0 +1,39 @@
+from typing import NamedTuple
+
+class Indexers(NamedTuple):
+ id: str
+ wallet: str
+ shopname: str
+ indexeraddress: str
+ ratingkey: str
+ rating: str
+ shippingzone1: str
+ shippingzone2: str
+ zone1cost: int
+ zone2cost: int
+ email: str
+
+class Products(NamedTuple):
+ id: str
+ wallet: str
+ product: str
+ categories: str
+ description: str
+ image: str
+ price: int
+ quantity: int
+
+class Orders(NamedTuple):
+ id: str
+ productid: str
+ wallet: str
+ product: str
+ quantity: int
+ shippingzone: int
+ address: str
+ email: str
+ invoiceid: str
+ paid: bool
+ shipped: bool
+
+
diff --git a/lnbits/extensions/diagonalley/templates/diagonalley/_api_docs.html b/lnbits/extensions/diagonalley/templates/diagonalley/_api_docs.html
new file mode 100644
index 000000000..f1c0bd3ef
--- /dev/null
+++ b/lnbits/extensions/diagonalley/templates/diagonalley/_api_docs.html
@@ -0,0 +1,64 @@
+
+ Make a list of products to sell, point your list of products at a public indexer. Buyers browse your products on the indexer, and pay you directly. Ratings are managed by the indexer. Your stall can be listed in multiple indexers, even over TOR, if you wish to be anonymous.
+ Created by, Ben Arc
GET /api/v1/diagonalley/stall/products/<wallet_id>
+ Product JSON list
+ curl -X GET http://127.0.0.1:5000/diagonalley/api/v1/diagonalley/stall/products/<wallet_id>
+ POST /api/v1/diagonalley/stall/order/<wallet_id>
+ {"id": <string>, "address": <string>, "shippingzone": <integer>, "email": <string>, "quantity": <integer>}
+ {"checking_id": <string>,"payment_request": <string>}
+ curl -X POST http://127.0.0.1:5000/diagonalley/api/v1/diagonalley/stall/order/<wallet_id> -d '{"id": <product_id&>, "email": <customer_email>, "address": <customer_address>, "quantity": 2, "shippingzone": 1}' -H "Content-type: application/json"
+
+ GET /diagonalley/api/v1/diagonalley/stall/checkshipped/<checking_id>
+ {"shipped": <boolean>}
+ curl -X GET http://127.0.0.1:5000/diagonalley/api/v1/diagonalley/stall/checkshipped/<checking_id> -H "Content-type: application/json"
+