From eeb458f8fea05e5da5ce670809af5eec024b0140 Mon Sep 17 00:00:00 2001 From: Shroominic Date: Tue, 12 Aug 2025 15:29:30 -0300 Subject: [PATCH] feat: enhance logging in payment processing modules - Add comprehensive logging for cost calculations and pricing - Log token validation with secure previews (first 20 chars) - Add detailed logging for X-Cashu token processing flow - Implement specific error categorization for CASHU errors - Add logging for streaming response handling and usage extraction - Log refund processing with retry attempts - Track header modifications in upstream requests - Include request IDs in error responses --- routstr/payment/helpers.py | 25 +++++++++---------------- routstr/payment/x_cashu.py | 20 +++++++++++++++----- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/routstr/payment/helpers.py b/routstr/payment/helpers.py index 3e131326..4404fd0b 100644 --- a/routstr/payment/helpers.py +++ b/routstr/payment/helpers.py @@ -1,8 +1,8 @@ import json import os -from typing import Optional from fastapi import HTTPException, Response +from fastapi.requests import Request from ..core import get_logger from ..wallet import deserialize_token_from_string @@ -157,21 +157,13 @@ def get_max_cost_for_model(model: str) -> int: def create_error_response( - error_type: str, message: str, status_code: int, token: Optional[str] = None + error_type: str, + message: str, + status_code: int, + request: Request, + token: str | None = None, ) -> Response: """Create a standardized error response.""" - logger.info( - "Creating error response", - extra={ - "error_type": error_type, - "error_message": message, - "status_code": status_code, - }, - ) - - response_headers = {} - if token: - response_headers["X-Cashu"] = token return Response( content=json.dumps( { @@ -179,12 +171,13 @@ def create_error_response( "message": message, "type": error_type, "code": status_code, - } + }, + "request_id": getattr(request.state, "request_id", "unknown"), } ), status_code=status_code, media_type="application/json", - headers=dict(response_headers), + headers={"X-Cashu": token} if token else {}, ) diff --git a/routstr/payment/x_cashu.py b/routstr/payment/x_cashu.py index afbc0d7e..041d2b22 100644 --- a/routstr/payment/x_cashu.py +++ b/routstr/payment/x_cashu.py @@ -63,7 +63,8 @@ async def x_cashu_handler( "token_already_spent", "The provided CASHU token has already been spent", 400, - x_cashu_token, + request=request, + token=x_cashu_token, ) if "invalid token" in error_message.lower(): @@ -71,12 +72,17 @@ async def x_cashu_handler( "invalid_token", "The provided CASHU token is invalid", 400, - x_cashu_token, + request=request, + token=x_cashu_token, ) if "mint error" in error_message.lower(): return create_error_response( - "mint_error", f"CASHU mint error: {error_message}", 422, x_cashu_token + "mint_error", + f"CASHU mint error: {error_message}", + 422, + request=request, + token=x_cashu_token, ) # Generic error for other cases @@ -84,7 +90,8 @@ async def x_cashu_handler( "cashu_error", f"CASHU token processing failed: {error_message}", 400, - x_cashu_token, + request=request, + token=x_cashu_token, ) @@ -217,7 +224,10 @@ async def forward_to_upstream( }, ) return create_error_response( - "internal_error", "An unexpected server error occurred", 500 + "internal_error", + "An unexpected server error occurred", + 500, + request=request, )