diff --git a/backend/models/frontend.py b/backend/models/frontend.py index f502df6..de006cb 100644 --- a/backend/models/frontend.py +++ b/backend/models/frontend.py @@ -20,7 +20,7 @@ class FrontendConfig(BaseModel): ssl_verify: Optional[str] = "optional" acl_rules: Any = [] redirect_rules: Any = [] - use_backend_rules: Optional[str] = None + use_backend_rules: Any = [] # Changed from Optional[str] to Any for list support request_headers: Optional[str] = None response_headers: Optional[str] = None tcp_request_rules: Optional[str] = None @@ -72,6 +72,25 @@ class FrontendConfig(BaseModel): return v return [] + @validator('use_backend_rules', pre=True, always=True) + def parse_use_backend_rules(cls, v): + if isinstance(v, str): + v = v.strip() + # Handle JSON string (e.g., "[]" or "[\"rule1\", \"rule2\"]") + if v.startswith('[') and v.endswith(']'): + try: + parsed = json.loads(v) + if isinstance(parsed, list): + return parsed + except (json.JSONDecodeError, ValueError): + pass + # Handle newline-separated string + if v: + return [rule.strip() for rule in v.split('\n') if rule.strip()] + elif isinstance(v, list): + return v + return [] + # CRITICAL VALIDATION RULES FOR HAPROXY @validator('name') def validate_name(cls, v): diff --git a/frontend/src/components/FrontendManagement.js b/frontend/src/components/FrontendManagement.js index 2a7c9ed..f52fda6 100644 --- a/frontend/src/components/FrontendManagement.js +++ b/frontend/src/components/FrontendManagement.js @@ -531,12 +531,19 @@ const FrontendManagement = () => { formattedRedirectRules = frontend.redirect_rules.join('\n'); } + // Format use_backend rules for textarea (array to multi-line string) + let formattedUseBackendRules = frontend.use_backend_rules; + if (Array.isArray(frontend.use_backend_rules)) { + formattedUseBackendRules = frontend.use_backend_rules.join('\n'); + } + form.setFieldsValue({ ...frontend, ssl_enabled: frontend.ssl_enabled || false, ssl_certificate_ids: sslCertIds, acl_rules: formattedAclRules, - redirect_rules: formattedRedirectRules + redirect_rules: formattedRedirectRules, + use_backend_rules: formattedUseBackendRules }); // Update SSL field visibility after setting values