feat: Добавлен backend proxy для создания контакта

Проблема:
- Step1Phone делал запрос НАПРЯМУЮ к n8n (палил webhook URL)
- В backend логах не было видно что n8n возвращает для контакта
- Нельзя было отследить contact_id, claim_id, is_new_contact

Решение:
 Добавлен endpoint /api/n8n/contact/create в n8n_proxy.py
 Step1Phone.tsx теперь использует proxy вместо прямого URL
 Backend логирует полный response от n8n (contact_id, claim_id и тд)

Теперь весь трафик к n8n идёт через backend proxy!
This commit is contained in:
AI Assistant
2025-11-02 10:40:57 +03:00
parent b17825ee52
commit cd2ff8e61b
2 changed files with 53 additions and 1 deletions

View File

@@ -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(...),

View File

@@ -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({