Full identifier rename: module path lnbits.extensions.castle →
lnbits.extensions.libra, DB ext_castle → ext_libra, URL prefix
/castle/ → /libra/, manifest id castle → libra, fava ledger slug
default castle-ledger → libra-ledger, Beancount source metadata
castle-api → libra-api and link prefixes castle-{entry,tx}- →
libra-{entry,tx}-, column castle_wallet_id → libra_wallet_id, all
Python/JS/HTML identifiers (castle_ext, CastleSettings,
castle_reference, castleWalletConfigured, etc.).
Display name "Castle Accounting" → "Libra" (the scales/balance
metaphor — fits double-entry bookkeeping).
No backward compat: production hosts will be force-updated. Old
castle-prefixed Beancount metadata in existing Fava ledgers is
historical; new entries use libra-* prefixes going forward.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
81 lines
2.8 KiB
Python
81 lines
2.8 KiB
Python
from .crud import (
|
|
create_libra_settings,
|
|
create_user_wallet_settings,
|
|
get_libra_settings,
|
|
get_or_create_user_account,
|
|
get_user_wallet_settings,
|
|
update_libra_settings,
|
|
update_user_wallet_settings,
|
|
)
|
|
from .models import AccountType, LibraSettings, UserWalletSettings
|
|
|
|
|
|
async def get_settings(user_id: str) -> LibraSettings:
|
|
settings = await get_libra_settings(user_id)
|
|
if not settings:
|
|
settings = await create_libra_settings(user_id, LibraSettings())
|
|
return settings
|
|
|
|
|
|
async def update_settings(user_id: str, data: LibraSettings) -> LibraSettings:
|
|
from loguru import logger
|
|
|
|
from .fava_client import init_fava_client
|
|
|
|
settings = await get_libra_settings(user_id)
|
|
if not settings:
|
|
settings = await create_libra_settings(user_id, data)
|
|
else:
|
|
settings = await update_libra_settings(user_id, data)
|
|
|
|
# Reinitialize Fava client with new settings
|
|
try:
|
|
init_fava_client(
|
|
fava_url=settings.fava_url,
|
|
ledger_slug=settings.fava_ledger_slug,
|
|
timeout=settings.fava_timeout,
|
|
)
|
|
logger.info(
|
|
f"Fava client reinitialized: {settings.fava_url}/{settings.fava_ledger_slug}"
|
|
)
|
|
except Exception as e:
|
|
logger.error(f"Failed to reinitialize Fava client: {e}")
|
|
|
|
return settings
|
|
|
|
|
|
async def get_user_wallet(user_id: str) -> UserWalletSettings:
|
|
settings = await get_user_wallet_settings(user_id)
|
|
if not settings:
|
|
settings = await create_user_wallet_settings(user_id, UserWalletSettings())
|
|
return settings
|
|
|
|
|
|
async def update_user_wallet(
|
|
user_id: str, data: UserWalletSettings
|
|
) -> UserWalletSettings:
|
|
from loguru import logger
|
|
|
|
logger.info(f"[WALLET UPDATE] Starting update_user_wallet for user {user_id[:8]}")
|
|
|
|
settings = await get_user_wallet_settings(user_id)
|
|
if not settings:
|
|
logger.info(f"[WALLET UPDATE] Creating new wallet settings for user {user_id[:8]}")
|
|
settings = await create_user_wallet_settings(user_id, data)
|
|
else:
|
|
logger.info(f"[WALLET UPDATE] Updating existing wallet settings for user {user_id[:8]}")
|
|
settings = await update_user_wallet_settings(user_id, data)
|
|
|
|
# Proactively create core user accounts when wallet is configured
|
|
# This ensures all users have a consistent account structure from the start
|
|
logger.info(f"[WALLET UPDATE] Creating LIABILITY account for user {user_id[:8]}")
|
|
await get_or_create_user_account(
|
|
user_id, AccountType.LIABILITY, "Accounts Payable"
|
|
)
|
|
logger.info(f"[WALLET UPDATE] Creating ASSET account for user {user_id[:8]}")
|
|
await get_or_create_user_account(
|
|
user_id, AccountType.ASSET, "Accounts Receivable"
|
|
)
|
|
logger.info(f"[WALLET UPDATE] Completed update_user_wallet for user {user_id[:8]}")
|
|
|
|
return settings
|