2weekmail/api/utils/mailbox_cleanup.js
2025-03-19 19:56:57 -05:00

50 lines
1.7 KiB
JavaScript

const fs = require('fs').promises;
const path = require('path');
const { models } = require(path.join(process.env.ROOT_PATH, "./db/db"));
const { Mailbox } = models;
const { format } = require('date-fns');
async function deleteExpiredMailboxes() {
try {
// Format current date for database comparison using date-fns
const now = format(new Date(), 'yyyy-MM-dd HH:mm:ss');
// First, get the list of mailboxes that will be deleted
const expiredMailboxes = await Mailbox.query()
.where('expires', '<', now)
.select(['username', 'domain']);
console.log(`Found ${expiredMailboxes.length} expired mailboxes to delete`);
// Delete the physical mailbox directories
for (const mailbox of expiredMailboxes) {
try {
const mailboxPath = path.join('/var/mail', mailbox.domain, mailbox.local_part || mailbox.username.split('@')[0]);
// Check if directory exists before attempting to delete
await fs.access(mailboxPath);
await fs.rm(mailboxPath, { recursive: true, force: true });
console.log(`Deleted physical mailbox at ${mailboxPath}`);
} catch (err) {
// If directory doesn't exist, just log and continue
console.log(`No physical mailbox found for ${mailbox.username}@${mailbox.domain} or error: ${err.message}`);
}
}
// Now delete from database
const deleted = await Mailbox.query()
.where('expires', '<', now)
.delete();
console.log(`Deleted ${deleted} expired mailbox records from database`);
return deleted;
} catch (error) {
console.error('Error deleting expired mailboxes:', error);
throw error;
}
}
module.exports = {
deleteExpiredMailboxes,
};