Files
gameno-api/seed.js
T

170 lines
5.1 KiB
JavaScript

// /seed.js
const mongoose = require('mongoose');
const config = require('./config/config');
const Role = require('./components/roles/roleModel');
const User = require('./components/users/userModel');
const { ALL_PERMISSIONS, PERMISSIONS } = require('./constants/permissions');
const bcrypt = require('bcryptjs');
const defaultRoles = [
{
name: 'SuperAdmin',
description: 'مدیر ارشد سیستم با دسترسی کامل به تمام بخش‌ها',
permissions: ALL_PERMISSIONS,
isSystem: true
},
{
name: 'Admin',
description: 'مدیر سیستم',
permissions: ALL_PERMISSIONS.filter(p => !p.startsWith('roles:')),
isSystem: true
},
{
name: 'Secretary',
description: 'منشی و مسئول ثبت‌نام، امور دانشجویان و پرداخت‌ها',
permissions: [
PERMISSIONS.USERS_CREATE,
PERMISSIONS.USERS_READ,
PERMISSIONS.USERS_UPDATE,
PERMISSIONS.USERS_SEARCH,
PERMISSIONS.USERS_ENROLL,
PERMISSIONS.CLASSES_READ,
PERMISSIONS.CLASSES_SEARCH,
PERMISSIONS.CLASSES_REGISTER_USERS,
PERMISSIONS.COURSES_READ,
PERMISSIONS.COURSES_SEARCH,
PERMISSIONS.SESSIONS_READ,
PERMISSIONS.SESSIONS_SEARCH,
PERMISSIONS.SESSIONS_ATTENDANCE,
PERMISSIONS.PAYMENTS_CREATE,
PERMISSIONS.PAYMENTS_READ,
PERMISSIONS.PAYMENTS_UPDATE,
PERMISSIONS.PAYMENTS_SEARCH,
PERMISSIONS.NOTIFICATIONS_CREATE,
PERMISSIONS.NOTIFICATIONS_READ,
PERMISSIONS.NOTIFICATIONS_SEARCH,
PERMISSIONS.NOTIFICATIONS_RETRY,
PERMISSIONS.CERTIFICATES_CREATE,
PERMISSIONS.CERTIFICATES_READ,
PERMISSIONS.CERTIFICATES_SEARCH,
PERMISSIONS.FILES_UPLOAD,
PERMISSIONS.FILES_READ,
PERMISSIONS.LOGS_READ,
PERMISSIONS.LOGS_SEARCH,
PERMISSIONS.CONTACT_INQUIRIES_READ,
PERMISSIONS.CONTACT_INQUIRIES_UPDATE
],
isSystem: true
},
{
name: 'User',
description: 'کاربر معمولی و دانشجو',
permissions: [
PERMISSIONS.COURSES_READ,
PERMISSIONS.COURSES_SEARCH,
PERMISSIONS.CLASSES_READ,
PERMISSIONS.CLASSES_SEARCH,
PERMISSIONS.SESSIONS_READ,
PERMISSIONS.SESSIONS_SEARCH,
PERMISSIONS.PAYMENTS_READ,
PERMISSIONS.NOTIFICATIONS_READ,
PERMISSIONS.CERTIFICATES_READ,
PERMISSIONS.FILES_READ
],
isSystem: true
},
{
name: 'Professor',
description: 'استاد مدرس دوره',
permissions: [
PERMISSIONS.COURSES_READ,
PERMISSIONS.COURSES_SEARCH,
PERMISSIONS.CLASSES_READ,
PERMISSIONS.CLASSES_SEARCH,
PERMISSIONS.SESSIONS_READ,
PERMISSIONS.SESSIONS_SEARCH,
PERMISSIONS.SESSIONS_ATTENDANCE,
PERMISSIONS.NOTIFICATIONS_READ,
PERMISSIONS.FILES_READ
],
isSystem: true
}
];
const seedDatabase = async ({ disconnectOnComplete = false } = {}) => {
try {
if (mongoose.connection.readyState !== 1) {
console.log('Connecting to MongoDB...');
await mongoose.connect(config.MONGO_URI);
console.log('Connected to MongoDB successfully.');
}
let rolesCreatedCount = 0;
let rolesUpdatedCount = 0;
for (const roleDef of defaultRoles) {
const existing = await Role.findOne({ name: roleDef.name });
if (existing) {
existing.description = roleDef.description;
existing.permissions = roleDef.permissions;
existing.isSystem = roleDef.isSystem;
await existing.save();
rolesUpdatedCount++;
console.log(`Updated existing role: ${roleDef.name}`);
} else {
await Role.create(roleDef);
rolesCreatedCount++;
console.log(`Created new role: ${roleDef.name}`);
}
}
let superAdminStatus = 'unchanged';
// Ensure SuperAdmin user exists
const superAdminRole = await Role.findOne({ name: 'SuperAdmin' });
if (superAdminRole) {
const adminUser = await User.findOne({ username: config.SUPERADMIN_USERNAME });
if (!adminUser) {
const passwordHash = await bcrypt.hash(config.SUPERADMIN_PASSWORD, 10);
await User.create({
name: 'مدیر',
surname: 'ارشد',
nationalId: config.SUPERADMIN_NATIONAL_ID,
phone: config.SUPERADMIN_PHONE,
email: config.SUPERADMIN_EMAIL,
username: config.SUPERADMIN_USERNAME,
passwordHash,
role: superAdminRole._id,
isActive: true
});
superAdminStatus = 'created';
console.log(`SuperAdmin user created (${config.SUPERADMIN_USERNAME}).`);
} else {
superAdminStatus = 'already_exists';
}
}
console.log('Database seeding completed successfully.');
return {
success: true,
rolesCreatedCount,
rolesUpdatedCount,
superAdminStatus,
superAdminUsername: config.SUPERADMIN_USERNAME
};
} catch (error) {
console.error('Database seeding failed:', error);
throw error;
} finally {
if (disconnectOnComplete) {
await mongoose.disconnect();
console.log('Disconnected from MongoDB.');
}
}
};
if (require.main === module) {
seedDatabase({ disconnectOnComplete: true });
}
module.exports = seedDatabase;