Files
math2-platform/backend/TELEGRAM_NOTIFICATIONS.md
Renato bc43c9e772
Some checks failed
Test Suite / test-backend (push) Has been cancelled
Test Suite / test-frontend (push) Has been cancelled
Test Suite / e2e-tests (push) Has been cancelled
Test Suite / coverage-check (push) Has been cancelled
🎓 Initial commit: Math2 Platform - Plataforma de Álgebra Lineal PRO
 Características:
- 45 ejercicios universitarios (Basic → Advanced)
- Renderizado LaTeX profesional
- IA generativa (Z.ai/DashScope)
- Docker 9 servicios
- Tests 123/123 pasando
- Seguridad enterprise (JWT, XSS, Rate limiting)

🐳 Infraestructura:
- Next.js 14 + Node.js 20
- PostgreSQL 15 + Redis 7
- Docker Compose completo
- Nginx + SSL ready

📚 Documentación:
- 5 informes técnicos completos
- README profesional
- Scripts de deployment automatizados

Estado: Producción lista 
2026-03-31 11:27:11 -03:00

438 lines
10 KiB
Markdown

# Telegram Notifications Module
## Overview
The Telegram Notifications Module provides a complete backend-only notification system for the Math Platform. It sends administrative alerts to a Telegram bot, keeping admins informed about user activities, system errors, and important events.
## Architecture
```
backend/
├── src/
│ ├── config/
│ │ └── telegram.ts # Telegram configuration & settings
│ ├── modules/
│ │ └── notification/
│ │ ├── notification.service.ts # Main notification service
│ │ ├── index.ts # Module exports
│ │ └── telegram/
│ │ ├── telegram.client.ts # HTTP client for Telegram API
│ │ └── templates/ # Message templates
│ │ ├── index.ts # Template factory
│ │ ├── alert.template.ts
│ │ ├── progress.template.ts
│ │ └── achievement.template.ts
│ ├── workers/
│ │ └── notification-sender.worker.ts # Async job processor
│ └── scripts/
│ └── test-telegram.ts # Test script
```
## Features
- **Async Queue Processing**: Uses Bull with Redis for reliable job processing
- **Retry Logic**: Automatic retry with exponential backoff on failures
- **Rich Templates**: Pre-built templates for different notification types
- **Type Safety**: Full TypeScript support with proper interfaces
- **Error Handling**: Comprehensive error handling and logging
- **Rate Limiting**: Built-in rate limiting to avoid Telegram API limits
- **Health Checks**: Monitor notification system health
## Configuration
### Environment Variables
```env
# Telegram Configuration
TELEGRAM_BOT_TOKEN="your-telegram-bot-token-here"
TELEGRAM_ADMIN_CHAT_ID="your-chat-id-here"
TELEGRAM_ENABLED=true
# Optional Configuration
TELEGRAM_API_URL="https://api.telegram.org"
TELEGRAM_TIMEOUT=10000
TELEGRAM_MAX_RETRIES=3
TELEGRAM_RETRY_DELAY=1000
TELEGRAM_PARSE_MODE="HTML"
TELEGRAM_DISABLE_WEB_PAGE_PREVIEW=true
TELEGRAM_MIN_PRIORITY="NORMAL"
```
### Priority Levels
Notifications can be filtered by priority:
- `LOW`: Informational notifications (user activity, exercise completion)
- `NORMAL`: Regular notifications (module completion, achievements)
- `HIGH`: Important notifications (errors, performance issues)
- `URGENT`: Critical notifications (security alerts)
## Usage
### Basic Notifications
```typescript
import { notificationService } from './modules/notification';
// System Notification
await notificationService.sendSystemNotification(
'Server Started',
'The application server has started successfully',
{ port: 3001, environment: 'production' }
);
// User Registration
await notificationService.notifyNewUser({
userId: 'user-123',
anonymousId: 'anon-456',
username: 'john_doe',
email: 'john@example.com',
registeredAt: new Date().toISOString(),
ipAddress: '192.168.1.1',
});
// Error Notification
await notificationService.notifySystemError({
errorType: 'DatabaseError',
errorMessage: 'Failed to connect to database',
stackTrace: 'Error: ...',
path: '/api/users',
method: 'POST',
statusCode: 500,
});
```
### Advanced Usage
```typescript
// Module Completion
await notificationService.notifyModuleCompleted({
userId: 'user-123',
anonymousId: 'anon-456',
moduleName: 'Vectores y Espacios Vectoriales',
moduleType: 'FUNDAMENTOS',
finalScore: 95,
totalPoints: 1250,
exercisesCompleted: 45,
timeSpentMinutes: 120,
startedAt: startDate.toISOString(),
completedAt: new Date().toISOString(),
});
// Achievement Notification
await notificationService.notifyTop10Entry({
userId: 'user-123',
anonymousId: 'anon-456',
position: 5,
points: 2500,
exercisesCompleted: 120,
streak: 15,
});
// Daily Summary (scheduled task)
await notificationService.sendDailySummary(new Date());
```
## Templates
### Available Templates
1. **System Notifications**: General system alerts
2. **User Registration**: New user signups
3. **User Activity**: User actions and events
4. **Exercise Completion**: Exercise finished
5. **Module Completion**: Module finished
6. **Achievements**: Badges and milestones
7. **Error Notifications**: System errors
8. **Security Alerts**: Security events
9. **Performance Monitoring**: Performance metrics
### Creating Custom Templates
```typescript
import { TelegramTemplateFactory } from './modules/notification/telegram/templates';
// Format message using template factory
const { content, messageType, priority } = TelegramTemplateFactory.formatMessage(
TelegramMessageType.SYSTEM,
{
title: 'Custom Alert',
message: 'Something important happened',
details: { key: 'value' }
}
);
// Send custom notification
await notificationService.sendNotification(
TelegramMessageType.SYSTEM,
data,
{ priority: TelegramPriority.HIGH }
);
```
## Worker & Queue
### Queue Management
```typescript
import {
getNotificationQueue,
getQueueStats,
pauseQueue,
resumeQueue
} from './modules/notification';
// Get queue statistics
const stats = await getQueueStats();
console.log(stats);
// { waiting: 5, active: 2, completed: 100, failed: 3, ... }
// Pause queue (maintenance)
await pauseQueue();
// Resume queue
await resumeQueue();
```
### Retry Failed Notifications
```typescript
import { retryFailedNotifications } from './modules/notification';
// Retry up to 10 failed notifications
const retriedCount = await retryFailedNotifications(10);
console.log(`Retried ${retriedCount} notifications`);
```
## Testing
### Run Test Script
```bash
# Test all Telegram notifications
npm run test:telegram
# Or directly with tsx
npx tsx src/scripts/test-telegram.ts
```
### Test Coverage
The test script validates:
- Telegram client connection
- System notifications
- User registration notifications
- Error notifications
- Module completion notifications
- Achievement notifications
- Queue statistics
## Health Monitoring
### Check Notification Health
```typescript
const health = await notificationService.healthCheck();
console.log(health);
// {
// healthy: true,
// telegram: true,
// stats: {
// total: 100,
// pending: 5,
// sent: 90,
// failed: 5,
// todaySent: 25,
// todayFailed: 2
// }
// }
```
### Worker Health
```typescript
import { getWorkerHealth } from './workers/notification-sender.worker';
const workerHealth = await getWorkerHealth();
console.log(workerHealth);
// {
// healthy: true,
// queueStats: { ... },
// workerRunning: true
// }
```
## Error Handling
### Common Errors
1. **Rate Limiting (429)**
- Automatic retry with exponential backoff
- Configurable retry delay and max attempts
2. **Bot Blocked (403)**
- User must unblock the bot in Telegram
- Check admin chat ID is correct
3. **Invalid Token (401)**
- Verify `TELEGRAM_BOT_TOKEN` is correct
- Regenerate token via @BotFather if needed
4. **Chat Not Found (400)**
- Verify `TELEGRAM_ADMIN_CHAT_ID` is correct
- Start a conversation with the bot first
### Debugging
```typescript
import { logger } from './shared/utils/logger';
// Enable debug logging
logger.level = 'debug';
// Check Telegram configuration
import { telegramConfig } from './config/telegram';
console.log(telegramConfig.healthCheck());
```
## Production Considerations
### Security
- Never commit bot tokens to version control
- Use environment variables for sensitive data
- Implement rate limiting per notification type
- Monitor for abuse patterns
### Performance
- Use async queue for all notifications
- Don't block main thread with Telegram calls
- Implement proper error recovery
- Monitor queue depth and processing time
### Monitoring
```typescript
// Set up monitoring (example with cron)
import cron from 'node-cron';
// Check queue health every 5 minutes
cron.schedule('*/5 * * * *', async () => {
const stats = await getQueueStats();
if (stats.failed > 10) {
// Alert admins about high failure rate
await notificationService.sendSystemNotification(
'High Notification Failure Rate',
`${stats.failed} notifications have failed`,
{ stats }
);
}
});
```
## API Reference
### NotificationService
```typescript
class NotificationService {
// Send system notification
sendSystemNotification(title, message, details?): Promise<NotificationResult>
// Notify new user registration
notifyNewUser(data): Promise<CreateNotificationResult>
// Notify module completion
notifyModuleCompleted(data): Promise<CreateNotificationResult>
// Notify top 10 entry
notifyTop10Entry(data): Promise<CreateNotificationResult>
// Notify system error
notifySystemError(data): Promise<CreateNotificationResult>
// Send daily summary
sendDailySummary(date?): Promise<CreateNotificationResult>
// Get statistics
getStatistics(): Promise<NotificationStatistics>
// Retry failed notifications
retryFailedNotifications(limit?): Promise<void>
// Health check
healthCheck(): Promise<HealthCheckResult>
}
```
### TelegramClient
```typescript
class TelegramClient {
// Send text message
sendMessage(chatId, text, options?): Promise<MessageResult>
// Send photo
sendPhoto(chatId, photo, caption?, options?): Promise<MessageResult>
// Send document
sendDocument(chatId, document, caption?, options?): Promise<MessageResult>
// Get bot info
getMe(): Promise<TelegramBotInfo>
// Health check
healthCheck(): Promise<HealthCheckResult>
}
```
## Troubleshooting
### Notifications Not Sending
1. Check Telegram is enabled: `TELEGRAM_ENABLED=true`
2. Verify bot token is valid
3. Confirm admin chat ID is correct
4. Check Redis connection for worker queue
5. Review logs for error messages
### Queue Backing Up
1. Increase worker concurrency: `WORKER_CONCURRENCY=5`
2. Check for rate limiting issues
3. Verify network connectivity to Telegram API
4. Consider reducing notification frequency
### High Failure Rate
1. Check Telegram API status
2. Verify bot permissions
3. Review error messages in logs
4. Check for rate limiting (429 errors)
5. Validate message formatting
## Contributing
When adding new notification types:
1. Create template in `templates/` directory
2. Add message type to `TelegramMessageType` enum
3. Add convenience method to `NotificationService`
4. Update this documentation
5. Add tests for new notification type
## License
MIT
## Support
For issues or questions:
- Check logs in `logs/combined.log`
- Review Telegram API documentation: https://core.telegram.org/bots/api
- Test configuration using: `npm run test:telegram`