whatsapp-crm-common
Version:
Componentes compartidos para servicios de WhatsApp CRM - Common utilities and types for WhatsApp CRM system
315 lines (250 loc) • 6.82 kB
Markdown
# Ejemplos de Uso - whatsapp-crm-common
## 🚀 Configuración Inicial
### Opción 1: Solo variables de entorno
```typescript
// .env
REDIS_URL=redis://localhost:6379
DATABASE_URL=postgresql://user:pass@localhost:5432/whatsapp_crm
LOG_LEVEL=info
ENABLE_MESSAGE_QUEUE=true
// app.ts
import { RedisClient, logger } from 'whatsapp-crm-common';
const redis = RedisClient.getInstance();
logger.info('Redis conectado automáticamente');
```
### Opción 2: Configuración programática completa
```typescript
import {
configureWhatsAppCommon,
RedisClient,
WhatsAppMessageQueue
} from 'whatsapp-crm-common';
// Configurar antes de usar cualquier componente
configureWhatsAppCommon({
redis: {
host: 'redis.mi-empresa.com',
port: 6379,
password: 'mi-super-password',
db: 2
},
database: {
url: 'postgresql://user:pass@db.mi-empresa.com:5432/crm_prod'
},
logging: {
level: 'debug'
},
queue: {
enabled: true,
concurrency: 15,
workerEnabled: true
}
});
// Usar componentes (ya configurados automáticamente)
const redis = RedisClient.getInstance();
const queue = new WhatsAppMessageQueue(redis);
```
### Opción 3: Configuración mixta (recomendada para producción)
```typescript
import { configureWhatsAppCommon } from 'whatsapp-crm-common';
// Configurar solo lo específico del entorno
configureWhatsAppCommon({
redis: {
// Usa configuración específica para Redis
url: process.env.REDIS_CLUSTER_URL || 'redis://localhost:6379',
password: process.env.REDIS_PASSWORD
},
// El resto se toma de variables de entorno
});
```
## 🔧 Casos de Uso Comunes
### 1. Microservicio API
```typescript
// api-service/src/app.ts
import {
configureWhatsAppCommon,
EventPublisher,
logger
} from 'whatsapp-crm-common';
// Configuración específica del API
configureWhatsAppCommon({
logging: { level: 'info' },
queue: { enabled: false }, // API solo publica, no procesa
});
const eventPublisher = new EventPublisher();
// En un endpoint
app.post('/webhook/whatsapp', async (req, res) => {
const { tenantId, agentId, message } = req.body;
await eventPublisher.publishMessageReceived(tenantId, agentId, [message]);
logger.info({
tenantId,
agentId,
messageId: message.id,
msg: 'Mensaje recibido y encolado'
});
res.status(200).send('OK');
});
```
### 2. Worker Service
```typescript
// worker-service/src/worker.ts
import {
configureWhatsAppCommon,
WhatsAppMessageQueue,
RedisClient,
HybridEventRouter,
logger
} from 'whatsapp-crm-common';
// Configuración específica del Worker
configureWhatsAppCommon({
logging: { level: 'debug' },
queue: {
enabled: true,
concurrency: 10,
workerEnabled: true
},
});
const redis = RedisClient.getInstance();
const messageQueue = new WhatsAppMessageQueue(redis);
const eventRouter = new HybridEventRouter(redis);
// Procesar mensajes
messageQueue.addWorker('REALTIME', async (job) => {
const { tenantId, agentId, messages } = job.data;
logger.info({
tenantId,
agentId,
messageCount: messages.length,
msg: 'Procesando mensajes'
});
// Procesar mensajes...
// Notificar via Pub/Sub para updates en tiempo real
await eventRouter.publishToChannel('message-processed', {
tenantId,
agentId,
processedCount: messages.length
});
});
```
### 3. Aplicación Full-Stack
```typescript
// shared/config.ts
import { configureWhatsAppCommon } from 'whatsapp-crm-common';
export function initializeConfig() {
configureWhatsAppCommon({
redis: {
url: process.env.REDIS_URL,
password: process.env.REDIS_PASSWORD,
},
database: {
url: process.env.DATABASE_URL,
},
logging: {
level: process.env.NODE_ENV === 'production' ? 'info' : 'debug'
},
queue: {
enabled: process.env.ENABLE_WORKERS === 'true',
concurrency: parseInt(process.env.WORKER_CONCURRENCY || '5'),
},
webhook: {
url: process.env.WEBHOOK_URL,
},
whatsapp: {
maxSessionsPerProcess: parseInt(process.env.MAX_SESSIONS || '50'),
syncFullHistory: process.env.SYNC_HISTORY === 'true',
}
});
}
// main.ts
import { initializeConfig } from './shared/config';
import { RedisClient, logger } from 'whatsapp-crm-common';
// Inicializar configuración al arrancar la app
initializeConfig();
// Todos los componentes usarán la configuración automáticamente
const redis = RedisClient.getInstance();
logger.info('Aplicación iniciada correctamente');
```
## 🔄 Migración desde versión 0.1.0
### Antes (v0.1.0)
```typescript
import { environment, RedisClient } from 'whatsapp-crm-common';
const redis = RedisClient.getInstance({
url: environment.redisUrl
});
```
### Después (v0.2.0+)
```typescript
import { RedisClient } from 'whatsapp-crm-common';
// Opción 1: Automático (usa .env del proyecto)
const redis = RedisClient.getInstance();
// Opción 2: Con configuración programática
configureWhatsAppCommon({
redis: { url: 'redis://mi-servidor:6379' }
});
const redis = RedisClient.getInstance();
```
## 🐛 Debugging y Troubleshooting
### Ver configuración actual
```typescript
import { getConfig } from 'whatsapp-crm-common';
console.log('Configuración actual:', getConfig());
```
### Configuración paso a paso
```typescript
import {
configureWhatsAppCommon,
getConfig,
RedisClient
} from 'whatsapp-crm-common';
// 1. Ver configuración por defecto
console.log('Config inicial:', getConfig());
// 2. Configurar programáticamente
configureWhatsAppCommon({
redis: { host: 'mi-redis.com', port: 6380 }
});
// 3. Ver configuración mezclada
console.log('Config después:', getConfig());
// 4. Usar Redis
const redis = RedisClient.getInstance();
```
### Logging detallado
```typescript
configureWhatsAppCommon({
logging: { level: 'debug' }
});
// Ahora todos los logs serán más detallados
```
## 🧪 Testing
### Configuración para tests
```typescript
// tests/setup.ts
import { configureWhatsAppCommon } from 'whatsapp-crm-common';
configureWhatsAppCommon({
redis: {
host: 'localhost',
port: 6380, // Puerto diferente para tests
db: 15 // DB diferente para tests
},
logging: {
level: 'silent' // Sin logs en tests
},
queue: {
enabled: false // Deshabilitar colas en tests
}
});
```
### Test unitario
```typescript
// tests/redis.test.ts
import { RedisClient, configureWhatsAppCommon } from 'whatsapp-crm-common';
describe('RedisClient', () => {
beforeAll(() => {
configureWhatsAppCommon({
redis: { host: 'localhost', port: 6380, db: 15 }
});
});
it('should connect to test Redis', async () => {
const redis = RedisClient.getInstance();
await redis.connect();
expect(redis.isConnected()).toBe(true);
});
});
```