Express/MongoDB backend with JWT auth, RBAC, S3 uploads, notifications, and scheduled jobs.
96 lines
1.9 KiB
JavaScript
96 lines
1.9 KiB
JavaScript
// /components/courses/courseModel.js
|
|
|
|
const mongoose = require('mongoose');
|
|
|
|
const discountSchema = new mongoose.Schema({
|
|
percent: { type: Number, required: true, min: 0, max: 100 },
|
|
validFrom: { type: Date, required: true },
|
|
validTo: { type: Date, required: true },
|
|
isActive: { type: Boolean, default: true }
|
|
});
|
|
|
|
const offerSchema = new mongoose.Schema({
|
|
title: { type: String, required: true, trim: true },
|
|
description: { type: String, trim: true },
|
|
type: {
|
|
type: String,
|
|
enum: ['fullAdvancePayment', 'earlyBird', 'custom'],
|
|
required: true
|
|
},
|
|
percent: { type: Number, min: 0, max: 100 },
|
|
fixedAmount: { type: Number, min: 0 },
|
|
validFrom: { type: Date },
|
|
validTo: { type: Date },
|
|
isActive: { type: Boolean, default: true }
|
|
});
|
|
|
|
const courseSchema = new mongoose.Schema({
|
|
title: {
|
|
type: String,
|
|
required: true,
|
|
trim: true,
|
|
index: true
|
|
},
|
|
description: {
|
|
type: String,
|
|
trim: true
|
|
},
|
|
type: {
|
|
type: String,
|
|
enum: ['General', 'Private'],
|
|
required: true
|
|
},
|
|
price: {
|
|
type: Number,
|
|
required: true,
|
|
min: 0
|
|
},
|
|
rating: {
|
|
type: Number,
|
|
default: 0,
|
|
min: 0,
|
|
max: 5
|
|
},
|
|
isOfficial: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
/** When true, course appears on the public website */
|
|
showOnFrontend: {
|
|
type: Boolean,
|
|
default: true,
|
|
index: true
|
|
},
|
|
/** Number of sessions in the course */
|
|
sectionCount: {
|
|
type: Number,
|
|
default: 1,
|
|
min: 1
|
|
},
|
|
/** Hours per session */
|
|
hoursPerSection: {
|
|
type: Number,
|
|
default: 1.5,
|
|
min: 0
|
|
},
|
|
/** Bullet-point highlights shown on the frontend */
|
|
highlights: [{
|
|
type: String,
|
|
trim: true
|
|
}],
|
|
professor: {
|
|
type: mongoose.Schema.Types.ObjectId,
|
|
ref: 'Professor'
|
|
},
|
|
discounts: [discountSchema],
|
|
offers: [offerSchema],
|
|
capacity: {
|
|
type: Number,
|
|
default: 30
|
|
}
|
|
}, {
|
|
timestamps: true
|
|
});
|
|
|
|
module.exports = mongoose.model('Course', courseSchema);
|