# WhatsApp Webhook

Servidor Node.js que actúa como intermediario entre la **API de WhatsApp Business (Meta)** y una base de datos MySQL. Recibe mensajes entrantes a través de un webhook, los persiste en la base de datos y envía una respuesta automática al remitente.

## ¿Qué hace esta aplicación?

- **Verificación del webhook**: Responde al handshake de verificación de Meta para registrar el endpoint.
- **Recepción de mensajes**: Procesa los mensajes entrantes de WhatsApp (texto) y los almacena en la base de datos.
- **Gestión de chats**: Crea automáticamente un chat en la base de datos si el contacto es nuevo; en caso contrario asocia el mensaje al chat existente.
- **Respuesta automática**: Al recibir un mensaje, envía de forma automática un mensaje de texto al remitente informando que un agente se pondrá en contacto.
- **API REST**: Expone endpoints para consultar y crear chats desde otros servicios.

## Requisitos previos

- Node.js >= 18
- MySQL >= 5.7 / MariaDB
- Una cuenta activa de **WhatsApp Business API** (Meta Developer)
- (Opcional) PM2 para producción

## Estructura del proyecto

```
src/
├── config/         # Variables de entorno y plantillas de mensajes
├── controller/     # Controladores HTTP
├── model/mysql/    # Acceso a datos con mysql2
├── routes/         # Definición de rutas Express
└── service/        # Lógica de negocio
```

## Base de datos

Importa el esquema de sistema SACC:

```bash
mysql -u <usuario> -p <base_de_datos> < <database.sql>
```

Las tablas que se usan son:

| Tabla                | Descripción                              |
|----------------------|------------------------------------------|
| `whatsapp_accounts`  | Cuentas de WhatsApp Business registradas |
| `whatsapp_chats`     | Conversaciones por número de teléfono    |
| `whatsapp_messages`  | Mensajes individuales de cada chat       |

## Instalación

```bash
# 1. Clona el repositorio
git clone <url-del-repositorio>
cd whatsapp-webhook

# 2. Instala las dependencias
npm install
```

## Configuración

Crea un archivo `.env` en la raíz del proyecto con las siguientes variables:

```env
# Aplicación
APP_PORT=3000
APP_VERIFY_TOKEN=tu_token_de_verificacion

# Base de datos MySQL
DB_HOST=localhost
DB_PORT=3306
DB_USER=usuario
DB_PASSWORD=contraseña
DB_NAME=nombre_base_de_datos

# WhatsApp Business API (Meta)
META_APP_ID=id_de_tu_app_meta
WHATSAPP_API_URL=https://graph.facebook.com/v25.0
WHATSAPP_API_KEY=tu_token_de_acceso
WHATSAPP_PHONE_NUMBER_ID=id_numero_de_telefono
WHATSAPP_BUSINESS_ID=id_cuenta_business
WHATSAPP_PIN=pin_de_tu_numero
```

## Ejecución

### Desarrollo

```bash
npm run dev
```

### Producción con PM2

```bash
# Instala PM2 de forma global (si no lo tienes)
npm install -g pm2

# Inicia la aplicación
pm2 start src/index.js --name whatsapp-webhook

# Guarda el proceso para que se reinicie al arrancar el sistema
pm2 save
pm2 startup

# Otros comandos útiles
pm2 status                        # Ver estado de los procesos
pm2 logs whatsapp-webhook         # Ver logs en tiempo real
pm2 restart whatsapp-webhook      # Reiniciar la aplicación
pm2 stop whatsapp-webhook         # Detener la aplicación
```

También puedes usar un archivo `ecosystem.config.js` para mayor control:

```js
// ecosystem.config.js
module.exports = {
  apps: [
    {
      name: 'whatsapp-webhook',
      script: 'src/index.js',
      env_production: {
        NODE_ENV: 'production',
      },
      watch: false,
      instances: 1,
      autorestart: true,
    },
  ],
};
```

```bash
pm2 start ecosystem.config.js --env production
```

## Endpoints disponibles

| Método | Ruta          | Descripción                                      |
|--------|---------------|--------------------------------------------------|
| GET    | `/webhook`    | Verificación del webhook por Meta                |
| POST   | `/webhook`    | Recepción de mensajes entrantes de WhatsApp      |
| GET    | `/chats/:id`  | Obtener los detalles de un chat por su ID        |
| POST   | `/chats`      | Crear un chat manualmente                        |
| GET    | `/test`       | Ruta de prueba para verificar que el servidor está activo |

## Flujo de un mensaje entrante

```
Meta (WhatsApp) ──POST /webhook──► WebhookService
                                        │
                                        ├─► Busca o crea el chat en MySQL
                                        ├─► Guarda el mensaje en MySQL
                                        └─► Envía respuesta automática al remitente
```

## Variables de entorno requeridas

| Variable                  | Descripción                                      |
|---------------------------|--------------------------------------------------|
| `APP_PORT`                | Puerto en el que escucha el servidor             |
| `APP_VERIFY_TOKEN`        | Token de verificación del webhook (Meta)         |
| `DB_*`                    | Credenciales de conexión a MySQL                 |
| `WHATSAPP_API_URL`        | URL base de la Graph API de Meta                 |
| `WHATSAPP_API_KEY`        | Token de acceso permanente de WhatsApp Business  |
| `WHATSAPP_PHONE_NUMBER_ID`| ID del número de teléfono en Meta                |
| `WHATSAPP_BUSINESS_ID`    | ID de la cuenta de WhatsApp Business             |
