Match students by name when national ID or phone is missing, parse Jalali dates, and allow sessions without a professor.
93 lines
1.5 KiB
JavaScript
93 lines
1.5 KiB
JavaScript
// /components/sessions/sessionModel.js
|
|
|
|
const mongoose = require('mongoose');
|
|
|
|
const attendanceRecordSchema = new mongoose.Schema({
|
|
user: {
|
|
type: mongoose.Schema.Types.ObjectId,
|
|
ref: 'User',
|
|
required: true
|
|
},
|
|
status: {
|
|
type: String,
|
|
enum: ['present', 'absent', 'late', 'excused'],
|
|
default: 'present'
|
|
},
|
|
note: {
|
|
type: String,
|
|
trim: true
|
|
},
|
|
recordedBy: {
|
|
type: mongoose.Schema.Types.ObjectId,
|
|
ref: 'User'
|
|
}
|
|
}, {
|
|
_id: false
|
|
});
|
|
|
|
const sessionSchema = new mongoose.Schema({
|
|
course: {
|
|
type: mongoose.Schema.Types.ObjectId,
|
|
ref: 'Course',
|
|
required: true,
|
|
index: true
|
|
},
|
|
class: {
|
|
type: mongoose.Schema.Types.ObjectId,
|
|
ref: 'Class',
|
|
required: true,
|
|
index: true
|
|
},
|
|
professor: {
|
|
type: mongoose.Schema.Types.ObjectId,
|
|
ref: 'Professor',
|
|
index: true
|
|
},
|
|
day: {
|
|
type: Date,
|
|
required: true,
|
|
index: true
|
|
},
|
|
startTime: {
|
|
type: String,
|
|
required: true,
|
|
trim: true
|
|
},
|
|
endTime: {
|
|
type: String,
|
|
required: true,
|
|
trim: true
|
|
},
|
|
place: {
|
|
type: String,
|
|
trim: true
|
|
},
|
|
topic: {
|
|
type: String,
|
|
trim: true
|
|
},
|
|
note: {
|
|
type: String,
|
|
trim: true,
|
|
maxlength: 5000
|
|
},
|
|
status: {
|
|
type: String,
|
|
enum: ['scheduled', 'held', 'cancelled'],
|
|
default: 'scheduled'
|
|
},
|
|
attendanceList: [attendanceRecordSchema],
|
|
reminderSentAt: {
|
|
type: Date,
|
|
default: null
|
|
},
|
|
adminNotes: {
|
|
type: [String],
|
|
default: []
|
|
}
|
|
}, {
|
|
timestamps: true
|
|
});
|
|
|
|
module.exports = mongoose.model('Session', sessionSchema);
|