import os import requests from flask import Blueprint, Response, jsonify, request from auth import require_creditfair bp = Blueprint('sandbox', __name__) # Configure via BRE_API_URL env var (loaded from .env by config.py). Defaults to dev port. def _bre_url(): return os.environ.get('BRE_API_URL', 'http://localhost:8888') @bp.route('/api/sandbox/run', methods=['POST']) @require_creditfair def sandbox_run(): """Forward the sandbox payload to the BRE decision API and pass the response through verbatim. Auth/logging hooks can be added here later.""" payload = request.get_json(silent=True) if payload is None: return jsonify({ "error": "Invalid request", "message": "Body must be a JSON object", }), 400 url = _bre_url() try: upstream = requests.post(url, json=payload, timeout=30) except requests.exceptions.ConnectionError as e: return jsonify({ "error": "BRE API unreachable", "message": f"Could not connect to {url}: {e}", }), 502 except requests.exceptions.Timeout: return jsonify({ "error": "BRE API timeout", "message": f"{url} did not respond within 30s", }), 504 except requests.RequestException as e: return jsonify({ "error": "BRE API error", "message": str(e), }), 502 # Pass the upstream status and body straight through. The frontend already # handles non-2xx responses and arbitrary body shapes. content_type = upstream.headers.get('Content-Type', 'application/json') return Response( upstream.content, status=upstream.status_code, content_type=content_type, )