From 32039503100a6aefb2cfa4773b5d436384dfe798 Mon Sep 17 00:00:00 2001 From: calle <93376500+callebtc@users.noreply.github.com> Date: Fri, 6 Jan 2023 10:22:58 +0100 Subject: [PATCH 1/3] Revert "Revert "Revert "Revert "add UUID as id instead of sequential integer"""" --- lnbits/extensions/lnurlp/crud.py | 19 +++---- lnbits/extensions/lnurlp/migrations.py | 73 ++++++++++++++++++++++++++ lnbits/extensions/lnurlp/models.py | 2 +- lnbits/extensions/withdraw/crud.py | 2 +- 4 files changed, 82 insertions(+), 14 deletions(-) diff --git a/lnbits/extensions/lnurlp/crud.py b/lnbits/extensions/lnurlp/crud.py index d02ae80e..d5963b95 100644 --- a/lnbits/extensions/lnurlp/crud.py +++ b/lnbits/extensions/lnurlp/crud.py @@ -1,19 +1,18 @@ from typing import List, Optional, Union -from lnbits.db import SQLITE +from lnbits.helpers import urlsafe_short_hash from . import db from .models import CreatePayLinkData, PayLink async def create_pay_link(data: CreatePayLinkData, wallet_id: str) -> PayLink: + link_id = urlsafe_short_hash()[:6] - returning = "" if db.type == SQLITE else "RETURNING ID" - method = db.execute if db.type == SQLITE else db.fetchone - - result = await (method)( + result = await db.execute( f""" INSERT INTO lnurlp.pay_links ( + id, wallet, description, min, @@ -29,10 +28,10 @@ async def create_pay_link(data: CreatePayLinkData, wallet_id: str) -> PayLink: currency, fiat_base_multiplier ) - VALUES (?, ?, ?, ?, 0, 0, ?, ?, ?, ?, ?, ?, ?, ?) - {returning} + VALUES (?, ?, ?, ?, ?, 0, 0, ?, ?, ?, ?, ?, ?, ?, ?) """, ( + link_id, wallet_id, data.description, data.min, @@ -47,17 +46,13 @@ async def create_pay_link(data: CreatePayLinkData, wallet_id: str) -> PayLink: data.fiat_base_multiplier, ), ) - if db.type == SQLITE: - link_id = result._result_proxy.lastrowid - else: - link_id = result[0] link = await get_pay_link(link_id) assert link, "Newly created link couldn't be retrieved" return link -async def get_pay_link(link_id: int) -> Optional[PayLink]: +async def get_pay_link(link_id: str) -> Optional[PayLink]: row = await db.fetchone("SELECT * FROM lnurlp.pay_links WHERE id = ?", (link_id,)) return PayLink.from_row(row) if row else None diff --git a/lnbits/extensions/lnurlp/migrations.py b/lnbits/extensions/lnurlp/migrations.py index c4edd3aa..44df5ba9 100644 --- a/lnbits/extensions/lnurlp/migrations.py +++ b/lnbits/extensions/lnurlp/migrations.py @@ -68,3 +68,76 @@ async def m005_webhook_headers_and_body(db): """ await db.execute("ALTER TABLE lnurlp.pay_links ADD COLUMN webhook_headers TEXT;") await db.execute("ALTER TABLE lnurlp.pay_links ADD COLUMN webhook_body TEXT;") + + +async def m006_redux(db): + """ + Add UUID ID's to links and migrates existing data + """ + await db.execute("ALTER TABLE lnurlp.pay_links RENAME TO pay_links_old") + await db.execute( + f""" + CREATE TABLE lnurlp.pay_links ( + id TEXT PRIMARY KEY, + wallet TEXT NOT NULL, + description TEXT NOT NULL, + min INTEGER NOT NULL, + max INTEGER, + currency TEXT, + fiat_base_multiplier INTEGER DEFAULT 1, + served_meta INTEGER NOT NULL, + served_pr INTEGER NOT NULL, + webhook_url TEXT, + success_text TEXT, + success_url TEXT, + comment_chars INTEGER DEFAULT 0, + webhook_headers TEXT, + webhook_body TEXT + ); + """ + ) + + for row in [ + list(row) for row in await db.fetchall("SELECT * FROM lnurlp.pay_links_old") + ]: + await db.execute( + """ + INSERT INTO lnurlp.pay_links ( + id, + wallet, + description, + min, + served_meta, + served_pr, + webhook_url, + success_text, + success_url, + currency, + comment_chars, + max, + fiat_base_multiplier, + webhook_headers, + webhook_body + ) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + ( + row[0], + row[1], + row[2], + row[3], + row[4], + row[5], + row[6], + row[7], + row[8], + row[9], + row[10], + row[11], + row[12], + row[13], + row[14], + ), + ) + + await db.execute("DROP TABLE lnurlp.pay_links_old") diff --git a/lnbits/extensions/lnurlp/models.py b/lnbits/extensions/lnurlp/models.py index 2cb4d0ab..42ea2926 100644 --- a/lnbits/extensions/lnurlp/models.py +++ b/lnbits/extensions/lnurlp/models.py @@ -26,7 +26,7 @@ class CreatePayLinkData(BaseModel): class PayLink(BaseModel): - id: int + id: str wallet: str description: str min: float diff --git a/lnbits/extensions/withdraw/crud.py b/lnbits/extensions/withdraw/crud.py index 68603f0a..83dd0593 100644 --- a/lnbits/extensions/withdraw/crud.py +++ b/lnbits/extensions/withdraw/crud.py @@ -12,7 +12,7 @@ from .models import CreateWithdrawData, HashCheck, WithdrawLink async def create_withdraw_link( data: CreateWithdrawData, wallet_id: str ) -> WithdrawLink: - link_id = urlsafe_short_hash() + link_id = urlsafe_short_hash()[:6] available_links = ",".join([str(i) for i in range(data.uses)]) await db.execute( """ From 6cd5e44ad62bb4ce27e83e72fb2346862894cd37 Mon Sep 17 00:00:00 2001 From: callebtc <93376500+callebtc@users.noreply.github.com> Date: Fri, 6 Jan 2023 10:28:50 +0100 Subject: [PATCH 2/3] use bigint --- lnbits/extensions/lnurlp/migrations.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lnbits/extensions/lnurlp/migrations.py b/lnbits/extensions/lnurlp/migrations.py index 44df5ba9..128f62ac 100644 --- a/lnbits/extensions/lnurlp/migrations.py +++ b/lnbits/extensions/lnurlp/migrations.py @@ -81,8 +81,8 @@ async def m006_redux(db): id TEXT PRIMARY KEY, wallet TEXT NOT NULL, description TEXT NOT NULL, - min INTEGER NOT NULL, - max INTEGER, + min {db.big_int} NOT NULL, + max {db.big_int}, currency TEXT, fiat_base_multiplier INTEGER DEFAULT 1, served_meta INTEGER NOT NULL, From 407128fd61a77bb2588f711d82974cad5ec8d35d Mon Sep 17 00:00:00 2001 From: callebtc <93376500+callebtc@users.noreply.github.com> Date: Fri, 6 Jan 2023 11:13:25 +0100 Subject: [PATCH 3/3] fix migration for postgres --- lnbits/extensions/lnurlp/migrations.py | 133 +++++++++++++------------ 1 file changed, 69 insertions(+), 64 deletions(-) diff --git a/lnbits/extensions/lnurlp/migrations.py b/lnbits/extensions/lnurlp/migrations.py index 128f62ac..1ec85eb0 100644 --- a/lnbits/extensions/lnurlp/migrations.py +++ b/lnbits/extensions/lnurlp/migrations.py @@ -72,72 +72,77 @@ async def m005_webhook_headers_and_body(db): async def m006_redux(db): """ - Add UUID ID's to links and migrates existing data + Migrate ID column type to string for UUIDs and migrate existing data """ - await db.execute("ALTER TABLE lnurlp.pay_links RENAME TO pay_links_old") - await db.execute( - f""" - CREATE TABLE lnurlp.pay_links ( - id TEXT PRIMARY KEY, - wallet TEXT NOT NULL, - description TEXT NOT NULL, - min {db.big_int} NOT NULL, - max {db.big_int}, - currency TEXT, - fiat_base_multiplier INTEGER DEFAULT 1, - served_meta INTEGER NOT NULL, - served_pr INTEGER NOT NULL, - webhook_url TEXT, - success_text TEXT, - success_url TEXT, - comment_chars INTEGER DEFAULT 0, - webhook_headers TEXT, - webhook_body TEXT - ); - """ - ) - - for row in [ - list(row) for row in await db.fetchall("SELECT * FROM lnurlp.pay_links_old") - ]: + # we can simply change the column type for postgres + if db.type != "SQLITE": + await db.execute("ALTER TABLE lnurlp.pay_links ALTER COLUMN id TYPE TEXT;") + else: + # but we have to do this for sqlite + await db.execute("ALTER TABLE lnurlp.pay_links RENAME TO pay_links_old") await db.execute( + f""" + CREATE TABLE lnurlp.pay_links ( + id TEXT PRIMARY KEY, + wallet TEXT NOT NULL, + description TEXT NOT NULL, + min {db.big_int} NOT NULL, + max {db.big_int}, + currency TEXT, + fiat_base_multiplier INTEGER DEFAULT 1, + served_meta INTEGER NOT NULL, + served_pr INTEGER NOT NULL, + webhook_url TEXT, + success_text TEXT, + success_url TEXT, + comment_chars INTEGER DEFAULT 0, + webhook_headers TEXT, + webhook_body TEXT + ); """ - INSERT INTO lnurlp.pay_links ( - id, - wallet, - description, - min, - served_meta, - served_pr, - webhook_url, - success_text, - success_url, - currency, - comment_chars, - max, - fiat_base_multiplier, - webhook_headers, - webhook_body - ) - VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - """, - ( - row[0], - row[1], - row[2], - row[3], - row[4], - row[5], - row[6], - row[7], - row[8], - row[9], - row[10], - row[11], - row[12], - row[13], - row[14], - ), ) - await db.execute("DROP TABLE lnurlp.pay_links_old") + for row in [ + list(row) for row in await db.fetchall("SELECT * FROM lnurlp.pay_links_old") + ]: + await db.execute( + """ + INSERT INTO lnurlp.pay_links ( + id, + wallet, + description, + min, + served_meta, + served_pr, + webhook_url, + success_text, + success_url, + currency, + comment_chars, + max, + fiat_base_multiplier, + webhook_headers, + webhook_body + ) + VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + """, + ( + row[0], + row[1], + row[2], + row[3], + row[4], + row[5], + row[6], + row[7], + row[8], + row[9], + row[10], + row[11], + row[12], + row[13], + row[14], + ), + ) + + await db.execute("DROP TABLE lnurlp.pay_links_old")