Some checks are pending
CI Pipeline / changes (push) Waiting to run
CI Pipeline / core (push) Blocked by required conditions
CI Pipeline / trading-backend (push) Blocked by required conditions
CI Pipeline / trading-data-service (push) Blocked by required conditions
CI Pipeline / trading-frontend (push) Blocked by required conditions
CI Pipeline / erp-core (push) Blocked by required conditions
CI Pipeline / erp-mecanicas (push) Blocked by required conditions
CI Pipeline / gamilit-backend (push) Blocked by required conditions
CI Pipeline / gamilit-frontend (push) Blocked by required conditions
Backend: - Fix email verification and password recovery services - Fix exercise submission and student progress services Frontend: - Update missions, password, and profile API services - Fix ExerciseContentRenderer component Docs & Scripts: - Add SSL/Certbot deployment guide - Add quick deployment guide - Database scripts for testing and validations - Migration and homologation reports - Functions inventory documentation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
4.0 KiB
4.0 KiB
ET-TSK-001: Sistema de Tareas Programadas (Cron Jobs)
Versión: 1.0.0
Fecha: 2025-12-18
Estado: Implementado
Módulo Backend: apps/backend/src/modules/tasks/
1. DESCRIPCIÓN
El módulo de tareas programadas gestiona los cron jobs del sistema GAMILIT. Ejecuta procesos automáticos como reset de misiones diarias, limpieza de notificaciones y mantenimiento del sistema.
2. COMPONENTES
2.1 MissionsCronService
Ubicación: tasks/missions-cron.service.ts
Responsabilidades:
- Resetear misiones diarias a medianoche
- Generar nuevas misiones para usuarios activos
- Calcular expiración de misiones semanales
Cron Jobs:
| Job | Schedule | Descripción |
|---|---|---|
resetDailyMissions |
0 0 * * * (00:00 UTC) |
Reset misiones diarias |
generateWeeklyMissions |
0 0 * * 1 (Lunes 00:00) |
Generar misiones semanales |
cleanExpiredMissions |
0 2 * * * (02:00 UTC) |
Limpiar misiones expiradas |
Dependencias:
GamificationModule.MissionsService
2.2 NotificationsCronService
Ubicación: tasks/notifications-cron.service.ts
Responsabilidades:
- Enviar notificaciones en batch
- Limpiar notificaciones leídas antiguas
- Procesar cola de emails
Cron Jobs:
| Job | Schedule | Descripción |
|---|---|---|
processNotificationQueue |
*/5 * * * * (cada 5 min) |
Procesar cola pendiente |
cleanOldNotifications |
0 3 * * * (03:00 UTC) |
Limpiar >30 días |
sendDigestEmails |
0 8 * * * (08:00 UTC) |
Enviar resúmenes diarios |
Dependencias:
NotificationsModule.NotificationQueueServiceMailModule.MailService
3. CONFIGURACIÓN
3.1 Módulo
@Module({
imports: [
ScheduleModule.forRoot(),
GamificationModule,
NotificationsModule,
MailModule,
],
providers: [
MissionsCronService,
NotificationsCronService,
],
})
export class TasksModule {}
3.2 Decoradores de Schedule
import { Cron, CronExpression } from '@nestjs/schedule';
@Injectable()
export class MissionsCronService {
@Cron(CronExpression.EVERY_DAY_AT_MIDNIGHT)
async resetDailyMissions() {
// ...
}
}
4. MONITOREO
4.1 Logs de Ejecución
Cada job registra:
- Inicio de ejecución
- Duración
- Registros procesados
- Errores encontrados
this.logger.log(`[CRON] resetDailyMissions started`);
// ... proceso
this.logger.log(`[CRON] resetDailyMissions completed: ${count} missions reset in ${duration}ms`);
4.2 Alertas
| Condición | Alerta |
|---|---|
| Job falla 3 veces consecutivas | CRITICAL |
| Job toma >5 minutos | WARNING |
| Job no se ejecuta en 24h | CRITICAL |
5. DEPENDENCIAS
5.1 Módulos Requeridos
TasksModule
├── GamificationModule (MissionsService)
├── NotificationsModule (NotificationQueueService)
└── MailModule (MailService)
5.2 Es Usado Por
- AdminModule (para monitoreo de jobs)
6. CONSIDERACIONES DE PRODUCCIÓN
6.1 Timezone
- Todos los cron jobs usan UTC
- Frontend convierte a timezone del usuario
6.2 Concurrencia
- Solo una instancia ejecuta cron jobs (usar distributed lock)
- Implementar idempotencia en cada job
6.3 Retry Logic
@Cron('0 0 * * *')
async resetDailyMissions() {
const MAX_RETRIES = 3;
for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
try {
await this.executeMissionReset();
return;
} catch (error) {
if (attempt === MAX_RETRIES) throw error;
await this.delay(attempt * 1000);
}
}
}
7. TESTING
7.1 Unit Tests
describe('MissionsCronService', () => {
it('should reset daily missions', async () => {
// Mock MissionsService
// Execute cron handler
// Verify missions were reset
});
});
7.2 Integration Tests
- Verificar que jobs se registran correctamente
- Simular ejecución manual de jobs
- Verificar side effects en BD
Especificación generada: 2025-12-18