From d72678972df7b5db34a56bb29cd165977c41c98a Mon Sep 17 00:00:00 2001 From: Arc <33088785+arcbtc@users.noreply.github.com> Date: Fri, 1 May 2020 06:09:51 +0100 Subject: [PATCH] Add files via upload --- lnbits/extensions/usermanager/README.md | 9 + lnbits/extensions/usermanager/__init__.py | 8 + lnbits/extensions/usermanager/config.json | 6 + lnbits/extensions/usermanager/crud.py | 117 +++++ lnbits/extensions/usermanager/migrations.py | 36 ++ lnbits/extensions/usermanager/models.py | 18 + .../templates/usermanager/_api_docs.html | 121 +++++ .../templates/usermanager/index.html | 416 ++++++++++++++++++ lnbits/extensions/usermanager/views.py | 14 + lnbits/extensions/usermanager/views_api.py | 93 ++++ 10 files changed, 838 insertions(+) create mode 100644 lnbits/extensions/usermanager/README.md create mode 100644 lnbits/extensions/usermanager/__init__.py create mode 100644 lnbits/extensions/usermanager/config.json create mode 100644 lnbits/extensions/usermanager/crud.py create mode 100644 lnbits/extensions/usermanager/migrations.py create mode 100644 lnbits/extensions/usermanager/models.py create mode 100644 lnbits/extensions/usermanager/templates/usermanager/_api_docs.html create mode 100644 lnbits/extensions/usermanager/templates/usermanager/index.html create mode 100644 lnbits/extensions/usermanager/views.py create mode 100644 lnbits/extensions/usermanager/views_api.py diff --git a/lnbits/extensions/usermanager/README.md b/lnbits/extensions/usermanager/README.md new file mode 100644 index 00000000..005c5206 --- /dev/null +++ b/lnbits/extensions/usermanager/README.md @@ -0,0 +1,9 @@ +
+
+
+curl -X GET http://YOUR-TOR-ADDRESS
diff --git a/lnbits/extensions/usermanager/__init__.py b/lnbits/extensions/usermanager/__init__.py
new file mode 100644
index 00000000..7381fd1c
--- /dev/null
+++ b/lnbits/extensions/usermanager/__init__.py
@@ -0,0 +1,8 @@
+from flask import Blueprint
+
+
+usermanager_ext: Blueprint = Blueprint("usermanager", __name__, static_folder="static", template_folder="templates")
+
+
+from .views_api import * # noqa
+from .views import * # noqa
diff --git a/lnbits/extensions/usermanager/config.json b/lnbits/extensions/usermanager/config.json
new file mode 100644
index 00000000..7391ec29
--- /dev/null
+++ b/lnbits/extensions/usermanager/config.json
@@ -0,0 +1,6 @@
+{
+ "name": "User Manager",
+ "short_description": "Generate users and wallets",
+ "icon": "person_add",
+ "contributors": ["benarc"]
+}
diff --git a/lnbits/extensions/usermanager/crud.py b/lnbits/extensions/usermanager/crud.py
new file mode 100644
index 00000000..61718ddb
--- /dev/null
+++ b/lnbits/extensions/usermanager/crud.py
@@ -0,0 +1,117 @@
+from lnbits.db import open_ext_db
+from lnbits.settings import WALLET
+from .models import Users, Wallets
+from typing import List, Optional, Union
+
+from ...core.crud import (
+ create_account,
+ get_user,
+ update_user_extension,
+ get_wallet_payments,
+ create_wallet,
+ delete_wallet,
+)
+
+
+
+
+
+###Users
+
+def create_usermanager_user(user_name: str, wallet_name: str, admin_id: str) -> Users:
+ user = get_user(create_account().id)
+
+ wallet = create_wallet(user_id=user.id, wallet_name=wallet_name)
+
+ with open_ext_db("usermanager") as db:
+ db.execute(
+ """
+ INSERT INTO users (id, name, admin)
+ VALUES (?, ?, ?)
+ """,
+ (user.id, user_name, admin_id),
+ )
+
+ db.execute(
+ """
+ INSERT INTO wallets (id, admin, name, user, adminkey, inkey)
+ VALUES (?, ?, ?, ?, ?, ?)
+ """,
+ (wallet.id, admin_id, wallet_name, user.id, wallet.adminkey, wallet.inkey)
+ )
+
+ return get_usermanager_user(user.id)
+
+
+def get_usermanager_user(user_id: str) -> Users:
+ with open_ext_db("usermanager") as db:
+
+ row = db.fetchone("SELECT * FROM users WHERE id = ?", (user_id,))
+
+
+ return Users(**row) if row else None
+
+
+def get_usermanager_users(user_id: str) -> Users:
+
+ with open_ext_db("usermanager") as db:
+ rows = db.fetchall("SELECT * FROM users WHERE admin = ?", (user_id,))
+
+ return [Users(**row) for row in rows]
+
+
+def delete_usermanager_user(user_id: str) -> None:
+ row = get_usermanager_wallets(user_id)
+ print("test")
+ with open_ext_db("usermanager") as db:
+ db.execute("DELETE FROM users WHERE id = ?", (user_id,))
+ row
+ for r in row:
+ delete_wallet( user_id=user_id, wallet_id=r.id)
+ with open_ext_db("usermanager") as dbb:
+ dbb.execute("DELETE FROM wallets WHERE user = ?", (user_id,))
+
+###Wallets
+
+def create_usermanager_wallet(user_id: str, wallet_name: str, admin_id: str) -> Wallets:
+ wallet = create_wallet(user_id=user_id, wallet_name=wallet_name)
+ with open_ext_db("usermanager") as db:
+
+ db.execute(
+ """
+ INSERT INTO wallets (id, admin, name, user, adminkey, inkey)
+ VALUES (?, ?, ?, ?, ?, ?)
+ """,
+ (wallet.id, admin_id, wallet_name, user_id, wallet.adminkey, wallet.inkey)
+ )
+
+ return get_usermanager_wallet(wallet.id)
+
+def get_usermanager_wallet(wallet_id: str) -> Optional[Wallets]:
+ with open_ext_db("usermanager") as db:
+ row = db.fetchone("SELECT * FROM wallets WHERE id = ?", (wallet_id,))
+
+ return Wallets(**row) if row else None
+
+
+def get_usermanager_wallets(user_id: str) -> Wallets:
+
+ with open_ext_db("usermanager") as db:
+ rows = db.fetchall("SELECT * FROM wallets WHERE admin = ?", (user_id,))
+
+ return [Wallets(**row) for row in rows]
+
+
+def get_usermanager_wallet_transactions(wallet_id: str) -> Users:
+ return get_wallet_payments(wallet_id=wallet_id,include_all_pending=False)
+
+def get_usermanager_wallet_balances(user_id: str) -> Users:
+ user = get_user(user_id)
+ return (user.wallets)
+
+
+def delete_usermanager_wallet(wallet_id: str, user_id: str) -> None:
+ delete_wallet( user_id=user_id, wallet_id=wallet_id)
+ with open_ext_db("usermanager") as db:
+ db.execute("DELETE FROM wallets WHERE id = ?", (wallet_id,))
+
diff --git a/lnbits/extensions/usermanager/migrations.py b/lnbits/extensions/usermanager/migrations.py
new file mode 100644
index 00000000..26726b3c
--- /dev/null
+++ b/lnbits/extensions/usermanager/migrations.py
@@ -0,0 +1,36 @@
+from lnbits.db import open_ext_db
+
+
+def m001_initial(db):
+ """
+ Initial users table.
+ """
+ db.execute("""
+ CREATE TABLE IF NOT EXISTS users (
+ id TEXT PRIMARY KEY,
+ name TEXT NOT NULL,
+ admin TEXT NOT NULL,
+ email TEXT,
+ password TEXT
+ );
+ """)
+
+
+ """
+ Initial wallets table.
+ """
+ db.execute("""
+ CREATE TABLE IF NOT EXISTS wallets (
+ id TEXT PRIMARY KEY,
+ admin TEXT NOT NULL,
+ name TEXT NOT NULL,
+ user TEXT NOT NULL,
+ adminkey TEXT NOT NULL,
+ inkey TEXT NOT NULL
+ );
+ """)
+
+def migrate():
+ with open_ext_db("usermanager") as db:
+ m001_initial(db)
+
diff --git a/lnbits/extensions/usermanager/models.py b/lnbits/extensions/usermanager/models.py
new file mode 100644
index 00000000..d7362328
--- /dev/null
+++ b/lnbits/extensions/usermanager/models.py
@@ -0,0 +1,18 @@
+from typing import NamedTuple
+
+class Users(NamedTuple):
+ id: str
+ name: str
+ admin: str
+ email: str
+ password: str
+
+class Wallets(NamedTuple):
+ id: str
+ admin: str
+ name: str
+ user: str
+ adminkey: str
+ inkey: str
+
+
diff --git a/lnbits/extensions/usermanager/templates/usermanager/_api_docs.html b/lnbits/extensions/usermanager/templates/usermanager/_api_docs.html
new file mode 100644
index 00000000..ff15e3ad
--- /dev/null
+++ b/lnbits/extensions/usermanager/templates/usermanager/_api_docs.html
@@ -0,0 +1,121 @@
+
+ To help developers use LNbits to manage their users, the User Manager extention allows the creation and management of users and wallets.
For example, a games developer may be developing a game that needs each user to have their own wallet, LNbits can be included in the develpoers stack as the user and wallet manager.
+ Created by, Ben Arc
GET /usermanager/api/v1/users
+ JSON list of users
+ curl -X GET {{ request.url_root }}usermanager/api/v1/users -H "X-Api-Key: {{ g.user.wallets[0].inkey }}"
+ GET /usermanager/api/v1/wallets/<user_id>
+ {"X-Api-Key": <string>}
+ JSON wallet data
+ curl -X GET {{ request.url_root }}usermanager/api/v1/wallets/<user_id> -H "X-Api-Key: {{ g.user.wallets[0].inkey }}"
+ GET /usermanager/api/v1/wallets<wallet_id>
+ {"X-Api-Key": <string>}
+ JSON a wallets transactions
+ curl -X GET {{ request.url_root }}usermanager/api/v1/wallets<wallet_id> -H "X-Api-Key: {{ g.user.wallets[0].inkey }}"
+ POST /usermanager/api/v1/users
+ {"X-Api-Key": <string>, "Content-type": "application/json"}
+ {"admin_id": <string>, "user_name": <string>, "wallet_name": <string>}
+ {"checking_id": <string>,"payment_request": <string>}
+ curl -X POST {{ request.url_root }}usermanager/api/v1/users -d '{"admin_id": "{{ g.user.id }}", "wallet_name": <string>, "user_name": <string>}' -H "X-Api-Key: {{ g.user.wallets[0].inkey }}" -H "Content-type: application/json"
+
+ POST /usermanager/api/v1/wallets
+ {"X-Api-Key": <string>, "Content-type": "application/json"}
+ {"user_id": <string>, "wallet_name": <string>, "admin_id": <string>}
+ {"checking_id": <string>,"payment_request": <string>}
+ curl -X POST {{ request.url_root }}usermanager/api/v1/wallets -d '{"user_id": <string>, "wallet_name": <string>, "admin_id": "{{ g.user.id }}"}' -H "X-Api-Key: {{ g.user.wallets[0].inkey }}" -H "Content-type: application/json"
+
+ DELETE /usermanager/api/v1/users/<user_id>
+ {"X-Api-Key": <string>}
+ curl -X DELETE {{ request.url_root }}usermanager/api/v1/users/<user_id> -H "X-Api-Key: {{ g.user.wallets[0].inkey }}"
+ DELETE /usermanager/api/v1/wallets/<wallet_id>
+ {"X-Api-Key": <string>}
+ curl -X DELETE {{ request.url_root }}usermanager/api/v1/wallets/<wallet_id> -H "X-Api-Key: {{ g.user.wallets[0].inkey }}"
+