Project-Image-Uploader/backend/src/services/SchedulerService.js
matthias.lotz 939cf22163 feat(backend): Implement automatic cleanup service
Phase 2 Complete - Backend Core Logic

New Components:
- DeletionLogRepository: CRUD for deletion audit trail
- GroupCleanupService: Core cleanup logic
  - findGroupsForDeletion() - finds unapproved groups older than 7 days
  - deleteGroupCompletely() - DB + file deletion
  - deletePhysicalFiles() - removes images & previews
  - logDeletion() - creates audit log entry
  - getDaysUntilDeletion() - calculates remaining days
  - performScheduledCleanup() - main cleanup orchestrator
- SchedulerService: Cron job management
  - Daily cleanup at 10:00 AM (Europe/Berlin)
  - Manual trigger for development

GroupRepository Extensions:
- findUnapprovedGroupsOlderThan(days)
- deleteGroupCompletely(groupId)
- getGroupStatistics(groupId)

Dependencies:
- node-cron ^3.0.3

Integration:
- Scheduler auto-starts with server (server.js)
- Comprehensive logging for all operations

Tasks completed:  2.3,  2.4,  2.5
2025-11-08 12:23:49 +01:00

50 lines
1.6 KiB
JavaScript

const cron = require('node-cron');
const GroupCleanupService = require('./GroupCleanupService');
class SchedulerService {
constructor() {
this.tasks = [];
}
start() {
console.log('[Scheduler] Starting scheduled tasks...');
// Cleanup-Job: Jeden Tag um 10:00 Uhr
const cleanupTask = cron.schedule('0 10 * * *', async () => {
console.log('[Scheduler] Running daily cleanup at 10:00 AM...');
try {
await GroupCleanupService.performScheduledCleanup();
} catch (error) {
console.error('[Scheduler] Cleanup task failed:', error);
}
}, {
scheduled: true,
timezone: "Europe/Berlin" // Anpassen nach Bedarf
});
this.tasks.push(cleanupTask);
console.log('✓ Scheduler started - Daily cleanup at 10:00 AM (Europe/Berlin)');
// Für Development: Manueller Trigger
if (process.env.NODE_ENV === 'development') {
console.log('📝 Development Mode: Use GroupCleanupService.performScheduledCleanup() to trigger manually');
}
}
stop() {
console.log('[Scheduler] Stopping all scheduled tasks...');
this.tasks.forEach(task => task.stop());
this.tasks = [];
console.log('✓ Scheduler stopped');
}
// Für Development: Manueller Cleanup-Trigger
async triggerCleanupNow() {
console.log('[Scheduler] Manual cleanup triggered...');
return await GroupCleanupService.performScheduledCleanup();
}
}
module.exports = new SchedulerService();