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