refactor(api): split views_api.py into a package of domain modules
Pure move — no logic changes. The 4,100-line single file becomes views_api/ with one module per domain (accounts, entries, payments, settings_reports, reconciliation, permissions, admin), each registering full literal paths on its own APIRouter; __init__ builds the combined libra_api_router so libra/__init__.py is untouched. Shared imports/helpers live in views_api/_shared.py; _extract_entry_id and _SYSTEM_LINK_PREFIXES move to beancount_format.py (they are pure entry-dict parsing). Route behavior is pinned by tests/test_route_table.py: the 73-route set is unchanged, and the two order-sensitive families (the shadowed /accounts/hierarchy wart — deliberately preserved here, fixed in the next commit — and the admin sync literal/param pair) keep their relative order inside a single module each. Addresses CODE-REVIEW-2026-06 structure findings (views_api monolith). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
9e06fa0b2a
commit
a7d7740a3a
12 changed files with 4233 additions and 4130 deletions
|
|
@ -310,6 +310,38 @@ def format_posting_simple(
|
|||
}
|
||||
|
||||
|
||||
_SYSTEM_LINK_PREFIXES = ("exp-", "rcv-", "inc-", "ln-", "libra-")
|
||||
|
||||
|
||||
def _extract_entry_id(entry: dict) -> Optional[str]:
|
||||
"""Resolve the canonical libra entry id for a Fava transaction.
|
||||
|
||||
The ``entry-id`` transaction metadata is the single source of truth —
|
||||
written by every libra entry formatter since dfdcc44. Ledger history
|
||||
predating it carries only a ``libra-{id}`` link; parse that as a
|
||||
fallback so old entries still resolve.
|
||||
|
||||
Returns None when no id can be determined (e.g. settlement/payment
|
||||
transactions, which are not approvable).
|
||||
"""
|
||||
meta = entry.get("meta", {})
|
||||
entry_id = meta.get("entry-id")
|
||||
if entry_id:
|
||||
return str(entry_id)
|
||||
|
||||
# Legacy fallback: pre-entry-id ledger history (single libra-{id} link)
|
||||
links = entry.get("links", [])
|
||||
if isinstance(links, (list, set)):
|
||||
for link in links:
|
||||
if isinstance(link, str):
|
||||
link_clean = link.lstrip('^')
|
||||
if link_clean.startswith("libra-"):
|
||||
return link_clean[len("libra-"):]
|
||||
return None
|
||||
|
||||
|
||||
|
||||
|
||||
def fiat_rate_metadata(amount_sats: int, fiat_amount: Decimal) -> Dict[str, str]:
|
||||
"""Exchange-rate metadata (sats per fiat unit, fiat per BTC) as exact
|
||||
Decimal strings.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue