From faaf484f7ffdce04c927d48a8703bd791580802a Mon Sep 17 00:00:00 2001 From: taylanbakircioglu Date: Fri, 7 Nov 2025 11:51:14 +0300 Subject: [PATCH] Hotfix: Frontend creation failing - use_backend_rules JSON serialization MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🐛 Critical Bug Fix: - Fixed frontend creation error: 'invalid input for query argument $15: [] (expected str, got list)' - use_backend_rules field was not JSON serialized in INSERT/UPDATE queries 🔧 Technical Details: - Changed use_backend_rules from str to list type in model - BUT forgot to json.dumps() when saving to database - Database expects JSONB string, not Python list Fixed in 2 places: 1. CREATE frontend (Line 344): Added json.dumps(frontend.use_backend_rules or []) 2. UPDATE frontend (Line 591): Added json.dumps(frontend.use_backend_rules or []) ✅ Before: acl_rules = json.dumps([...]) redirect_rules = json.dumps([...]) use_backend_rules = [...] ❌ (raw list) ✅ After: acl_rules = json.dumps([...]) redirect_rules = json.dumps([...]) use_backend_rules = json.dumps([...]) ✅ (JSON string) Error was: POST /api/frontends - 500 invalid input for query argument $15: [] (expected str, got list) Fix applied: Both CREATE and UPDATE now serialize use_backend_rules to JSON --- backend/routers/frontend.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/routers/frontend.py b/backend/routers/frontend.py index f4ee6a6..c4694ab 100644 --- a/backend/routers/frontend.py +++ b/backend/routers/frontend.py @@ -341,7 +341,7 @@ async def create_frontend(frontend: FrontendConfig, request: Request, authorizat """, frontend.name, frontend.bind_address, frontend.bind_port, frontend.default_backend, frontend.mode, frontend.ssl_enabled, frontend.ssl_certificate_id, ssl_cert_ids_json, frontend.ssl_port, frontend.ssl_cert_path, frontend.ssl_cert, frontend.ssl_verify, - json.dumps(frontend.acl_rules or []), json.dumps(frontend.redirect_rules or []), frontend.use_backend_rules, + json.dumps(frontend.acl_rules or []), json.dumps(frontend.redirect_rules or []), json.dumps(frontend.use_backend_rules or []), frontend.request_headers, frontend.response_headers, frontend.tcp_request_rules, frontend.timeout_client, frontend.timeout_http_request, frontend.rate_limit, frontend.compression, frontend.log_separate, frontend.monitor_uri, frontend.cluster_id, frontend.maxconn) @@ -588,7 +588,7 @@ async def update_frontend(frontend_id: int, frontend: FrontendConfig, request: R """, frontend.name, frontend.bind_address, frontend.bind_port, frontend.default_backend, frontend.mode, ssl_enabled, ssl_certificate_id, ssl_cert_ids_json, ssl_port, ssl_cert_path, ssl_cert, ssl_verify, - json.dumps(frontend.acl_rules or []), json.dumps(frontend.redirect_rules or []), frontend.use_backend_rules, + json.dumps(frontend.acl_rules or []), json.dumps(frontend.redirect_rules or []), json.dumps(frontend.use_backend_rules or []), frontend.request_headers, frontend.response_headers, frontend.tcp_request_rules, frontend.timeout_client, frontend.timeout_http_request, frontend.rate_limit, frontend.compression, frontend.log_separate, frontend.monitor_uri, frontend.cluster_id, frontend.maxconn, frontend_id)