update
This commit is contained in:
271
models/index.js
Normal file
271
models/index.js
Normal file
@@ -0,0 +1,271 @@
|
||||
const { sequelize } = require('../config/database');
|
||||
|
||||
/**
|
||||
* Import all models
|
||||
*/
|
||||
// Group 1: System & Authorization
|
||||
const School = require('./School');
|
||||
const UsersAuth = require('./UsersAuth');
|
||||
const Role = require('./Role');
|
||||
const Permission = require('./Permission');
|
||||
const RolePermission = require('./RolePermission');
|
||||
const UserAssignment = require('./UserAssignment');
|
||||
|
||||
// Group 2: User Profiles
|
||||
const UserProfile = require('./UserProfile');
|
||||
const StudentDetail = require('./StudentDetail');
|
||||
const TeacherDetail = require('./TeacherDetail');
|
||||
const ParentStudentMap = require('./ParentStudentMap');
|
||||
const StaffContract = require('./StaffContract');
|
||||
|
||||
// Group 3: Academic Structure
|
||||
const AcademicYear = require('./AcademicYear');
|
||||
const Subject = require('./Subject');
|
||||
const Class = require('./Class');
|
||||
const ClassSchedule = require('./ClassSchedule');
|
||||
const Room = require('./Room');
|
||||
|
||||
// Group 3.1: Learning Content (NEW)
|
||||
const Chapter = require('./Chapter');
|
||||
const Lesson = require('./Lesson');
|
||||
const Game = require('./Game');
|
||||
|
||||
// Group 4: Attendance
|
||||
const AttendanceLog = require('./AttendanceLog');
|
||||
const AttendanceDaily = require('./AttendanceDaily');
|
||||
const LeaveRequest = require('./LeaveRequest');
|
||||
|
||||
// Group 5: Gradebook
|
||||
const GradeCategory = require('./GradeCategory');
|
||||
const GradeItem = require('./GradeItem');
|
||||
const Grade = require('./Grade');
|
||||
const GradeSummary = require('./GradeSummary');
|
||||
const GradeHistory = require('./GradeHistory');
|
||||
|
||||
// Group 6: Notifications
|
||||
const Notification = require('./Notification');
|
||||
const NotificationLog = require('./NotificationLog');
|
||||
const Message = require('./Message');
|
||||
const AuditLog = require('./AuditLog');
|
||||
|
||||
// Group 7: Subscription & Training
|
||||
const SubscriptionPlan = require('./SubscriptionPlan');
|
||||
const UserSubscription = require('./UserSubscription');
|
||||
const StaffTrainingAssignment = require('./StaffTrainingAssignment');
|
||||
const StaffAchievement = require('./StaffAchievement');
|
||||
const ParentAssignedTask = require('./ParentAssignedTask');
|
||||
|
||||
/**
|
||||
* Define relationships between models
|
||||
*/
|
||||
const setupRelationships = () => {
|
||||
// UsersAuth relationships
|
||||
UsersAuth.hasOne(UserProfile, { foreignKey: 'user_id', as: 'profile' });
|
||||
UsersAuth.hasMany(UserAssignment, { foreignKey: 'user_id', as: 'assignments' });
|
||||
|
||||
// UserProfile relationships
|
||||
UserProfile.belongsTo(UsersAuth, { foreignKey: 'user_id', as: 'auth' });
|
||||
UserProfile.belongsTo(School, { foreignKey: 'school_id', as: 'school' });
|
||||
UserProfile.hasOne(StudentDetail, { foreignKey: 'user_id', as: 'studentDetail' });
|
||||
UserProfile.hasOne(TeacherDetail, { foreignKey: 'user_id', as: 'teacherDetail' });
|
||||
|
||||
// School relationships
|
||||
School.hasMany(Class, { foreignKey: 'school_id', as: 'classes' });
|
||||
School.hasMany(Room, { foreignKey: 'school_id', as: 'rooms' });
|
||||
School.hasMany(UserAssignment, { foreignKey: 'school_id', as: 'assignments' });
|
||||
School.hasMany(AttendanceLog, { foreignKey: 'school_id', as: 'attendanceLogs' });
|
||||
|
||||
// Role & Permission relationships
|
||||
Role.belongsToMany(Permission, {
|
||||
through: RolePermission,
|
||||
foreignKey: 'role_id',
|
||||
otherKey: 'permission_id',
|
||||
as: 'permissions'
|
||||
});
|
||||
Permission.belongsToMany(Role, {
|
||||
through: RolePermission,
|
||||
foreignKey: 'permission_id',
|
||||
otherKey: 'role_id',
|
||||
as: 'roles'
|
||||
});
|
||||
|
||||
// UserAssignment relationships
|
||||
UserAssignment.belongsTo(UsersAuth, { foreignKey: 'user_id', as: 'user' });
|
||||
UserAssignment.belongsTo(Role, { foreignKey: 'role_id', as: 'role' });
|
||||
UserAssignment.belongsTo(School, { foreignKey: 'school_id', as: 'school' });
|
||||
UserAssignment.belongsTo(Class, { foreignKey: 'class_id', as: 'class' });
|
||||
|
||||
// StudentDetail relationships
|
||||
StudentDetail.belongsTo(UserProfile, {
|
||||
foreignKey: 'user_id',
|
||||
targetKey: 'user_id',
|
||||
as: 'profile'
|
||||
});
|
||||
StudentDetail.belongsTo(Class, { foreignKey: 'current_class_id', as: 'currentClass' });
|
||||
StudentDetail.belongsToMany(UserProfile, {
|
||||
through: ParentStudentMap,
|
||||
foreignKey: 'student_id',
|
||||
otherKey: 'parent_id',
|
||||
as: 'parents'
|
||||
});
|
||||
|
||||
// TeacherDetail relationships
|
||||
TeacherDetail.belongsTo(UserProfile, { foreignKey: 'user_id', as: 'profile' });
|
||||
TeacherDetail.hasMany(StaffContract, { foreignKey: 'teacher_id', as: 'contracts' });
|
||||
|
||||
// Class relationships
|
||||
Class.belongsTo(School, { foreignKey: 'school_id', as: 'school' });
|
||||
Class.belongsTo(AcademicYear, { foreignKey: 'academic_year_id', as: 'academicYear' });
|
||||
Class.belongsTo(TeacherDetail, { foreignKey: 'homeroom_teacher_id', as: 'homeroomTeacher' });
|
||||
Class.hasMany(StudentDetail, { foreignKey: 'current_class_id', as: 'students' });
|
||||
Class.hasMany(ClassSchedule, { foreignKey: 'class_id', as: 'schedules' });
|
||||
Class.hasMany(Grade, { foreignKey: 'class_id', as: 'grades' });
|
||||
|
||||
// ClassSchedule relationships
|
||||
ClassSchedule.belongsTo(Class, { foreignKey: 'class_id', as: 'class' });
|
||||
ClassSchedule.belongsTo(Subject, { foreignKey: 'subject_id', as: 'subject' });
|
||||
ClassSchedule.belongsTo(Room, { foreignKey: 'room_id', as: 'room' });
|
||||
ClassSchedule.belongsTo(TeacherDetail, { foreignKey: 'teacher_id', as: 'teacher' });
|
||||
|
||||
// Learning Content relationships (NEW)
|
||||
// Subject -> Chapter (1:N)
|
||||
Subject.hasMany(Chapter, { foreignKey: 'subject_id', as: 'chapters' });
|
||||
Chapter.belongsTo(Subject, { foreignKey: 'subject_id', as: 'subject' });
|
||||
|
||||
// Chapter -> Lesson (1:N)
|
||||
Chapter.hasMany(Lesson, { foreignKey: 'chapter_id', as: 'lessons' });
|
||||
Lesson.belongsTo(Chapter, { foreignKey: 'chapter_id', as: 'chapter' });
|
||||
|
||||
// Attendance relationships
|
||||
AttendanceLog.belongsTo(UsersAuth, { foreignKey: 'user_id', as: 'user' });
|
||||
AttendanceLog.belongsTo(School, { foreignKey: 'school_id', as: 'school' });
|
||||
|
||||
AttendanceDaily.belongsTo(UsersAuth, { foreignKey: 'user_id', as: 'user' });
|
||||
AttendanceDaily.belongsTo(School, { foreignKey: 'school_id', as: 'school' });
|
||||
AttendanceDaily.belongsTo(Class, { foreignKey: 'class_id', as: 'class' });
|
||||
|
||||
LeaveRequest.belongsTo(StudentDetail, { foreignKey: 'student_id', as: 'student' });
|
||||
LeaveRequest.belongsTo(UserProfile, { foreignKey: 'requested_by', as: 'requester' });
|
||||
LeaveRequest.belongsTo(TeacherDetail, { foreignKey: 'approved_by', as: 'approver' });
|
||||
|
||||
// Grade relationships
|
||||
GradeCategory.belongsTo(Subject, { foreignKey: 'subject_id', as: 'subject' });
|
||||
GradeCategory.hasMany(GradeItem, { foreignKey: 'category_id', as: 'items' });
|
||||
|
||||
GradeItem.belongsTo(GradeCategory, { foreignKey: 'category_id', as: 'category' });
|
||||
GradeItem.belongsTo(Class, { foreignKey: 'class_id', as: 'class' });
|
||||
GradeItem.hasMany(Grade, { foreignKey: 'grade_item_id', as: 'grades' });
|
||||
|
||||
Grade.belongsTo(GradeItem, { foreignKey: 'grade_item_id', as: 'gradeItem' });
|
||||
Grade.belongsTo(StudentDetail, { foreignKey: 'student_id', as: 'student' });
|
||||
Grade.belongsTo(Class, { foreignKey: 'class_id', as: 'class' });
|
||||
Grade.belongsTo(TeacherDetail, { foreignKey: 'graded_by', as: 'gradedBy' });
|
||||
Grade.hasMany(GradeHistory, { foreignKey: 'grade_id', as: 'history' });
|
||||
|
||||
GradeSummary.belongsTo(StudentDetail, { foreignKey: 'student_id', as: 'student' });
|
||||
GradeSummary.belongsTo(Subject, { foreignKey: 'subject_id', as: 'subject' });
|
||||
GradeSummary.belongsTo(AcademicYear, { foreignKey: 'academic_year_id', as: 'academicYear' });
|
||||
|
||||
// Notification relationships
|
||||
Notification.hasMany(NotificationLog, { foreignKey: 'notification_id', as: 'logs' });
|
||||
NotificationLog.belongsTo(Notification, { foreignKey: 'notification_id', as: 'notification' });
|
||||
NotificationLog.belongsTo(UsersAuth, { foreignKey: 'user_id', as: 'user' });
|
||||
|
||||
Message.belongsTo(UserProfile, { foreignKey: 'sender_id', as: 'sender' });
|
||||
Message.belongsTo(UserProfile, { foreignKey: 'recipient_id', as: 'recipient' });
|
||||
|
||||
// Subscription relationships
|
||||
SubscriptionPlan.hasMany(UserSubscription, { foreignKey: 'plan_id', as: 'subscriptions' });
|
||||
UserSubscription.belongsTo(SubscriptionPlan, { foreignKey: 'plan_id', as: 'plan' });
|
||||
UserSubscription.belongsTo(UsersAuth, { foreignKey: 'user_id', as: 'user' });
|
||||
|
||||
// Training relationships
|
||||
StaffTrainingAssignment.belongsTo(UsersAuth, { foreignKey: 'staff_id', as: 'staff' });
|
||||
StaffTrainingAssignment.belongsTo(UsersAuth, { foreignKey: 'assigned_by', as: 'assigner' });
|
||||
StaffTrainingAssignment.belongsTo(Subject, { foreignKey: 'subject_id', as: 'subject' });
|
||||
|
||||
StaffAchievement.belongsTo(UsersAuth, { foreignKey: 'staff_id', as: 'staff' });
|
||||
StaffAchievement.belongsTo(Subject, { foreignKey: 'course_id', as: 'course' });
|
||||
StaffAchievement.belongsTo(UsersAuth, { foreignKey: 'verified_by', as: 'verifier' });
|
||||
|
||||
// Parent assigned task relationships
|
||||
ParentAssignedTask.belongsTo(UsersAuth, { foreignKey: 'parent_id', as: 'parent' });
|
||||
ParentAssignedTask.belongsTo(StudentDetail, { foreignKey: 'student_id', as: 'student' });
|
||||
ParentAssignedTask.belongsTo(GradeItem, { foreignKey: 'grade_item_id', as: 'gradeItem' });
|
||||
|
||||
console.log('✅ Model relationships configured');
|
||||
};
|
||||
|
||||
/**
|
||||
* Sync database (only in development)
|
||||
*/
|
||||
const syncDatabase = async (options = {}) => {
|
||||
try {
|
||||
await sequelize.sync(options);
|
||||
console.log('✅ Database synchronized');
|
||||
} catch (error) {
|
||||
console.error('❌ Database sync failed:', error.message);
|
||||
throw error;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Export all models and utilities
|
||||
*/
|
||||
module.exports = {
|
||||
sequelize,
|
||||
setupRelationships,
|
||||
syncDatabase,
|
||||
|
||||
// Group 1: System & Authorization
|
||||
School,
|
||||
UsersAuth,
|
||||
Role,
|
||||
Permission,
|
||||
RolePermission,
|
||||
UserAssignment,
|
||||
|
||||
// Group 2: User Profiles
|
||||
UserProfile,
|
||||
StudentDetail,
|
||||
TeacherDetail,
|
||||
ParentStudentMap,
|
||||
StaffContract,
|
||||
|
||||
// Group 3: Academic Structure
|
||||
AcademicYear,
|
||||
Subject,
|
||||
Class,
|
||||
ClassSchedule,
|
||||
Room,
|
||||
|
||||
// Group 3.1: Learning Content (NEW)
|
||||
Chapter,
|
||||
Lesson,
|
||||
Game,
|
||||
|
||||
// Group 4: Attendance
|
||||
AttendanceLog,
|
||||
AttendanceDaily,
|
||||
LeaveRequest,
|
||||
|
||||
// Group 5: Gradebook
|
||||
GradeCategory,
|
||||
GradeItem,
|
||||
Grade,
|
||||
GradeSummary,
|
||||
GradeHistory,
|
||||
|
||||
// Group 6: Notifications
|
||||
Notification,
|
||||
NotificationLog,
|
||||
Message,
|
||||
AuditLog,
|
||||
|
||||
// Group 7: Subscription & Training
|
||||
SubscriptionPlan,
|
||||
UserSubscription,
|
||||
StaffTrainingAssignment,
|
||||
StaffAchievement,
|
||||
ParentAssignedTask,
|
||||
};
|
||||
Reference in New Issue
Block a user