diff --git a/lnbits/extensions/paywall/config.json b/lnbits/extensions/paywall/config.json
index 5db7680d..d08ce7ba 100644
--- a/lnbits/extensions/paywall/config.json
+++ b/lnbits/extensions/paywall/config.json
@@ -1,6 +1,6 @@
{
"name": "Paywall",
"short_description": "Create paywalls for content",
- "icon": "vpn_lock",
+ "icon": "policy",
"contributors": ["eillarra"]
}
diff --git a/lnbits/extensions/paywall/crud.py b/lnbits/extensions/paywall/crud.py
index 529913f3..532f6438 100644
--- a/lnbits/extensions/paywall/crud.py
+++ b/lnbits/extensions/paywall/crud.py
@@ -6,15 +6,17 @@ from lnbits.helpers import urlsafe_short_hash
from .models import Paywall
-def create_paywall(*, wallet_id: str, url: str, memo: str, amount: int) -> Paywall:
+def create_paywall(
+ *, wallet_id: str, url: str, memo: str, description: Optional[str] = None, amount: int = 0, remembers: bool = True
+) -> Paywall:
with open_ext_db("paywall") as db:
paywall_id = urlsafe_short_hash()
db.execute(
"""
- INSERT INTO paywalls (id, wallet, secret, url, memo, amount)
- VALUES (?, ?, ?, ?, ?, ?)
+ INSERT INTO paywalls (id, wallet, url, memo, description, amount, remembers)
+ VALUES (?, ?, ?, ?, ?, ?, ?)
""",
- (paywall_id, wallet_id, urlsafe_short_hash(), url, memo, amount),
+ (paywall_id, wallet_id, url, memo, description, amount, int(remembers)),
)
return get_paywall(paywall_id)
@@ -24,7 +26,7 @@ def get_paywall(paywall_id: str) -> Optional[Paywall]:
with open_ext_db("paywall") as db:
row = db.fetchone("SELECT * FROM paywalls WHERE id = ?", (paywall_id,))
- return Paywall(**row) if row else None
+ return Paywall.from_row(row) if row else None
def get_paywalls(wallet_ids: Union[str, List[str]]) -> List[Paywall]:
@@ -35,7 +37,7 @@ def get_paywalls(wallet_ids: Union[str, List[str]]) -> List[Paywall]:
q = ",".join(["?"] * len(wallet_ids))
rows = db.fetchall(f"SELECT * FROM paywalls WHERE wallet IN ({q})", (*wallet_ids,))
- return [Paywall(**row) for row in rows]
+ return [Paywall.from_row(row) for row in rows]
def delete_paywall(paywall_id: str) -> None:
diff --git a/lnbits/extensions/paywall/migrations.py b/lnbits/extensions/paywall/migrations.py
index 23fca00a..aa63d0a9 100644
--- a/lnbits/extensions/paywall/migrations.py
+++ b/lnbits/extensions/paywall/migrations.py
@@ -1,3 +1,5 @@
+from sqlite3 import OperationalError
+
from lnbits.db import open_ext_db
@@ -20,6 +22,52 @@ def m001_initial(db):
)
+def m002_redux(db):
+ """
+ Creates an improved paywalls table and migrates the existing data.
+ """
+ try:
+ db.execute("SELECT remembers FROM paywalls")
+
+ except OperationalError:
+ db.execute("ALTER TABLE paywalls RENAME TO paywalls_old")
+ db.execute(
+ """
+ CREATE TABLE IF NOT EXISTS paywalls (
+ id TEXT PRIMARY KEY,
+ wallet TEXT NOT NULL,
+ url TEXT NOT NULL,
+ memo TEXT NOT NULL,
+ description TEXT NULL,
+ amount INTEGER DEFAULT 0,
+ time TIMESTAMP NOT NULL DEFAULT (strftime('%s', 'now')),
+ remembers INTEGER DEFAULT 0,
+ extras TEXT NULL
+ );
+ """
+ )
+ db.execute("CREATE INDEX IF NOT EXISTS wallet_idx ON paywalls (wallet)")
+
+ for row in [list(row) for row in db.fetchall("SELECT * FROM paywalls_old")]:
+ db.execute(
+ """
+ INSERT INTO paywalls (
+ id,
+ wallet,
+ url,
+ memo,
+ amount,
+ time
+ )
+ VALUES (?, ?, ?, ?, ?, ?)
+ """,
+ (row[0], row[1], row[3], row[4], row[5], row[6]),
+ )
+
+ db.execute("DROP TABLE paywalls_old")
+
+
def migrate():
with open_ext_db("paywall") as db:
m001_initial(db)
+ m002_redux(db)
diff --git a/lnbits/extensions/paywall/models.py b/lnbits/extensions/paywall/models.py
index dbfa0afd..d7f2451d 100644
--- a/lnbits/extensions/paywall/models.py
+++ b/lnbits/extensions/paywall/models.py
@@ -1,11 +1,23 @@
-from typing import NamedTuple
+import json
+
+from sqlite3 import Row
+from typing import NamedTuple, Optional
class Paywall(NamedTuple):
id: str
wallet: str
- secret: str
url: str
memo: str
+ description: str
amount: int
time: int
+ remembers: bool
+ extras: Optional[dict]
+
+ @classmethod
+ def from_row(cls, row: Row) -> "Paywall":
+ data = dict(row)
+ data["remembers"] = bool(data["remembers"])
+ data["extras"] = json.loads(data["extras"]) if data["extras"] else None
+ return cls(**data)
diff --git a/lnbits/extensions/paywall/templates/paywall/_api_docs.html b/lnbits/extensions/paywall/templates/paywall/_api_docs.html
index 74b4cb37..eda9ba18 100644
--- a/lnbits/extensions/paywall/templates/paywall/_api_docs.html
+++ b/lnbits/extensions/paywall/templates/paywall/_api_docs.html
@@ -6,12 +6,106 @@
>
GET /paywall/api/v1/paywalls
+ Headers
+ {"X-Api-Key": <invoice_key>}
+ Body (application/json)
+
+ Returns 200 OK (application/json)
+
+ [<paywall_object>, ...]
+ Curl example
+ curl -X GET {{ request.url_root }}paywall/api/v1/paywalls -H
+ "X-Api-Key: {{ g.user.wallets[0].inkey }}"
+
+ POST
+ /paywall/api/v1/paywalls
+ Headers
+ {"X-Api-Key": <admin_key>}
+ Body (application/json)
+ {"amount": <integer>, "description": <string>,
+ "memo": <string>, "remembers": <boolean>,
+ "url": <string>}
+
+ Returns 201 CREATED (application/json)
+
+ {"amount": <integer>, "description": <string>,
+ "id": <string>, "memo": <string>,
+ "remembers": <boolean>, "time": <int>,
+ "url": <string>, "wallet": <string>}
+ Curl example
+ curl -X POST {{ request.url_root }}paywall/api/v1/paywalls -d
+ '{"url": <string>, "memo": <string>,
+ "description": <string>, "amount": <integer>,
+ "remembers": <boolean>}' -H
+ "Content-type: application/json" -H "X-Api-Key: {{
+ g.user.wallets[0].adminkey }}"
+
+ POST
+ /paywall/api/v1/paywalls/<paywall_id>/invoice
+ Body (application/json)
+ {"amount": <integer>}
+
+ Returns 201 CREATED (application/json)
+
+ {"checking_id": <string>, "payment_request": <string>}
+ Curl example
+ curl -X POST {{ request.url_root }}paywall/api/v1/paywalls/<paywall_id>/invoice -d
+ '{"amount": <integer>}' -H
+ "Content-type: application/json"
+
+ POST
+ /paywall/api/v1/paywalls/<paywall_id>/check_invoice
+ Body (application/json)
+ {"checking_id": <string>}
+
+ Returns 200 OK (application/json)
+
+ {"paid": false}
+ {"paid": true, "url": <string>, "remembers": <boolean>}
+ Curl example
+ curl -X POST {{ request.url_root }}paywall/api/v1/paywalls/<paywall_id>/check_invoice -d
+ '{"checking_id": <string>}' -H
+ "Content-type: application/json"
+
+ DELETE
+ /paywall/api/v1/paywalls/<paywall_id>
+ Headers
+ {"X-Api-Key": <admin_key>}
+ Returns 204 NO CONTENT
+
+ Curl example
+ curl -X DELETE {{ request.url_root
+ }}paywall/api/v1/paywalls/<paywall_id> -H "X-Api-Key: {{
+ g.user.wallets[0].adminkey }}"
+
+
{{ paywall.description }}
+ {% endif %} +
You can access the URL behind this paywall:
{% raw %}{{ redirectUrl }}{% endraw %}
@@ -39,13 +56,6 @@