From 2118c8c745df3405749a122de8954b90d9a2e655 Mon Sep 17 00:00:00 2001 From: Tiago Vasconcelos Date: Mon, 3 Mar 2025 17:01:32 +0000 Subject: [PATCH] Add a created at field (#77) --- crud.py | 6 ++++- migrations.py | 31 +++++++++++++++++++++++++ models.py | 3 +++ static/js/index.js | 46 +++++++++++++++++++++++++++++++++++-- templates/lnurlp/index.html | 27 +++++++--------------- 5 files changed, 91 insertions(+), 22 deletions(-) diff --git a/crud.py b/crud.py index bc71ac0..5727da7 100644 --- a/crud.py +++ b/crud.py @@ -1,3 +1,4 @@ +from datetime import datetime, timezone from typing import List, Optional, Union from lnbits.db import Database @@ -39,10 +40,10 @@ async def get_pay_link_by_username(username: str) -> Optional[PayLink]: async def create_pay_link(data: CreatePayLinkData) -> PayLink: - link_id = urlsafe_short_hash()[:6] assert data.wallet, "Wallet is required" + now = datetime.now(timezone.utc) link = PayLink( id=link_id, @@ -63,6 +64,8 @@ async def create_pay_link(data: CreatePayLinkData) -> PayLink: currency=data.currency, comment_chars=data.comment_chars, fiat_base_multiplier=data.fiat_base_multiplier, + created_at=now, + updated_at=now, ) await db.insert("lnurlp.pay_links", link) @@ -96,6 +99,7 @@ async def get_pay_links(wallet_ids: Union[str, List[str]]) -> List[PayLink]: async def update_pay_link(link: PayLink) -> PayLink: + link.updated_at = datetime.now(timezone.utc) await db.update("lnurlp.pay_links", link) return link diff --git a/migrations.py b/migrations.py index 66ce5c6..8de7e82 100644 --- a/migrations.py +++ b/migrations.py @@ -1,3 +1,8 @@ +from time import time + +from lnbits.db import Connection + + async def m001_initial(db): """ Initial pay table. @@ -181,3 +186,29 @@ async def m010_add_pay_link_domain(db): Add domain to pay links """ await db.execute("ALTER TABLE lnurlp.pay_links ADD COLUMN domain TEXT;") + + +async def m011_add_created_at(db: Connection): + """ + Add created_at to pay links + """ + + await db.execute( + f"""ALTER TABLE lnurlp.pay_links ADD COLUMN + created_at TIMESTAMP DEFAULT {db.timestamp_column_default}""" + ) + await db.execute( + f"""ALTER TABLE lnurlp.pay_links ADD COLUMN + updated_at TIMESTAMP DEFAULT {db.timestamp_column_default}""" + ) + + now = int(time()) + await db.execute( + f""" + UPDATE lnurlp.pay_links + SET created_at = {db.timestamp_placeholder('now')}, + updated_at = {db.timestamp_placeholder('now')} + WHERE created_at IS NULL AND updated_at IS NULL + """, + {"now": now}, + ) diff --git a/models.py b/models.py index e6134b2..39b247e 100644 --- a/models.py +++ b/models.py @@ -1,4 +1,5 @@ import json +from datetime import datetime from typing import Optional from fastapi import Query, Request @@ -59,6 +60,8 @@ class PayLink(BaseModel): comment_chars: int max: float fiat_base_multiplier: int + created_at: datetime + updated_at: datetime def lnurl(self, req: Request) -> str: url = req.url_for("lnurlp.api_lnurl_response", link_id=self.id) diff --git a/static/js/index.js b/static/js/index.js index c80eb60..8562385 100644 --- a/static/js/index.js +++ b/static/js/index.js @@ -9,9 +9,9 @@ const locationPath = [ const mapPayLink = obj => { obj._data = _.clone(obj) - obj.date = LNbits.utils.formatDate(obj.time) + obj.created_at = LNbits.utils.formatDateString(obj.created_at) + obj.updated_at = LNbits.utils.formatDateString(obj.updated_at) - obj.amount = new Intl.NumberFormat(LOCALE).format(obj.amount) obj.print_url = [locationPath, 'print/', obj.id].join('') obj.pay_url = [locationPath, 'link/', obj.id].join('') return obj @@ -39,6 +39,48 @@ window.app = Vue.createApp({ fiatRates: {}, payLinks: [], payLinksTable: { + columns: [ + { + name: 'created_at', + label: 'Created', + align: 'left', + field: 'created_at', + sortable: true + }, + { + name: 'description', + label: 'Description', + align: 'left', + field: 'description' + }, + { + name: 'amount', + label: 'Amount', + align: 'left', + format: (_, row) => { + const min = row.min + const max = row.max + if (min === max) return `${min}` + return `${min} - ${max}` + } + }, + { + name: 'currency', + label: 'Currency', + align: 'left', + field: 'currency', + format: val => val ?? 'sat' + }, + { + name: 'username', + label: 'Username', + align: 'left', + field: 'username', + sortable: true, + format: val => val ?? 'None', + classes: val => (val ? 'text-normal' : 'text-grey') + } + ], pagination: { rowsPerPage: 10 } diff --git a/templates/lnurlp/index.html b/templates/lnurlp/index.html index b37a04e..33c9125 100644 --- a/templates/lnurlp/index.html +++ b/templates/lnurlp/index.html @@ -26,16 +26,16 @@ dense flat :rows="payLinks" + :columns="payLinksTable.columns" row-key="id" v-model:pagination="payLinksTable.pagination" >