1
0
Fork 0
forked from aiolabs/libra
libra/services.py
Padreug c174cda48d Rename Castle Accounting extension to Libra
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>
2026-05-05 10:24:46 +02:00

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