mirror of
https://github.com/elisiariocouto/leggen.git
synced 2025-12-23 16:09:34 +00:00
Introduces a DataProcessor layer to separate transformation logic from orchestration and persistence concerns: - Created data_processors/ directory with AccountEnricher, BalanceTransformer, AnalyticsProcessor, and moved TransactionProcessor - Refactored SyncService to pure orchestrator, removing account/balance enrichment logic - Refactored DatabaseService to pure CRUD, removing analytics and transformation logic - Extracted 90+ lines of analytics SQL from DatabaseService to AnalyticsProcessor - Extracted 80+ lines of balance transformation logic to BalanceTransformer - Maintained backward compatibility - all 109 tests pass - No API contract changes This improves code clarity, testability, and maintainability while maintaining the existing API surface. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
70 lines
2.3 KiB
Python
70 lines
2.3 KiB
Python
"""Balance data transformation processor for format conversions."""
|
|
|
|
from datetime import datetime
|
|
from typing import Any, Dict, List, Tuple
|
|
|
|
|
|
class BalanceTransformer:
|
|
"""Transforms balance data between GoCardless and internal database formats."""
|
|
|
|
def merge_account_metadata_into_balances(
|
|
self,
|
|
balances: Dict[str, Any],
|
|
account_details: Dict[str, Any],
|
|
) -> Dict[str, Any]:
|
|
"""
|
|
Merge account metadata into balance data for proper persistence.
|
|
|
|
This adds institution_id, iban, and account_status to the balances
|
|
so they can be persisted alongside the balance data.
|
|
|
|
Args:
|
|
balances: Raw balance data from GoCardless
|
|
account_details: Enriched account details containing metadata
|
|
|
|
Returns:
|
|
Balance data with account metadata merged in
|
|
"""
|
|
balances_with_metadata = balances.copy()
|
|
balances_with_metadata["institution_id"] = account_details.get("institution_id")
|
|
balances_with_metadata["iban"] = account_details.get("iban")
|
|
balances_with_metadata["account_status"] = account_details.get("status")
|
|
return balances_with_metadata
|
|
|
|
def transform_to_database_format(
|
|
self,
|
|
account_id: str,
|
|
balance_data: Dict[str, Any],
|
|
) -> List[Tuple[Any, ...]]:
|
|
"""
|
|
Transform GoCardless balance format to database row format.
|
|
|
|
Converts nested GoCardless balance structure into flat tuples
|
|
ready for SQLite insertion.
|
|
|
|
Args:
|
|
account_id: The account ID
|
|
balance_data: Balance data with merged account metadata
|
|
|
|
Returns:
|
|
List of tuples in database row format (account_id, bank, status, ...)
|
|
"""
|
|
rows = []
|
|
|
|
for balance in balance_data.get("balances", []):
|
|
balance_amount = balance.get("balanceAmount", {})
|
|
|
|
row = (
|
|
account_id,
|
|
balance_data.get("institution_id", "unknown"),
|
|
balance_data.get("account_status"),
|
|
balance_data.get("iban", "N/A"),
|
|
float(balance_amount.get("amount", 0)),
|
|
balance_amount.get("currency"),
|
|
balance.get("balanceType"),
|
|
datetime.now().isoformat(),
|
|
)
|
|
rows.append(row)
|
|
|
|
return rows
|