campverse-backend / scripts /migrateInstitutionEmailDomains.js
CampVerse CI
Deploy backend from GitHub Actions
c904036
Raw History Blame Contribute Delete
2.9 kB
const mongoose = require('mongoose');
const Institution = require('../Models/Institution');
async function migrateInstitutionEmailDomains() {
try {
console.log('Starting institution email domains migration...');
// Connect to MongoDB
await mongoose.connect(
process.env.MONGO_URI || 'mongodb://localhost:27017/campverse',
);
console.log('Connected to MongoDB');
// Find all institutions
const institutions = await Institution.find({});
console.log(`Found ${institutions.length} institutions`);
// Group by email domain to find duplicates
const domainGroups = {};
institutions.forEach((inst) => {
const domain = inst.emailDomain;
if (!domainGroups[domain]) {
domainGroups[domain] = [];
}
domainGroups[domain].push(inst);
});
// Process duplicates
let duplicatesFound = 0;
for (const [domain, insts] of Object.entries(domainGroups)) {
if (insts.length > 1) {
duplicatesFound++;
console.log(`Found ${insts.length} institutions with domain: ${domain}`);
// Keep the first one, mark others for deletion
const [keep, ...remove] = insts;
console.log(`Keeping: ${keep.name} (${keep._id})`);
// Update users to reference the kept institution
const User = require('../Models/User');
for (const removeInst of remove) {
console.log(`Removing: ${removeInst.name} (${removeInst._id})`);
// Update users that reference the removed institution
await User.updateMany(
{ institutionId: removeInst._id },
{ institutionId: keep._id },
);
console.log(`Updated users from ${removeInst._id} to ${keep._id}`);
// Delete the duplicate institution
await Institution.findByIdAndDelete(removeInst._id);
}
}
}
if (duplicatesFound === 0) {
console.log('No duplicate institutions found');
} else {
console.log(`Processed ${duplicatesFound} duplicate domain groups`);
}
// Verify no duplicates remain
const remainingInstitutions = await Institution.find({});
const remainingDomains = remainingInstitutions.map(
(inst) => inst.emailDomain,
);
const uniqueDomains = new Set(remainingDomains);
if (remainingDomains.length === uniqueDomains.size) {
console.log('Migration complete - no duplicates remain');
} else {
console.log('Warning: Some duplicates may still exist');
}
console.log('Migration finished successfully');
} catch (error) {
console.error('Migration failed:', error);
process.exit(1);
} finally {
await mongoose.disconnect();
console.log('Disconnected from MongoDB');
}
}
// Run migration if called directly
if (require.main === module) {
migrateInstitutionEmailDomains();
}
module.exports = migrateInstitutionEmailDomains;