# Пример использования Redis в n8n через Webhook

## Как это работает

```
Webhook (точка входа) → Redis Node (чтение/запись) → Ответ
```

## Workflow: Проверка SMS кода

### Структура:

```
1. Webhook Trigger
   ↓
2. Function Node (нормализация номера)
   ↓
3. Redis Node (GET) - читаем код из Redis
   ↓
4. Function Node (сравнение кодов)
   ↓
5. Redis Node (DEL) - удаляем код после проверки
   ↓
6. Respond to Webhook
```

### Детализация:

#### Шаг 1: Webhook Trigger
- **URL:** `/webhook/sms-verify`
- **Method:** POST
- **Body:** 
  ```json
  {
    "phonenumber": "+79262306381",
    "code": "106574"
  }
  ```

#### Шаг 2: Function Node - Нормализация
```javascript
// Код для Function Node
const phone = $input.item.json.phonenumber || '';
const cleaned = phone
  .replace(/[() -]/g, '')
  .replace(/^(\+?7|8)/, '');

return {
  json: {
    phone_cleaned: cleaned,
    code: $input.item.json.code
  }
};
```

#### Шаг 3: Redis Node - Чтение кода
- **Operation:** Get
- **Key:** `sms:code:{{ $json.phone_cleaned }}`
- **Результат:** 
  ```json
  {
    "phone_cleaned": "9262306381",
    "code": "106574",
    "stored_code": "106574"  // из Redis
  }
  ```

#### Шаг 4: Function Node - Сравнение
```javascript
// Код для Function Node
const inputCode = $input.item.json.code;
const storedCode = $input.item.json.stored_code;

if (!storedCode) {
  return {
    json: {
      success: false,
      message: "Код не найден или истек"
    }
  };
}

if (inputCode !== storedCode) {
  return {
    json: {
      success: false,
      message: "Неверный код"
    }
  };
}

// Код верный - продолжаем
return {
  json: {
    success: true,
    phone_cleaned: $input.item.json.phone_cleaned
  }
};
```

#### Шаг 5: Redis Node - Удаление кода
- **Operation:** Delete
- **Key:** `sms:code:{{ $json.phone_cleaned }}`

#### Шаг 6: Redis Node - Создание токена
- **Operation:** Set
- **Key:** `sms:verified:{{ $json.phone_cleaned }}`
- **Value:** `{{ $json.token }}` (генерируется в Function Node)
- **TTL:** 3600 секунд

#### Шаг 7: Respond to Webhook
```json
{
  "success": true,
  "message": "Код подтвержден",
  "token": "abc123..."
}
```

---

## Workflow: Отправка SMS кода

### Структура:

```
1. Webhook Trigger
   ↓
2. Function Node (нормализация)
   ↓
3. Redis Node (GET) - проверка rate limit
   ↓
4. Function Node (генерация кода)
   ↓
5. Redis Node (SETEX) - сохранение кода
   ↓
6. HTTP Request - отправка SMS
   ↓
7. Respond to Webhook
```

### Детализация:

#### Шаг 3: Redis Node - Проверка rate limit
- **Operation:** Get
- **Key:** `sms:ratelimit:send:{{ $json.phone_cleaned }}`
- **Если значение >= 5** → ошибка через IF Node

#### Шаг 5: Redis Node - Сохранение кода
- **Operation:** Set with Expiration
- **Key:** `sms:code:{{ $json.phone_cleaned }}`
- **Value:** `{{ $json.code }}`
- **TTL:** 600 секунд (10 минут)

#### Шаг 6: HTTP Request - Отправка SMS
- **Method:** POST
- **URL:** (SMS API провайдера)
- **Body:**
  ```json
  {
    "phone": "{{ $json.phone_cleaned }}",
    "text": "Код подтверждения: {{ $json.code }}"
  }
  ```

---

## Настройка Redis в n8n

### Credentials:

1. Зайти в n8n → Credentials → New
2. Выбрать "Redis"
3. Заполнить:
   - **Host:** `crm.clientright.ru`
   - **Port:** `6379`
   - **Password:** (из .env или пусто)
   - **Database:** `0` (по умолчанию)

### Использование в Node:

1. Добавить **Redis Node** в workflow
2. Выбрать созданные credentials
3. Выбрать операцию (Get, Set, Set with Expiration, Delete, etc.)
4. Указать ключ (можно использовать переменные: `sms:code:{{ $json.phone_cleaned }}`)

---

## Преимущества

✅ **Всё в одном месте** - webhook принимает запрос, Redis Node читает/пишет
✅ **Визуализация** - видно весь процесс на графике
✅ **Логирование** - n8n автоматически логирует все операции
✅ **Обработка ошибок** - можно добавить IF Nodes для проверок
✅ **Тестирование** - можно тестировать каждый шаг отдельно

---

## Пример полного workflow (JSON для импорта в n8n)

Можно создать workflow вручную или импортировать готовый JSON (если нужно, могу создать).
