diff --git a/src/routes/admin.js b/src/routes/admin.js index 38e2b6d..4c7ac3c 100644 --- a/src/routes/admin.js +++ b/src/routes/admin.js @@ -4,8 +4,9 @@ const { authenticateToken, requireAdmin } = require('../middleware/auth'); const Domain = require('../db/models/Domain'); const User = require('../db/models/User'); const TempEmail = require('../db/models/TempEmail'); +const Message = require('../db/models/Message'); const MessageService = require('../email_server/services/MessageService'); - +const config = require('../config/haraka'); router.use(authenticateToken, requireAdmin); // Domain management @@ -91,14 +92,48 @@ router.delete('/temp-emails/:id', async (req, res) => { res.status(500).json({ error: error.message }); } }); +const { transaction } = require('objection'); -// Manual cleanup trigger router.post('/cleanup', async (req, res) => { try { - const deletedCount = await MessageService.cleanup(); - res.json({ deletedCount }); + const cutoffDate = new Date(); + cutoffDate.setDate(cutoffDate.getDate() - 14); // Using 14 days directly from your specification + + // Start a transaction to ensure data consistency + const result = await transaction(TempEmail.knex(), async (trx) => { + // First get the IDs of emails to be deleted + const emailsToDelete = await TempEmail.query(trx) + .select('id') + .where('created_at', '<', cutoffDate); + + const emailIds = emailsToDelete.map(email => email.id); + + // Delete associated messages first (foreign key constraint) + const deletedMessages = emailIds.length > 0 + ? await Message.query(trx) + .whereIn('temp_email_id', emailIds) + .where('created_at', '<', cutoffDate) + .delete() + : 0; + + // Then delete the temporary emails + const deletedTempEmails = await TempEmail.query(trx) + .where('created_at', '<', cutoffDate) + .delete(); + + return { + deletedMessages, + deletedTempEmails + }; + }); + + res.json(result); } catch (error) { - res.status(500).json({ error: error.message }); + console.error('Cleanup error:', error); + res.status(500).json({ + error: 'Failed to perform cleanup', + details: error.message + }); } });