{"record":{"id":"0aac5f36da31346d","repo":"yikart/AiToEarn","slug":"errors-validatefailed","errorCode":null,"errorMessage":"errors.validateFailed","messagePattern":"errors\\.validateFailed","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"project/aitoearn-web/src/app/layout/ConfigManagerDialog/index.tsx","lineNumber":473,"sourceCode":"    if (parsedConfig)\n      setConfig(parsedConfig)\n    return parsedConfig\n  }, [config, editMode, parseJsonText])\n\n  const validateConfig = useCallback(async (action: LoadingAction = 'validate', configOverride?: Record<string, unknown>) => {\n    const editableConfig = configOverride ?? getEditableConfig()\n    if (!editableConfig)\n      return false\n    const submittableConfig = stripInsertedRelayPlaceholder(editableConfig, insertedRelayPath, serviceTarget)\n\n    setLoadingAction(action)\n    setError(null)\n    setSuccessMessage('')\n\n    try {\n      const response = await validateConfigEditorConfigApi({ config: submittableConfig }, serviceTarget, true)\n      if (!response || response.code !== 0) {\n        throw new Error(getResponseMessage(response) || t('errors.validateFailed'))\n      }\n      if (action === 'validate') {\n        setSuccessMessage(t('messages.validateSuccess'))\n        toast.success(t('messages.validateSuccess'))\n      }\n      return true\n    }\n    catch (validateError) {\n      setError({ title: t('errors.validateFailed'), description: getErrorMessage(validateError) })\n      return false\n    }\n    finally {\n      if (action === 'validate')\n        setLoadingAction(null)\n    }\n  }, [getEditableConfig, insertedRelayPath, serviceTarget, t])\n\n  const saveConfig = useCallback(async (action: LoadingAction = 'save') => {","sourceCodeStart":455,"sourceCodeEnd":491,"githubUrl":"https://github.com/yikart/AiToEarn/blob/d3aa8bea5b146a8675607cf0144d891aad3e9683/project/aitoearn-web/src/app/layout/ConfigManagerDialog/index.tsx#L455-L491","documentation":"ConfigManagerDialog's validate flow throws this fallback Error when validateConfigEditorConfigApi responds with a non-zero code or an empty/undefined response and the backend gave no message. The thrown error is caught and shown via setError, so the config is not marked valid and save is blocked.","triggerScenarios":"Calling validateConfigEditorConfigApi({ config: submittableConfig }, serviceTarget, true) and receiving null/undefined response or response.code !== 0 with no message.","commonSituations":"Submitting malformed JSON config the backend validator rejects; serviceTarget service unavailable; stale auth; backend validation failing without a user-facing message.","solutions":["Fix the JSON config so it passes backend schema validation (check required fields per serviceTarget)","Confirm the config editor service for serviceTarget is reachable","Check auth/token validity for the environment","Inspect backend logs to see which validation rule failed and why no message was returned"],"exampleFix":"// before\nif (!response || response.code !== 0) {\n  throw new Error(getResponseMessage(response) || t('errors.validateFailed'))\n}\n// after\nif (!response || response.code !== 0) {\n  setError(getResponseMessage(response) || t('errors.validateFailed'))\n  return false\n}","handlingStrategy":"validation","validationCode":"function isSubmittable(config: unknown): boolean {\n  try { JSON.stringify(config); return config !== null && typeof config === 'object' } catch { return false }\n}","typeGuard":"function isApiEnvelope(r: unknown): r is { code: number; message?: string; data?: unknown } {\n  return !!r && typeof r === 'object' && 'code' in r && typeof (r as any).code === 'number'\n}","tryCatchPattern":"try {\n  const response = await validateConfigEditorConfigApi({ config }, serviceTarget, true)\n  if (!response || response.code !== 0)\n    throw new Error(getResponseMessage(response) || 'validation failed')\n} catch (e) {\n  setError(e instanceof Error ? e.message : 'validation failed')\n}","preventionTips":["Client-side JSON.parse the editor text before sending to validate","Show the backend's validation message, not just a generic failure","Keep config schema docs per serviceTarget up to date","Handle null/undefined API responses explicitly"],"tags":["config","validation","api-response"],"backgroundTag":"api-nonzero-response-code","analyzedSha":"d3aa8bea5b146a8675607cf0144d891aad3e9683","analyzedAt":"2026-08-31T14:19:24.185Z","schemaVersion":2},"datasetVersion":"2026-08-31T19:17:28.585Z"}