feat: add daily cleanup job for orphaned tasks
							parent
							
								
									e877e14325
								
							
						
					
					
						commit
						54c723449f
					
				| @ -0,0 +1,26 @@ | ||||
| import { cleanupOrphanedTasks } from '../services/cleanupService'; | ||||
| 
 | ||||
| export function startCleanupJob() { | ||||
|   // Run daily at 2 AM
 | ||||
|   const cleanupInterval = 24 * 60 * 60 * 1000; // 24 hours
 | ||||
|   const initialDelay = calculateInitialDelay(); | ||||
| 
 | ||||
|   setTimeout(() => { | ||||
|     // Run immediately after delay
 | ||||
|     cleanupOrphanedTasks(); | ||||
|     // Then set up the daily interval
 | ||||
|     setInterval(cleanupOrphanedTasks, cleanupInterval); | ||||
|   }, initialDelay); | ||||
| } | ||||
| 
 | ||||
| function calculateInitialDelay(): number { | ||||
|   const now = new Date(); | ||||
|   const target = new Date(now); | ||||
|   target.setHours(2, 0, 0, 0); // 2 AM
 | ||||
|    | ||||
|   if (now > target) { | ||||
|     target.setDate(target.getDate() + 1); | ||||
|   } | ||||
|    | ||||
|   return target.getTime() - now.getTime(); | ||||
| } | ||||
| @ -0,0 +1,32 @@ | ||||
| import { query, execute } from '../database/db'; | ||||
| import { Task } from '../models/task'; | ||||
| 
 | ||||
| // Find and clean up orphaned tasks
 | ||||
| export function cleanupOrphanedTasks() { | ||||
|   try { | ||||
|     // Find tasks assigned to non-existent users
 | ||||
|     const orphanedTasks = query(` | ||||
|       SELECT t.id  | ||||
|       FROM tasks t | ||||
|       LEFT JOIN users u ON t.assigned_to = u.phone_number | ||||
|       WHERE t.assigned_to != ''  | ||||
|         AND u.phone_number IS NULL | ||||
|     `);
 | ||||
| 
 | ||||
|     if (orphanedTasks.length > 0) { | ||||
|       console.log(`Found ${orphanedTasks.length} orphaned tasks, cleaning up...`); | ||||
|        | ||||
|       // Unassign the tasks
 | ||||
|       execute(` | ||||
|         UPDATE tasks  | ||||
|         SET assigned_to = '' | ||||
|         WHERE id IN (${orphanedTasks.map(t => t.id).join(',')}) | ||||
|       `);
 | ||||
|     } | ||||
| 
 | ||||
|     return orphanedTasks.length; | ||||
|   } catch (error) { | ||||
|     console.error('Error during cleanup:', error); | ||||
|     return 0; | ||||
|   } | ||||
| } | ||||
					Loading…
					
					
				
		Reference in New Issue