2020-11-21 22:04:39 +01:00
|
|
|
from sqlalchemy.exc import OperationalError # type: ignore
|
2020-09-04 03:39:52 +02:00
|
|
|
|
|
|
|
|
2020-11-21 22:04:39 +01:00
|
|
|
async def m000_create_migrations_table(db):
|
|
|
|
await db.execute(
|
2020-09-04 03:39:52 +02:00
|
|
|
"""
|
|
|
|
CREATE TABLE dbversions (
|
|
|
|
db TEXT PRIMARY KEY,
|
|
|
|
version INT NOT NULL
|
|
|
|
)
|
|
|
|
"""
|
|
|
|
)
|
2020-04-16 15:23:38 +02:00
|
|
|
|
|
|
|
|
2020-11-21 22:04:39 +01:00
|
|
|
async def m001_initial(db):
|
2020-04-16 15:23:38 +02:00
|
|
|
"""
|
|
|
|
Initial LNbits tables.
|
|
|
|
"""
|
2020-11-21 22:04:39 +01:00
|
|
|
await db.execute(
|
2020-04-17 21:13:57 +02:00
|
|
|
"""
|
2020-04-16 15:23:38 +02:00
|
|
|
CREATE TABLE IF NOT EXISTS accounts (
|
|
|
|
id TEXT PRIMARY KEY,
|
|
|
|
email TEXT,
|
|
|
|
pass TEXT
|
|
|
|
);
|
2020-04-17 21:13:57 +02:00
|
|
|
"""
|
|
|
|
)
|
2020-11-21 22:04:39 +01:00
|
|
|
await db.execute(
|
2020-04-17 21:13:57 +02:00
|
|
|
"""
|
2020-04-16 15:23:38 +02:00
|
|
|
CREATE TABLE IF NOT EXISTS extensions (
|
|
|
|
user TEXT NOT NULL,
|
|
|
|
extension TEXT NOT NULL,
|
|
|
|
active BOOLEAN DEFAULT 0,
|
|
|
|
|
|
|
|
UNIQUE (user, extension)
|
|
|
|
);
|
2020-04-17 21:13:57 +02:00
|
|
|
"""
|
|
|
|
)
|
2020-11-21 22:04:39 +01:00
|
|
|
await db.execute(
|
2020-04-17 21:13:57 +02:00
|
|
|
"""
|
2020-04-16 15:23:38 +02:00
|
|
|
CREATE TABLE IF NOT EXISTS wallets (
|
|
|
|
id TEXT PRIMARY KEY,
|
|
|
|
name TEXT NOT NULL,
|
|
|
|
user TEXT NOT NULL,
|
|
|
|
adminkey TEXT NOT NULL,
|
|
|
|
inkey TEXT
|
|
|
|
);
|
2020-04-17 21:13:57 +02:00
|
|
|
"""
|
|
|
|
)
|
2020-11-21 22:04:39 +01:00
|
|
|
await db.execute(
|
2020-04-17 21:13:57 +02:00
|
|
|
"""
|
2020-04-16 15:23:38 +02:00
|
|
|
CREATE TABLE IF NOT EXISTS apipayments (
|
|
|
|
payhash TEXT NOT NULL,
|
|
|
|
amount INTEGER NOT NULL,
|
|
|
|
fee INTEGER NOT NULL DEFAULT 0,
|
|
|
|
wallet TEXT NOT NULL,
|
|
|
|
pending BOOLEAN NOT NULL,
|
|
|
|
memo TEXT,
|
|
|
|
time TIMESTAMP NOT NULL DEFAULT (strftime('%s', 'now')),
|
|
|
|
|
|
|
|
UNIQUE (wallet, payhash)
|
|
|
|
);
|
2020-04-17 21:13:57 +02:00
|
|
|
"""
|
|
|
|
)
|
2020-08-19 18:53:27 +02:00
|
|
|
|
2020-11-21 22:04:39 +01:00
|
|
|
await db.execute(
|
2020-04-17 21:13:57 +02:00
|
|
|
"""
|
2020-04-16 15:23:38 +02:00
|
|
|
CREATE VIEW IF NOT EXISTS balances AS
|
|
|
|
SELECT wallet, COALESCE(SUM(s), 0) AS balance FROM (
|
|
|
|
SELECT wallet, SUM(amount) AS s -- incoming
|
|
|
|
FROM apipayments
|
|
|
|
WHERE amount > 0 AND pending = 0 -- don't sum pending
|
|
|
|
GROUP BY wallet
|
|
|
|
UNION ALL
|
|
|
|
SELECT wallet, SUM(amount + fee) AS s -- outgoing, sum fees
|
|
|
|
FROM apipayments
|
|
|
|
WHERE amount < 0 -- do sum pending
|
|
|
|
GROUP BY wallet
|
|
|
|
)
|
|
|
|
GROUP BY wallet;
|
2020-04-17 21:13:57 +02:00
|
|
|
"""
|
|
|
|
)
|
2020-04-16 15:23:38 +02:00
|
|
|
|
2020-08-19 18:53:27 +02:00
|
|
|
|
2020-11-21 22:04:39 +01:00
|
|
|
async def m002_add_fields_to_apipayments(db):
|
2020-08-19 18:53:27 +02:00
|
|
|
"""
|
2020-09-01 03:12:46 +02:00
|
|
|
Adding fields to apipayments for better accounting,
|
|
|
|
and renaming payhash to checking_id since that is what it really is.
|
|
|
|
"""
|
2020-09-04 03:39:52 +02:00
|
|
|
try:
|
2020-11-21 22:04:39 +01:00
|
|
|
await db.execute("ALTER TABLE apipayments RENAME COLUMN payhash TO checking_id")
|
|
|
|
await db.execute("ALTER TABLE apipayments ADD COLUMN hash TEXT")
|
|
|
|
await db.execute("CREATE INDEX by_hash ON apipayments (hash)")
|
|
|
|
await db.execute("ALTER TABLE apipayments ADD COLUMN preimage TEXT")
|
|
|
|
await db.execute("ALTER TABLE apipayments ADD COLUMN bolt11 TEXT")
|
|
|
|
await db.execute("ALTER TABLE apipayments ADD COLUMN extra TEXT")
|
2020-09-02 17:44:54 +02:00
|
|
|
|
2020-09-04 03:39:52 +02:00
|
|
|
import json
|
2020-09-02 17:44:54 +02:00
|
|
|
|
2020-11-21 22:04:39 +01:00
|
|
|
rows = await (await db.execute("SELECT * FROM apipayments")).fetchall()
|
2020-09-04 03:39:52 +02:00
|
|
|
for row in rows:
|
|
|
|
if not row["memo"] or not row["memo"].startswith("#"):
|
|
|
|
continue
|
2020-04-16 15:23:38 +02:00
|
|
|
|
2020-09-04 03:39:52 +02:00
|
|
|
for ext in ["withdraw", "events", "lnticket", "paywall", "tpos"]:
|
|
|
|
prefix = "#" + ext + " "
|
|
|
|
if row["memo"].startswith(prefix):
|
|
|
|
new = row["memo"][len(prefix) :]
|
2020-11-21 22:04:39 +01:00
|
|
|
await db.execute(
|
2020-09-04 03:39:52 +02:00
|
|
|
"""
|
|
|
|
UPDATE apipayments SET extra = ?, memo = ?
|
|
|
|
WHERE checking_id = ? AND memo = ?
|
|
|
|
""",
|
|
|
|
(json.dumps({"tag": ext}), new, row["checking_id"], row["memo"]),
|
|
|
|
)
|
|
|
|
break
|
2020-11-21 22:04:39 +01:00
|
|
|
except OperationalError:
|
2020-09-04 03:39:52 +02:00
|
|
|
# this is necessary now because it may be the case that this migration will
|
|
|
|
# run twice in some environments.
|
|
|
|
# catching errors like this won't be necessary in anymore now that we
|
|
|
|
# keep track of db versions so no migration ever runs twice.
|
|
|
|
pass
|