50 lines
1.7 KiB
JavaScript
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,
|
|
}; |