feat: Switch form approval to Redis channel instead of webhook

Changed from webhook to Redis Pub/Sub channel:
- Created endpoint POST /api/v1/claims/approve
- Publishes to Redis channel: form_approve:{claim_id}
- Added idempotency_key for future RabbitMQ integration
- Fire-and-forget approach (no waiting for response)

Benefits:
- Higher performance (Redis Pub/Sub is faster)
- Better scalability
- Ready for RabbitMQ queue integration
- Idempotency key included for duplicate protection

Files:
- backend/app/api/claims.py (new /approve endpoint)
- frontend/src/components/form/StepClaimConfirmation.tsx (updated saveFormData)
- docs/REDIS_FORM_APPROVE.md (documentation)
This commit is contained in:
AI Assistant
2025-11-25 12:29:36 +03:00
parent 82f4bf818b
commit de092755af
3 changed files with 225 additions and 71 deletions

View File

@@ -92,28 +92,27 @@ export default function StepClaimConfirmation({
setLoading(false);
}, [claimPlanData]);
// Функция сохранения данных формы - отправка в webhook без ожидания ответа
// Функция сохранения данных формы - публикация в Redis канал
const saveFormData = useCallback(async (formData: any) => {
console.log('💾 Отправляем данные формы в webhook:', formData);
console.log('💾 Публикуем данные формы в Redis канал:', formData);
// Получаем данные из claimPlanData для формирования payload
const claimId = claimPlanData?.claim_id || claimPlanData?.propertyName?.meta?.claim_id || '';
const unifiedId = claimPlanData?.unified_id || claimPlanData?.propertyName?.meta?.unified_id || '';
const sessionToken = claimPlanData?.session_token || '';
const userId = claimPlanData?.user_id || claimPlanData?.propertyName?.meta?.user_id || '';
const phone = claimPlanData?.propertyName?.applicant?.phone ||
claimPlanData?.propertyName?.user?.mobile ||
claimPlanData?.phone || '';
// Формируем payload для webhook
// Формируем payload для Redis канала
const payload = {
stage: 'form_approve',
form_id: 'ticket_form',
session_id: sessionToken,
session_token: sessionToken,
claim_id: claimId,
session_token: sessionToken,
session_id: sessionToken,
unified_id: unifiedId,
user_id: userId,
phone: phone,
sms_verified: true, // Флаг что SMS код подтвержден
// Данные формы подтверждения
form_data: formData,
@@ -126,9 +125,9 @@ export default function StepClaimConfirmation({
original_data: formData?.originalData || {},
};
// Отправляем в webhook без ожидания ответа (fire-and-forget)
// Используем fetch с keepalive для надежности, но не ждем ответа
fetch('https://n8n.clientright.pro/webhook/eebe58d4-0bcd-4d09-9d62-39868b110960', {
// Публикуем в Redis канал через backend endpoint (fire-and-forget)
// Канал: form_approve:{claim_id}
fetch('/api/v1/claims/approve', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
@@ -137,10 +136,10 @@ export default function StepClaimConfirmation({
keepalive: true, // Продолжить отправку даже если страница закрывается
}).catch((error) => {
// Тихо логируем ошибки, но не блокируем пользователя
console.error('Ошибка отправки данных формы в webhook:', error);
console.error('Ошибка публикации данных формы в Redis:', error);
});
console.log('✅ Данные формы отправлены в webhook (fire-and-forget)');
console.log('✅ Данные формы опубликованы в Redis канал form_approve:', claimId);
}, [claimPlanData]);
// Функция отправки SMS-кода