Files
kavehhn f04c797be6 Initial commit: teaching institution management API.
Express/MongoDB backend with JWT auth, RBAC, S3 uploads, notifications, and scheduled jobs.
2026-08-09 04:18:08 +02:00

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);