feat: add /api/seed endpoint and refactor seed.js
This commit is contained in:
@@ -77,6 +77,22 @@ app.get('/api/health', (req, res) => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const seedDatabase = require('./seed');
|
||||||
|
const { successResponse, errorResponse } = require('./utils/apiResponse');
|
||||||
|
|
||||||
|
const handleSeedRequest = async (req, res) => {
|
||||||
|
try {
|
||||||
|
const result = await seedDatabase({ disconnectOnComplete: false });
|
||||||
|
return successResponse(res, 200, 'Database seeded successfully', result);
|
||||||
|
} catch (error) {
|
||||||
|
return errorResponse(res, 500, 'SEED_FAILED', error.message);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
app.post('/api/seed', handleSeedRequest);
|
||||||
|
app.get('/api/seed', handleSeedRequest);
|
||||||
|
|
||||||
|
|
||||||
app.use('/api/auth', authRoutes);
|
app.use('/api/auth', authRoutes);
|
||||||
app.use('/api/users', userRoutes);
|
app.use('/api/users', userRoutes);
|
||||||
app.use('/api/professors', professorRoutes);
|
app.use('/api/professors', professorRoutes);
|
||||||
|
|||||||
@@ -91,11 +91,16 @@ const defaultRoles = [
|
|||||||
}
|
}
|
||||||
];
|
];
|
||||||
|
|
||||||
const seedDatabase = async () => {
|
const seedDatabase = async ({ disconnectOnComplete = false } = {}) => {
|
||||||
try {
|
try {
|
||||||
console.log('Connecting to MongoDB...');
|
if (mongoose.connection.readyState !== 1) {
|
||||||
await mongoose.connect(config.MONGO_URI);
|
console.log('Connecting to MongoDB...');
|
||||||
console.log('Connected to MongoDB successfully.');
|
await mongoose.connect(config.MONGO_URI);
|
||||||
|
console.log('Connected to MongoDB successfully.');
|
||||||
|
}
|
||||||
|
|
||||||
|
let rolesCreatedCount = 0;
|
||||||
|
let rolesUpdatedCount = 0;
|
||||||
|
|
||||||
for (const roleDef of defaultRoles) {
|
for (const roleDef of defaultRoles) {
|
||||||
const existing = await Role.findOne({ name: roleDef.name });
|
const existing = await Role.findOne({ name: roleDef.name });
|
||||||
@@ -104,13 +109,16 @@ const seedDatabase = async () => {
|
|||||||
existing.permissions = roleDef.permissions;
|
existing.permissions = roleDef.permissions;
|
||||||
existing.isSystem = roleDef.isSystem;
|
existing.isSystem = roleDef.isSystem;
|
||||||
await existing.save();
|
await existing.save();
|
||||||
|
rolesUpdatedCount++;
|
||||||
console.log(`Updated existing role: ${roleDef.name}`);
|
console.log(`Updated existing role: ${roleDef.name}`);
|
||||||
} else {
|
} else {
|
||||||
await Role.create(roleDef);
|
await Role.create(roleDef);
|
||||||
|
rolesCreatedCount++;
|
||||||
console.log(`Created new role: ${roleDef.name}`);
|
console.log(`Created new role: ${roleDef.name}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let superAdminStatus = 'unchanged';
|
||||||
// Ensure SuperAdmin user exists
|
// Ensure SuperAdmin user exists
|
||||||
const superAdminRole = await Role.findOne({ name: 'SuperAdmin' });
|
const superAdminRole = await Role.findOne({ name: 'SuperAdmin' });
|
||||||
if (superAdminRole) {
|
if (superAdminRole) {
|
||||||
@@ -128,17 +136,34 @@ const seedDatabase = async () => {
|
|||||||
role: superAdminRole._id,
|
role: superAdminRole._id,
|
||||||
isActive: true
|
isActive: true
|
||||||
});
|
});
|
||||||
|
superAdminStatus = 'created';
|
||||||
console.log(`SuperAdmin user created (${config.SUPERADMIN_USERNAME}).`);
|
console.log(`SuperAdmin user created (${config.SUPERADMIN_USERNAME}).`);
|
||||||
|
} else {
|
||||||
|
superAdminStatus = 'already_exists';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
console.log('Database seeding completed successfully.');
|
console.log('Database seeding completed successfully.');
|
||||||
|
return {
|
||||||
|
success: true,
|
||||||
|
rolesCreatedCount,
|
||||||
|
rolesUpdatedCount,
|
||||||
|
superAdminStatus,
|
||||||
|
superAdminUsername: config.SUPERADMIN_USERNAME
|
||||||
|
};
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Database seeding failed:', error);
|
console.error('Database seeding failed:', error);
|
||||||
|
throw error;
|
||||||
} finally {
|
} finally {
|
||||||
await mongoose.disconnect();
|
if (disconnectOnComplete) {
|
||||||
console.log('Disconnected from MongoDB.');
|
await mongoose.disconnect();
|
||||||
|
console.log('Disconnected from MongoDB.');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
seedDatabase();
|
if (require.main === module) {
|
||||||
|
seedDatabase({ disconnectOnComplete: true });
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = seedDatabase;
|
||||||
|
|||||||
Reference in New Issue
Block a user