diff --git a/crud.py b/crud.py index 0976e72..cd610b1 100644 --- a/crud.py +++ b/crud.py @@ -424,6 +424,26 @@ async def get_user_wallet_settings(user_id: str) -> Optional[UserWalletSettings] ) +async def get_user_wallet_settings_by_prefix( + user_id_prefix: str, +) -> Optional[StoredUserWalletSettings]: + """ + Get user wallet settings by user ID prefix (for truncated 8-char IDs from Beancount). + + Beancount accounts use truncated user IDs (first 8 chars), but the database + stores full UUIDs. This function looks up by prefix to bridge the gap. + """ + return await db.fetchone( + """ + SELECT * FROM user_wallet_settings + WHERE id LIKE :prefix || '%' + LIMIT 1 + """, + {"prefix": user_id_prefix}, + StoredUserWalletSettings, + ) + + async def update_user_wallet_settings( user_id: str, data: UserWalletSettings ) -> UserWalletSettings: diff --git a/static/js/index.js b/static/js/index.js index 3c8d9b7..bd52e39 100644 --- a/static/js/index.js +++ b/static/js/index.js @@ -1424,7 +1424,7 @@ window.app = Vue.createApp({ maxAmount: maxAmountSats, // Positive sats amount castle owes maxAmountFiat: maxAmountFiat, // EUR or other fiat amount (positive) fiatCurrency: fiatCurrency, - amount: fiatCurrency ? maxAmountFiat : maxAmountSats, // Default to fiat if available + amount: maxAmountSats, // Default to sats since lightning is the default payment method payment_method: 'lightning', // Default to lightning for paying description: '', reference: '', @@ -1456,8 +1456,9 @@ window.app = Vue.createApp({ memo: `Payment from Castle to ${this.payUserDialog.username}` } ) + console.log(invoiceResponse) - const paymentRequest = invoiceResponse.data.payment_request + const paymentRequest = invoiceResponse.data.bolt11 // Pay the invoice from Castle's wallet const paymentResponse = await LNbits.api.request( diff --git a/views_api.py b/views_api.py index dc4d1d1..594b26b 100644 --- a/views_api.py +++ b/views_api.py @@ -2113,7 +2113,7 @@ async def api_pay_user( if "meta" not in entry: entry["meta"] = {} entry["meta"]["payment-method"] = data.payment_method - entry["meta"]["paid-by"] = wallet.wallet.user + entry["meta"]["paid-by"] = auth.user_id if data.txid: entry["meta"]["txid"] = data.txid @@ -2174,10 +2174,24 @@ async def api_get_user_wallet( user_id: str, auth: AuthContext = Depends(require_super_user), ) -> dict: - """Get user's wallet settings (super user only)""" + """Get user's wallet settings (super user only) + Supports both full UUIDs and truncated 8-char IDs (from Beancount accounts). + """ + from .crud import get_user_wallet_settings_by_prefix + + # First try exact match user_wallet = await get_user_wallet(user_id) - if not user_wallet: + + # If not found and user_id looks like a truncated ID (8 chars), try prefix match + if not user_wallet or not user_wallet.user_wallet_id: + if len(user_id) <= 8: + stored_wallet = await get_user_wallet_settings_by_prefix(user_id) + if stored_wallet and stored_wallet.user_wallet_id: + user_wallet = stored_wallet + user_id = stored_wallet.id # Use the full ID + + if not user_wallet or not user_wallet.user_wallet_id: return {"user_id": user_id, "user_wallet_id": None} # Get invoice key for the user's wallet (needed to generate invoices)