diff --git a/backend/app/api/n8n_proxy.py b/backend/app/api/n8n_proxy.py index 801a560..1643196 100644 --- a/backend/app/api/n8n_proxy.py +++ b/backend/app/api/n8n_proxy.py @@ -18,6 +18,7 @@ router = APIRouter(prefix="/api/n8n", tags=["n8n-proxy"]) # URL webhooks из .env (будут добавлены) N8N_POLICY_CHECK_WEBHOOK = getattr(settings, 'n8n_policy_check_webhook', None) N8N_FILE_UPLOAD_WEBHOOK = getattr(settings, 'n8n_file_upload_webhook', None) +N8N_CREATE_CONTACT_WEBHOOK = getattr(settings, 'n8n_create_contact_webhook', 'https://n8n.clientright.pro/webhook/511fde97-88bb-4fb4-bea5-cafdc364be27') N8N_CREATE_CLAIM_WEBHOOK = getattr(settings, 'n8n_create_claim_webhook', 'https://n8n.clientright.pro/webhook/d5bf4ca6-9e44-44b9-9714-3186ea703e7d') @@ -64,6 +65,57 @@ async def proxy_policy_check(request: Request): raise HTTPException(status_code=500, detail=f"Ошибка проверки полиса: {str(e)}") +@router.post("/contact/create") +async def proxy_create_contact(request: Request): + """ + Проксирует создание контакта к n8n webhook + + Frontend отправляет: POST /api/n8n/contact/create + Backend проксирует к: https://n8n.clientright.pro/webhook/511fde97-88bb-4fb4-bea5-cafdc364be27 + """ + if not N8N_CREATE_CONTACT_WEBHOOK: + raise HTTPException(status_code=500, detail="N8N contact webhook не настроен") + + try: + body = await request.json() + + logger.info(f"🔄 Proxy create contact: phone={body.get('phone', 'unknown')}, session_id={body.get('session_id', 'unknown')}") + + async with httpx.AsyncClient(timeout=30.0) as client: + response = await client.post( + N8N_CREATE_CONTACT_WEBHOOK, + json=body, + headers={"Content-Type": "application/json"} + ) + + if response.status_code == 200: + response_text = response.text + logger.info(f"✅ Contact created successfully. Response: {response_text[:500]}") + + if not response_text or response_text.strip() == '': + logger.error(f"❌ N8N returned empty response") + raise HTTPException(status_code=500, detail="N8N вернул пустой ответ") + + try: + return response.json() + except Exception as e: + logger.error(f"❌ Failed to parse JSON: {e}. Response: {response_text[:500]}") + raise HTTPException(status_code=500, detail=f"Ошибка парсинга ответа n8n: {str(e)}") + else: + logger.error(f"❌ N8N returned {response.status_code}: {response.text}") + raise HTTPException( + status_code=response.status_code, + detail=f"N8N error: {response.text}" + ) + + except httpx.TimeoutException: + logger.error("⏱️ N8N webhook timeout") + raise HTTPException(status_code=504, detail="Таймаут подключения к n8n") + except Exception as e: + logger.error(f"❌ Error proxying to n8n: {e}") + raise HTTPException(status_code=500, detail=f"Ошибка создания контакта: {str(e)}") + + @router.post("/upload/file") async def proxy_file_upload( file: UploadFile = File(...), diff --git a/frontend/src/components/form/Step1Phone.tsx b/frontend/src/components/form/Step1Phone.tsx index 54bc176..b4f4e0b 100644 --- a/frontend/src/components/form/Step1Phone.tsx +++ b/frontend/src/components/form/Step1Phone.tsx @@ -91,7 +91,7 @@ export default function Step1Phone({ try { addDebugEvent?.('crm', 'info', '📞 Создание контакта в CRM...', { phone }); - const crmResponse = await fetch('https://n8n.clientright.pro/webhook/511fde97-88bb-4fb4-bea5-cafdc364be27', { + const crmResponse = await fetch('/api/n8n/contact/create', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({